File: otbGeometriesProjectionFilter.h

package info (click to toggle)
otb 6.6.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 47,068 kB
  • sloc: cpp: 316,755; ansic: 4,474; sh: 1,610; python: 497; perl: 92; makefile: 82; java: 72
file content (301 lines) | stat: -rw-r--r-- 11,098 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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
/*
 * 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 otbGeometriesProjectionFilter_h
#define otbGeometriesProjectionFilter_h

#include "otbGeometriesToGeometriesFilter.h"
#include "otbOGRGeometryWrapper.h"
#include "otbImageReference.h"
#include "itkTransform.h"
#include "otbGenericRSTransform.h"

#include "OTBProjectionExport.h"

class OGRCoordinateTransformation;

namespace otb
{

namespace internal
{
/**\ingroup Projection GeometriesFilters
 * Internal functor used to reproject an \c OGRGeometry.
 *
 * \internal
 * As \c OGRGeometry isn't open to new functions through a \em Visitor design
 * pattern, this class uses a nasty hack: it try to downcast to any possible
 * subtype of \c OGRGeometry.
 *
 * \since OTB v 3.14.0
 */
struct OTBProjection_EXPORT ReprojectTransformationFunctor
  {
  typedef OGRGeometry TransformedElementType;

  /**\ingroup Projection GeometriesFilters
   * Internal functor used to reproject a \c OGRGeometry: \em By-Copy transformation policy.
   * \since OTB v 3.14.0
   */
  struct ByCopy
    {
    ByCopy(ReprojectTransformationFunctor const& reprojector) : m_Reprojector(reprojector){}
    template <typename TGeometry>
      ogr::UniqueGeometryPtr operator()(TGeometry const* in) const;
  private:
    ReprojectTransformationFunctor const& m_Reprojector;
    };

  /**\ingroup Projection GeometriesFilters
   * Internal functor used to reproject a \c OGRGeometry: \em In-Place transformation policy.
   * \since OTB v 3.14.0
   */
  struct InPlace
    {
    InPlace(ReprojectTransformationFunctor const& reprojector) : m_Reprojector(reprojector){}
    template <typename TGeometry>
      void operator()(TGeometry * inout) const;
  private:
    ReprojectTransformationFunctor const& m_Reprojector;
    };


  ogr::UniqueGeometryPtr operator()(OGRGeometry const* in) const;
  void apply_inplace          (OGRGeometry * inout) const;

  typedef otb::GenericRSTransform<double, 2, 2>   InternalTransformType;
  typedef InternalTransformType::Pointer          InternalTransformPointerType;
  /**
   * Setter for the 1-point transformation functor.
   * \param[in] transform  transformation functor to apply on single points.
   * \throw None
   */
  void SetOnePointTransformation(InternalTransformPointerType transform);
private:
  /**
   * Transforms one single point thanks to \c m_Transform.
   * \param[in,out] g  point to transform
   * \throw Whatever is thrown by \c m_Transform::operator()
   */
  void do_transform(OGRPoint              & g) const;
  // void do_transform(OGRLinearRing         & g) const;
  /**
   * Transforms all the points from a line-string, thanks to \c m_Transform.
   * \param[in,out] g  line-string to transform
   * \throw Whatever is thrown by \c m_Transform::operator()
   */
  void do_transform(OGRLineString         & g) const;
  // void do_transform(OGRCurve              & g) const;
  /**
   * Transforms all the rings from a polygon.
   * \param[in,out] g  polygon to transform
   * \throw Whatever is thrown by \c m_Transform::operator()
   */
  void do_transform(OGRPolygon            & g) const;
#if 0
  void do_transform(OGRSurface            & g) const;
  void do_transform(OGRMultiLineString    & g) const;
  void do_transform(OGRMultiPoint         & g) const;
  void do_transform(OGRMultiPolygon       & g) const;
#endif
  /**
   * Transforms all the geometries from a geometreis collection.
   * \param[in,out] g  polygon to transform
   * \throw Whatever is thrown by \c m_Transform::operator()
   */
  void do_transform(OGRGeometryCollection & g) const;

  /** Transformation functor that operates on one single \c OGRPoint.
   */
  InternalTransformPointerType m_Transform;
  };
} // internal namespace


/**\ingroup Projection GeometriesFilters
 * \class GeometriesProjectionFilter
 * Projection filter for OGR geometries sets.
 * \since OTB v 3.14.0
 *
 * \param[in] InputGeometriesSet
 * \param[in] InputKeywordList if the \em InputGeometriesSet doesn't have a
 * projection reference (i.e. a \c OGRSpatialReference), this filter will use
 * the \em InputKeywordList to describe the positionning of the geometries set.
 *
 * \param[in,out] OutputGeometriesSet This set of geometries needs to be given to
 * the filter (in order to set the exact output file/OGR driver). However the
 * filter is in charge of filling the geometries set.
 * \param[in] OutputProjectionRef wkt description of the \c OGRSpatialReference
 * to project the \em InputGeometriesSet into.
 * \param[in] OutputKeywordList if no \em OutputProjectionRef is set, the
 * projection will be done according to the \em OutputKeywordList.
 *
 * \note Unlike \c VectorDataProjectionFilter, we have to explicitly set which
 * to use between projection reference or keyword list. There is no \em
 * MetaDataDictionary property.
 *
 * \note This filter does not support \em in-place transformation as the spatial
 * references of the new layer are expected to change.
 *
 * \ingroup OTBProjection
 */
