File: otbLabelImageToOGRDataSourceFilter.h

package info (click to toggle)
otb 7.2.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,005,476 kB
  • sloc: cpp: 270,143; xml: 128,722; ansic: 4,367; sh: 1,768; python: 1,084; perl: 92; makefile: 72
file content (146 lines) | stat: -rw-r--r-- 4,907 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
145
146
/*
 * Copyright (C) 2005-2020 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"
#include <string>

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&) = delete;
  void operator=(const Self&) = delete;

  std::string m_FieldName;
  bool        m_Use8Connected;
};


} // end namespace otb

#ifndef OTB_MANUAL_INSTANTIATION
#include "otbLabelImageToOGRDataSourceFilter.hxx"
#endif

#endif