1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
/*=========================================================================
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
See OTBCopyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef otbLabelImageToOGRDataSourceFilter_h
#define otbLabelImageToOGRDataSourceFilter_h
#include "itkProcessObject.h"
#include "otbOGRDataSourceWrapper.h"
namespace otb
{
/** \class LabelImageToOGRDataSourceFilter
* this class uses \c GDALPolygonize() method to transform a Label image into
* a "memory" \c OGRDataSource. The layer in the DataSource is named "Layer".
* Each Feature of the layer has a Integer Field which name is specified by \c SetFieldName() (default is "DN").
* Label of the input image are written into this field.
* An optional input mask can be used to exclude pixels from vectorization process.
* All pixels with a value of 0 in the input mask image will not be suitable for vectorization.
* \note The Use8Connected parameter can be turn on and it will be used in \c GDALPolygonize(). But be carreful, it
* can create cross polygons !
* \note It is a non-streamed version.
* \ingroup OBIA
*
*
* \ingroup OTBConversion
*/
template <class TInputImage>
class ITK_EXPORT LabelImageToOGRDataSourceFilter :
public itk::ProcessObject
{
public:
/** typedef for the classes standards. */
typedef LabelImageToOGRDataSourceFilter Self;
typedef itk::ProcessObject Superclass;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
/** Method for management of the object factory. */
itkNewMacro(Self);
/** Return the name of the class. */
itkTypeMacro(LabelImageToOGRDataSourceFilter, ProcessObject);
/** Definition of the input image */
typedef TInputImage InputImageType;
typedef typename InputImageType::PixelType InputPixelType;
typedef typename InputImageType::IndexType InputIndexType;
typedef typename InputImageType::SizeType SizeType;
typedef typename InputImageType::RegionType RegionType;
typedef typename InputImageType::SpacingType SpacingType;
typedef typename InputImageType::PointType OriginType;
typedef typename InputImageType::IndexType IndexType;
typedef ogr::DataSource OGRDataSourceType;
typedef typename OGRDataSourceType::Pointer OGRDataSourcePointerType;
typedef ogr::Layer OGRLayerType;
typedef itk::ProcessObject::DataObjectPointerArraySizeType DataObjectPointerArraySizeType;
/** Set/Get the input image of this process object. */
using Superclass::SetInput;
virtual void SetInput(const InputImageType *input);
virtual const InputImageType * GetInput(void);
/** Set the input mask image.
* All pixels in the mask with a value of 0 will not be considered
* suitable for vectorization.
*/
virtual void SetInputMask(const InputImageType *input);
virtual const InputImageType * GetInputMask(void);
/** Set the Field Name in which labels will be written. (default is "DN")
* A field "FieldName" of type integer is created in the output memory layer.
*/
itkSetMacro(FieldName, std::string);
/**
* Return the Field name in which labels have been written.
*/
itkGetMacro(FieldName, std::string);
/**
* Set the value of 8-connected neighborhood option used in \c GDALPolygonize
*/
itkSetMacro(Use8Connected, bool);
/**
* Get the value of 8-connected neighborhood option used in \c GDALPolygonize
*/
itkGetMacro(Use8Connected, bool);
/**
* Get the output \c ogr::DataSource which is a "memory" datasource.
*/
const OGRDataSourceType * GetOutput();
protected:
LabelImageToOGRDataSourceFilter();
~LabelImageToOGRDataSourceFilter() ITK_OVERRIDE {}
void GenerateInputRequestedRegion() ITK_OVERRIDE;
/** Generate Data method*/
void GenerateData() ITK_OVERRIDE;
/** DataObject pointer */
typedef itk::DataObject::Pointer DataObjectPointer;
DataObjectPointer MakeOutput(DataObjectPointerArraySizeType idx) ITK_OVERRIDE;
using Superclass::MakeOutput;
private:
LabelImageToOGRDataSourceFilter(const Self &); //purposely not implemented
void operator =(const Self&); //purposely not implemented
std::string m_FieldName;
bool m_Use8Connected;
};
} // end namespace otb
#ifndef OTB_MANUAL_INSTANTIATION
#include "otbLabelImageToOGRDataSourceFilter.txx"
#endif
#endif
|