File: otbLabelImageToOGRDataSourceFilter.h

package info (click to toggle)
otb 5.8.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 38,496 kB
  • ctags: 40,282
  • sloc: cpp: 306,573; ansic: 3,575; python: 450; sh: 214; perl: 74; java: 72; makefile: 70
file content (144 lines) | stat: -rw-r--r-- 4,892 bytes parent folder | download
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