diff --git a/Code/Projections/otbVectorDataProjectionFilter.h b/Code/Projections/otbVectorDataProjectionFilter.h index 14be6769d6456e43a318778a5d15a79a05bae487..15dac61d638f6bf24ac2dc870f0a31ebb059ec14 100644 --- a/Code/Projections/otbVectorDataProjectionFilter.h +++ b/Code/Projections/otbVectorDataProjectionFilter.h @@ -15,49 +15,80 @@ PURPOSE. See the above copyright notices for more information. =========================================================================*/ -#ifndef __otbImageToEnvelopeVectorDataFilter_h -#define __otbImageToEnvelopeVectorDataFilter_h +#ifndef __otbVectorDataProjectionFilter_h +#define __otbVectorDataProjectionFilter_h -#include "otbVectorDataSource.h" +#include "otbVectorDataToVectorDataFilter.h" +#include "itkTransform.h" #include "otbGenericRSTransform.h" #include "otbImageKeywordlist.h" namespace otb { -/** \class ImageToEnvelopeVectorDataFilter - * \brief Build a vector data containing the polygon of the image envelope +/** \class VectorDataProjectionFilter + * \brief Reproject vector data in a different coordinate system + * + * This class is used to reproject vector data into a different coordinate system. + * the input and output coordinate system can be a map projection, a raw image from a + * sensor (the sensor model will be used), or the local coordinate system of an image. + * + * This filter works on otb::VectorData as input and output. + * + * The process goes as follow: + * - offset/scaling of the input coordinates + * - transform to get the data in geographic coordinates (lon/lat) + * - transform from geographic coordinates + * - offset/scaling of the output coordinates + * + * Each of this step is optional and would default to an identity transform if nothing + * is specified. + * + * The offset/scaling steps are necessary only when working with the local coordinate + * system of the image (origin on the top left). The value need to be provided by the + * SetInputSpacing, SetInputOrigin, SetOutputSpacing and SetOutputOrigin methods. + * + * The two transforms derived from itk::Transform and will be instanciated as + * otb::GenericMapProjection or otb::InverseSensorModel or otb::ForwardSensorModel + * (according to the available information). * * \ingroup VectorDataFilter * \ingroup Projection * + * \example Projections/VectorDataProjectionExample.cxx + * */ -template <class TInputImage, class TOutputVectorData> -class ITK_EXPORT ImageToEnvelopeVectorDataFilter : - public otb::VectorDataSource<TOutputVectorData> +template <class TInputVectorData, class TOutputVectorData> +class ITK_EXPORT VectorDataProjectionFilter : + public otb::VectorDataToVectorDataFilter<TInputVectorData, TOutputVectorData> { public: /** Standard class typedefs. */ - typedef ImageToEnvelopeVectorDataFilter Self; - typedef otb::VectorDataSource<TOutputVectorData> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; + typedef VectorDataProjectionFilter Self; + typedef otb::VectorDataToVectorDataFilter<TInputVectorData, TOutputVectorData> Superclass; + typedef itk::SmartPointer<Self> Pointer; + typedef itk::SmartPointer<const Self> ConstPointer; - typedef TInputImage InputImageType; - typedef TOutputVectorData OutputVectorDataType; - typedef typename TInputImage::ConstPointer InputImagePointer; - typedef typename TOutputVectorData::Pointer OutputVectorDataPointer; + typedef TInputVectorData InputVectorDataType; + typedef TOutputVectorData OutputVectorDataType; + typedef typename TInputVectorData::ConstPointer InputVectorDataPointer; + typedef typename TOutputVectorData::Pointer OutputVectorDataPointer; /** Some typedefs. */ - typedef otb::GenericRSTransform<double, 2, 2> InternalTransformType; - typedef typename InternalTransformType::Pointer InternalTransformPointerType; - - typedef typename OutputVectorDataType - ::DataNodeType OutputDataNodeType; - typedef typename OutputVectorDataType - ::DataNodePointerType OutputDataNodePointerType; + typedef itk::Transform<double, 2, 2> GenericTransformType; + typedef typename GenericTransformType::Pointer GenericTransformPointerType; +// typedef otb::CompositeTransform<GenericTransformType, GenericTransformType, double, 2, 2> InternalTransformType; + typedef otb::GenericRSTransform<double, 2, 2> InternalTransformType; + typedef typename InternalTransformType::Pointer InternalTransformPointerType; + + typedef itk::Vector<double, 2> SpacingType; + typedef itk::Point<double, 2> OriginType; + + typedef typename InputVectorDataType::DataNodePointerType InputDataNodePointerType; + typedef typename OutputVectorDataType::DataNodeType OutputDataNodeType; + typedef typename OutputVectorDataType::DataNodePointerType OutputDataNodePointerType; typedef typename OutputVectorDataType::DataTreePointerType OutputDataTreePointerType; typedef typename InputVectorDataType::DataTreeType::TreeNodeType InputInternalTreeNodeType; @@ -71,6 +102,8 @@ public: typedef typename OutputDataNodeType::LinePointerType LinePointerType; typedef typename OutputDataNodeType::PolygonType PolygonType; + typedef typename OutputDataNodeType::PolygonConstPointerType PolygonConstPointerType; + typedef typename OutputDataNodeType::PolygonPointerType PolygonPointerType; typedef typename OutputDataNodeType::PolygonListType PolygonListType; typedef typename OutputDataNodeType::PolygonListConstPointerType PolygonListConstPointerType; @@ -80,9 +113,12 @@ public: itkNewMacro(Self); /** Run-time type information (and related methods). */ - itkTypeMacro(ImageToEnvelopeVectorDataFilter, VectorDataSource); + itkTypeMacro(VectorDataProjectionFilter, VectorDataToVectorDataFilter); + + /** Set/Get for input and output projections. */ + itkSetStringMacro(InputProjectionRef); + itkGetStringMacro(InputProjectionRef); - /** Set/Get output projection (default is WGS84) */ itkSetStringMacro(OutputProjectionRef); itkGetStringMacro(OutputProjectionRef); @@ -92,28 +128,94 @@ public: itkSetMacro(AverageElevation, double); itkGetMacro(AverageElevation, double); + itkGetMacro(InputKeywordList, ImageKeywordlist); + void SetInputKeywordList(ImageKeywordlist kwl) + { + this->m_InputKeywordList = kwl; + this->Modified(); + } + + itkGetMacro(OutputKeywordList, ImageKeywordlist); + void SetOutputKeywordList(ImageKeywordlist kwl) + { + this->m_OutputKeywordList = kwl; + this->Modified(); + } + + /** Set the origin of the vector data. + * \sa GetOrigin() */ + itkSetMacro(InputOrigin, OriginType); + virtual void SetInputOrigin(const double origin[2]); + virtual void SetInputOrigin(const float origin[2]); + + itkGetConstReferenceMacro(InputOrigin, OriginType); + + /** Set the spacing (size of a pixel) of the vector data. + * \sa GetSpacing() */ + virtual void SetInputSpacing(const SpacingType& spacing); + virtual void SetInputSpacing(const double spacing[2]); + virtual void SetInputSpacing(const float spacing[2]); + + itkGetConstReferenceMacro(InputSpacing, SpacingType); + + /** Set the origin of the vector data. + * \sa GetOrigin() */ + itkSetMacro(OutputOrigin, OriginType); + virtual void SetOutputOrigin(const double origin[2]); + virtual void SetOutputOrigin(const float origin[2]); + + itkGetConstReferenceMacro(OutputOrigin, OriginType); + + /** Set the spacing (size of a pixel) of the vector data. + * \sa GetSpacing() */ + virtual void SetOutputSpacing(const SpacingType& spacing); + virtual void SetOutputSpacing(const double spacing[2]); + virtual void SetOutputSpacing(const float spacing[2]); + + itkGetConstReferenceMacro(OutputSpacing, SpacingType); + protected: - ImageToEnvelopeVectorDataFilter(); - virtual ~ImageToEnvelopeVectorDataFilter() {} + VectorDataProjectionFilter(); + virtual ~VectorDataProjectionFilter() {} - void GenerateOutputInformation(void); + PointType ReprojectPoint(PointType point) const; + LinePointerType ReprojectLine(LinePointerType line) const; + PolygonPointerType ReprojectPolygon(PolygonPointerType polygon) const; + PolygonListPointerType ReprojectPolygonList(PolygonListPointerType polygonList) const; + void InstanciateTransform(void); + + void GenerateOutputInformation(void); void GenerateData(void); + void ProcessNode(InputInternalTreeNodeType * source, OutputInternalTreeNodeType * destination); + private: - ImageToEnvelopeVectorDataFilter(const Self &); //purposely not implemented + VectorDataProjectionFilter(const Self &); //purposely not implemented void operator =(const Self&); //purposely not implemented InternalTransformPointerType m_Transform; + GenericTransformPointerType m_InputTransform; + GenericTransformPointerType m_OutputTransform; + std::string m_InputProjectionRef; std::string m_OutputProjectionRef; - std::string m_DEMDirectory; - double m_AverageElevation; + ImageKeywordlist m_InputKeywordList; + ImageKeywordlist m_OutputKeywordList; + + std::string m_DEMDirectory; + double m_AverageElevation; + + SpacingType m_InputSpacing; + OriginType m_InputOrigin; + SpacingType m_OutputSpacing; + OriginType m_OutputOrigin; + }; } // end namespace otb #ifndef OTB_MANUAL_INSTANTIATION -#include "otbImageToEnvelopeVectorDataFilter.txx" +#include "otbVectorDataProjectionFilter.txx" #endif #endif