class OTBProjection_EXPORT GeometriesProjectionFilter : public GeometriesToGeometriesFilter
{
public:
  /**\name Standard ITK typedefs */
  //@{
  typedef GeometriesProjectionFilter    Self;
  typedef GeometriesToGeometriesFilter  Superclass;
  typedef itk::SmartPointer<Self>       Pointer;
  typedef itk::SmartPointer<const Self> ConstPointer;
  //@}

  /**\name Standard macros */
  //@{
  /** Method for creation through the object factory. */
  itkNewMacro(Self);

  /** Run-time type information (and related methods). */
  itkTypeMacro(GeometriesProjectionFilter, GeometriesToGeometriesFilter);
  //@}

  /**\name I/O typedefs */
  //@{
  typedef Superclass::InputGeometriesType        InputGeometriesType;
  // typedef Superclass::InputGeometriesPointer  InputGeometriesPointer;
  typedef Superclass::OutputGeometriesType       OutputGeometriesType;
  // typedef Superclass::OutputGeometriesPointer OutputGeometriesPointer;
  typedef ogr::ImageReference<double>            ImageReference;

  //@}

private:
  /**
   * Hook used to determine the \c OGRSpatialReference when creating a new layer.
   * \param[in] source  source \c Layer for reference (in case it has relevant
   * information).
   * \return a \c OGRSpatialReference that matches the \em OutputProjectionRef
   * of the filter. It's up to the caller to take responsibility of the returned
   * object.
   */
  OGRSpatialReference* DoDefineNewLayerSpatialReference(ogr::Layer const& source) const override;
  /**
   * Hook that actually filters an OGR \c Layer.
   * \param[in]     source      Input layer
   * \param[in,out] destination Output layer
   *
   * Before forwarding the transformation to the \c m_TransformationFunctor,
   * this specialization finishes initializing the inner transformation functor.
   * Indeed some values depend on the current layer to reproject and thus, the
   * inner-filter working on \c ogr::DataSource cannot be globally configured
   * once and for all.
   */
  void DoProcessLayer(ogr::Layer const& source, ogr::Layer & destination) const override;
  /** Hook used to conclude the initialization phase.
   * Global \c ogr::DataSource settings for the \c m_Transform functor are
   * forwarded to the functor. \c ogr::Layer specific settings will be set at
   * the last moment from \c DoProcessLayer().
   */
  void DoFinalizeInitialization() override;
  
  /**
   * Hook used to define the fields of the new layer.
   * \param[in] source  source \c Layer -- for reference
   * \param[in,out] dest  destination \c Layer
   *
   * Just forwards the fields definition to the \c FieldTransformationPolicy
   * encapsuled in the \c TransformationFunctorDispatcherType.
   */
  void DoDefineNewLayerFields(ogr::Layer const& source, ogr::Layer & dest) const override;

protected:
  /** Default constructor. */
  GeometriesProjectionFilter();
  /** Destructor. */
  ~GeometriesProjectionFilter() override;

  /** Computes output information.
   * \post \c m_OutputProjectionRef contains all its related meta-data
   */
  void GenerateOutputInformation(void) override;

public:
  /**\name Image Reference (origin, spacing) */
  //@{
  void SetInputSpacing(ImageReference::SpacingType const& spacing);
  void SetOutputSpacing(ImageReference::SpacingType const& spacing);
  void SetInputOrigin(ImageReference::OriginType const& origin);
  void SetOutputOrigin(ImageReference::OriginType const& origin);
  //@}
  /**\name Keywords lists accessors and mutators */
  //@{
  itkGetMacro(InputKeywordList, ImageKeywordlist);
  void SetInputKeywordList(const ImageKeywordlist& kwl);

  itkGetMacro(OutputKeywordList, ImageKeywordlist);
  void SetOutputKeywordList(const ImageKeywordlist& kwl);
  //@}

  /**\name Projection references accessors and mutators
   * Projection references accessors and mutators.
   * As the Input Projection Reference comes from the Input Geometries set, it
   * can't be set independently.
   */
  //@{
  itkSetStringMacro(OutputProjectionRef);
  itkGetStringMacro(OutputProjectionRef);
  //@}

private:
  /**\name Functor definition */
  //@{
  typedef internal::ReprojectTransformationFunctor                TransformationFunctorType;
  typedef TransformationFunctorType::TransformedElementType       TransformedElementType;
  typedef TransformationFunctorDispatcher<TransformationFunctorType, TransformedElementType, FieldCopyTransformation>
                                                                  TransformationFunctorDispatcherType;

  TransformationFunctorDispatcherType             m_TransformationFunctor;
  //@}

  /**\name 1 Point Transformation definition */
  //@{
  typedef TransformationFunctorType::InternalTransformType        InternalTransformType;
  typedef TransformationFunctorType::InternalTransformPointerType InternalTransformPointerType;

  InternalTransformPointerType                    m_Transform;
  //@}

  /**\name Image Reference (origin, spacing) */
  //@{
  ImageReference                                  m_InputImageReference;
  ImageReference                                  m_OutputImageReference;
  //@}

  std::string                                     m_OutputProjectionRef; // in WKT format!
  ImageKeywordlist                                m_InputKeywordList;
  ImageKeywordlist                                m_OutputKeywordList;
};
} // end namespace otb

#ifndef OTB_MANUAL_INSTANTIATION
#include "otbGeometriesProjectionFilter.txx"
#endif

#endif // otbGeometriesProjectionFilter_h