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 145 146 147
|
/*
* Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
*
* This file is part of Orfeo Toolbox
*
* https://www.orfeo-toolbox.org/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#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() override {}
void GenerateInputRequestedRegion() override;
/** Generate Data method*/
void GenerateData() override;
/** DataObject pointer */
typedef itk::DataObject::Pointer DataObjectPointer;
DataObjectPointer MakeOutput(DataObjectPointerArraySizeType idx) 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
|