From 269bcbeb06875cc11a99b34202f5eeb0c8c5bb57 Mon Sep 17 00:00:00 2001 From: Manuel Grizonnet <manuel.grizonnet@cnes.fr> Date: Fri, 28 Aug 2009 17:26:32 +0200 Subject: [PATCH] remove OGRIOFunctor class --- Code/IO/otbOGRIOFunctor.h | 106 ----- Code/IO/otbOGRIOFunctor.txx | 873 ------------------------------------ 2 files changed, 979 deletions(-) delete mode 100644 Code/IO/otbOGRIOFunctor.h delete mode 100644 Code/IO/otbOGRIOFunctor.txx diff --git a/Code/IO/otbOGRIOFunctor.h b/Code/IO/otbOGRIOFunctor.h deleted file mode 100644 index ac31dc4fab..0000000000 --- a/Code/IO/otbOGRIOFunctor.h +++ /dev/null @@ -1,106 +0,0 @@ -/*========================================================================= - -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 __otbOGRIOFunctor_h -#define __otbOGRIOFunctor_h - -#include <vector> - -//TODO change this include have to define from what inherate this class -//#include "otbPolyLineParametricPathWithValue.h" //for vcl_abs -#include "ogrsf_frmts.h" -#include "otbVectorData.h" - -namespace otb -{ - -namespace Functor -{ - -/** \class OGRIOFunctor - * \brief This class IO OGR - * - */ -template <class TVectorData > -class OGRIOFunctor -{ -public: - /** Template parameters typedefs */ - /** Data typedef */ - typedef TVectorData VectorDataType; - typedef typename VectorDataType::DataTreeType DataTreeType; - typedef typename DataTreeType::TreeNodeType InternalTreeNodeType; - typedef typename InternalTreeNodeType::ChildrenListType ChildrenListType; - typedef typename DataTreeType::Pointer DataTreePointerType; - typedef typename DataTreeType::ConstPointer DataTreeConstPointerType; - typedef typename VectorDataType::DataNodeType DataNodeType; - typedef typename DataNodeType::Pointer DataNodePointerType; - typedef typename DataNodeType::PointType PointType; - typedef typename DataNodeType::LineType LineType; - typedef typename LineType::VertexListType VertexListType; - typedef typename VertexListType::ConstPointer VertexListConstPointerType; - typedef typename LineType::Pointer LinePointerType; - typedef typename DataNodeType::PolygonType PolygonType; - typedef typename PolygonType::Pointer PolygonPointerType; - typedef typename DataNodeType::PolygonListType PolygonListType; - typedef typename PolygonListType::Pointer PolygonListPointerType; - typedef typename VectorDataType::Pointer VectorDataPointerType; - typedef typename VectorDataType::ConstPointer VectorDataConstPointerType; - //typedef typename Superclass::SpacingType SpacingType; - //typedef typename Superclass::PointType OriginType; - - /** Run-time type information (and related methods). */ - itkTypeMacro(OGRIOFunctor, 0); - - /** - * \param labelObject the label object to vectorize - * \return The vectorized label object as a polygon. - */ - //inline PolygonPointerType operator()(const LabelObjectType * labelObject); - /** Conversion tools */ - - inline DataNodePointerType ConvertGeometryToPointNode(const OGRGeometry * ogrGeometry) const; - - inline DataNodePointerType ConvertGeometryToLineNode(const OGRGeometry * ogrGeometry) const; - - inline DataNodePointerType ConvertGeometryToPolygonNode(const OGRGeometry * ogrGeometry) const; - - inline void ConvertOGRLayerToDataTreeNode (OGRLayer * layer, InternalTreeNodeType * documentPtr); - /** end conversion tools */ - - unsigned int ProcessNodeWrite(InternalTreeNodeType * source, OGRDataSource * m_DataSource, OGRGeometryCollection * ogrCollection, OGRLayer * ogrCurrentLayer, OGRSpatialReference * oSRS); - - OGRIOFunctor():m_Kept(-1) - {}; - ~OGRIOFunctor() {}; - - private: - /** Number of layer in the Tree*/ - unsigned int m_Kept; -}; // end class OGRIOFunctor - -} // end namespace Functor - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbOGRIOFunctor.txx" -#endif - -#endif - - diff --git a/Code/IO/otbOGRIOFunctor.txx b/Code/IO/otbOGRIOFunctor.txx deleted file mode 100644 index 741e90395e..0000000000 --- a/Code/IO/otbOGRIOFunctor.txx +++ /dev/null @@ -1,873 +0,0 @@ -/*========================================================================= - -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 __otbOGRIOFunctor_txx -#define __otbOGRIOFunctor_txx - -#include "itkTimeProbe.h" - -#include "otbOGRIOFunctor.h" - - - -namespace otb -{ -namespace Functor -{ - -template<class TVectorData> -inline typename OGRIOFunctor<TVectorData> -::DataNodePointerType -OGRIOFunctor<TVectorData> -::ConvertGeometryToPointNode(const OGRGeometry * ogrGeometry) const -{ - OGRPoint * ogrPoint = (OGRPoint *) ogrGeometry; - - if (ogrPoint == NULL) - { - itkGenericExceptionMacro(<<"Failed to convert OGRGeometry to OGRPoint"); - } - - PointType otbPoint; - otbPoint.Fill(0); - otbPoint[0] = static_cast<typename DataNodeType::PrecisionType>(ogrPoint->getX()); - otbPoint[1] = static_cast<typename DataNodeType::PrecisionType>(ogrPoint->getY()); - - if (DataNodeType::Dimension > 2) - { - if (PointType::PointDimension != 3) - { - itkGenericExceptionMacro(<<"OTB vector data can't contain the OGR information (2D instead of 2.5D)"); - } - otbPoint[2]=static_cast<typename DataNodeType::PrecisionType>(ogrPoint->getZ()); - } - - DataNodePointerType node = DataNodeType::New(); - node->SetPoint(otbPoint); - return node; -} - -template<class TVectorData> -inline typename OGRIOFunctor<TVectorData> -::DataNodePointerType -OGRIOFunctor<TVectorData> -::ConvertGeometryToLineNode(const OGRGeometry * ogrGeometry) const -{ - OGRLineString * ogrLine = (OGRLineString *)ogrGeometry; - - if (ogrLine == NULL) - { - itkGenericExceptionMacro(<<"Failed to convert OGRGeometry to OGRLine"); - } - - LinePointerType line = LineType::New(); - - OGRPoint * ogrTmpPoint = new OGRPoint(); - - for (int pIndex = 0;pIndex<ogrLine->getNumPoints();++pIndex) - { - - ogrLine->getPoint(pIndex,ogrTmpPoint); - - typename LineType::VertexType vertex; - - vertex[0] = ogrTmpPoint->getX(); - vertex[1] = ogrTmpPoint->getY(); - - if (DataNodeType::Dimension > 2) - { - if (LineType::VertexType::PointDimension != 3) - { - itkGenericExceptionMacro(<<"OTB vector data can't contain the OGR information (2D instead of 2.5D)"); - } - vertex[2]= ogrTmpPoint->getZ(); - } - - line->AddVertex(vertex); - } - delete ogrTmpPoint; - - DataNodePointerType node = DataNodeType::New(); - node->SetLine(line); - - return node; -} - -template<class TVectorData> -inline typename OGRIOFunctor<TVectorData> -::DataNodePointerType -OGRIOFunctor<TVectorData> -::ConvertGeometryToPolygonNode(const OGRGeometry * ogrGeometry) const -{ - OGRPolygon * ogrPolygon = (OGRPolygon *)ogrGeometry; - - if (ogrPolygon == NULL) - { - itkGenericExceptionMacro(<<"Failed to convert OGRGeometry to OGRPolygon"); - } - - OGRPoint * ogrTmpPoint = new OGRPoint(); - - OGRLinearRing * ogrRing = ogrPolygon->getExteriorRing(); - - PolygonPointerType extRing = PolygonType::New(); - - for (int pIndex = 0;pIndex<ogrRing->getNumPoints();++pIndex) - { - ogrRing->getPoint(pIndex,ogrTmpPoint); - typename PolygonType::VertexType vertex; - vertex[0] = ogrTmpPoint->getX(); - vertex[1] = ogrTmpPoint->getY(); - - if (DataNodeType::Dimension > 2) - { - if (PolygonType::VertexType::PointDimension != 3) - { - itkGenericExceptionMacro(<<"OTB vector data can't contain the OGR information (2D instead of 2.5D)"); - } - vertex[2]= ogrTmpPoint->getZ(); - } - - extRing->AddVertex(vertex); - } - - PolygonListPointerType intRings = PolygonListType::New(); - - for (int intRingIndex = 0;intRingIndex<ogrPolygon->getNumInteriorRings();++intRingIndex) - { - PolygonPointerType ring = PolygonType::New(); - ogrRing = ogrPolygon->getInteriorRing(intRingIndex); - for (int pIndex = 0;pIndex<ogrRing->getNumPoints();++pIndex) - { - ogrRing->getPoint(pIndex,ogrTmpPoint); - typename PolygonType::VertexType vertex; - - vertex[0] = ogrTmpPoint->getX(); - vertex[1] = ogrTmpPoint->getY(); - if (DataNodeType::Dimension > 2) - { - if (PolygonType::VertexType::PointDimension != 3) - { - itkGenericExceptionMacro(<<"OTB vector data can't contain the OGR information (2D instead of 2.5D)"); - } - vertex[2]= ogrTmpPoint->getZ(); - } - ring->AddVertex(vertex); - } - intRings->PushBack(ring); - } - - delete ogrTmpPoint; - - DataNodePointerType node = DataNodeType::New(); - node->SetPolygonExteriorRing(extRing); - node->SetPolygonInteriorRings(intRings); - - return node; -} - -template<class TVectorData> -inline void OGRIOFunctor<TVectorData> -::ConvertOGRLayerToDataTreeNode (OGRLayer * layer, InternalTreeNodeType * documentPtr) -{ - /** Temporary pointer to store the feature */ - OGRFeature * feature; - - layer->ResetReading(); - - unsigned int counter = 0; - itk::TimeProbe chrono; - - while ((feature = layer->GetNextFeature())!=NULL) - { - chrono.Start(); - - - typename InternalTreeNodeType::Pointer folderPtr = documentPtr;//TODO: clean references to folder and replace by documentPtr - - // A pointer to the current multi-geometry - typename InternalTreeNodeType::Pointer multiPtr; - - /** Temporary geometry container */ - OGRGeometry * geometry = feature->GetGeometryRef(); - - if (geometry != NULL) - { - otb::VectorDataKeywordlist kwl; - for (int fieldNum=0; fieldNum< feature->GetFieldCount(); ++fieldNum) - { - if (feature->IsFieldSet(fieldNum)) - { - kwl.AddField(feature->GetFieldDefnRef(fieldNum), feature->GetRawFieldRef(fieldNum)); - } - } - -// Functor::OGRIOFunctor<VectorDataType> IOFunctuor; - - switch (geometry->getGeometryType()) - { - case wkbPoint: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - - newNode->Set(ConvertGeometryToPointNode(geometry)); - //Reach the DataNode inside the tree node - itk::MetaDataDictionary& dict = newNode->Get()->GetMetaDataDictionary(); - itk::EncapsulateMetaData< VectorDataKeywordlist >(dict, - MetaDataKey::VectorDataKeywordlistKey, - kwl); - folderPtr->AddChild(newNode); - break; - } - case wkbPoint25D: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPointNode(geometry)); - //Reach the DataNode inside the tree node - itk::MetaDataDictionary& dict = newNode->Get()->GetMetaDataDictionary(); - itk::EncapsulateMetaData< VectorDataKeywordlist >(dict, - MetaDataKey::VectorDataKeywordlistKey, - kwl); - folderPtr->AddChild(newNode); - break; - } - case wkbLineString: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToLineNode(geometry)); - //Reach the DataNode inside the tree node - itk::MetaDataDictionary& dict = newNode->Get()->GetMetaDataDictionary(); - itk::EncapsulateMetaData< VectorDataKeywordlist >(dict, - MetaDataKey::VectorDataKeywordlistKey, - kwl); - folderPtr->AddChild(newNode); - break; - } - case wkbLineString25D: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToLineNode(geometry)); - //Reach the DataNode inside the tree node - itk::MetaDataDictionary& dict = newNode->Get()->GetMetaDataDictionary(); - itk::EncapsulateMetaData< VectorDataKeywordlist >(dict, - MetaDataKey::VectorDataKeywordlistKey, - kwl); - folderPtr->AddChild(newNode); - break; - } - case wkbPolygon: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPolygonNode(geometry)); - //Reach the DataNode inside the tree node - itk::MetaDataDictionary& dict = newNode->Get()->GetMetaDataDictionary(); - itk::EncapsulateMetaData< VectorDataKeywordlist >(dict, - MetaDataKey::VectorDataKeywordlistKey, - kwl); - folderPtr->AddChild(newNode); - break; - } - case wkbPolygon25D: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPolygonNode(geometry)); - //Reach the DataNode inside the tree node - itk::MetaDataDictionary& dict = newNode->Get()->GetMetaDataDictionary(); - itk::EncapsulateMetaData< VectorDataKeywordlist >(dict, - MetaDataKey::VectorDataKeywordlistKey, - kwl); - folderPtr->AddChild(newNode); - break; - } - case wkbMultiPoint: - { - - DataNodePointerType multi = DataNodeType::New(); - multi->SetNodeType(FEATURE_MULTIPOINT); - multiPtr = InternalTreeNodeType::New(); - multiPtr->Set(multi); - folderPtr->AddChild(multiPtr); - - OGRMultiPoint * ogrMulti = (OGRMultiPoint *) geometry; - - for (int geoIndex = 0;geoIndex<ogrMulti->getNumGeometries();++geoIndex) - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - } - break; - } - case wkbMultiPoint25D: - { - DataNodePointerType multi = DataNodeType::New(); - multi->SetNodeType(FEATURE_MULTIPOINT); - - multiPtr = InternalTreeNodeType::New(); - multiPtr->Set(multi); - folderPtr->AddChild(multiPtr); - - OGRMultiPoint * ogrMulti = (OGRMultiPoint *) geometry; - - for (int geoIndex = 0;geoIndex<ogrMulti->getNumGeometries();++geoIndex) - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - } - break; - } - case wkbMultiLineString: - { - DataNodePointerType multi = DataNodeType::New(); - multi->SetNodeType(FEATURE_MULTILINE); - - multiPtr = InternalTreeNodeType::New(); - multiPtr->Set(multi); - folderPtr->AddChild(multiPtr); - - OGRMultiLineString * ogrMulti = (OGRMultiLineString *) geometry; - - for (int geoIndex = 0;geoIndex<ogrMulti->getNumGeometries();++geoIndex) - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - } - break; - } - case wkbMultiLineString25D: - { - DataNodePointerType multi = DataNodeType::New(); - multi->SetNodeType(FEATURE_MULTILINE); - - - multiPtr = InternalTreeNodeType::New(); - multiPtr->Set(multi); - folderPtr->AddChild(multiPtr); - - OGRMultiLineString * ogrMulti = (OGRMultiLineString *) geometry; - - for (int geoIndex = 0;geoIndex<ogrMulti->getNumGeometries();++geoIndex) - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - } - break; - } - case wkbMultiPolygon: - { - DataNodePointerType multi = DataNodeType::New(); - multi->SetNodeType(FEATURE_MULTIPOLYGON); - - multiPtr = InternalTreeNodeType::New(); - multiPtr->Set(multi); - folderPtr->AddChild(multiPtr); - - OGRMultiPolygon * ogrMulti = (OGRMultiPolygon *) geometry; - - for (int geoIndex = 0;geoIndex<ogrMulti->getNumGeometries();++geoIndex) - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - } - break; - } - case wkbMultiPolygon25D: - { - DataNodePointerType multi = DataNodeType::New(); - multi->SetNodeType(FEATURE_MULTIPOLYGON); - - multiPtr = InternalTreeNodeType::New(); - multiPtr->Set(multi); - folderPtr->AddChild(multiPtr); - - OGRMultiPolygon * ogrMulti = (OGRMultiPolygon *) geometry; - - for (int geoIndex = 0;geoIndex<ogrMulti->getNumGeometries();++geoIndex) - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - } - break; - } - case wkbGeometryCollection: - { - DataNodePointerType multi = DataNodeType::New(); - multi->SetNodeType(FEATURE_COLLECTION); - - multiPtr = InternalTreeNodeType::New(); - multiPtr->Set(multi); - folderPtr->AddChild(multiPtr); - - OGRGeometryCollection * ogrMulti = (OGRGeometryCollection *) geometry; - - for (int geoIndex = 0;geoIndex<ogrMulti->getNumGeometries();++geoIndex) - { - switch (ogrMulti->getGeometryRef(geoIndex)->getGeometryType()) - { - case wkbPoint: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - case wkbPoint25D: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - case wkbLineString: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - case wkbLineString25D: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - case wkbPolygon: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - case wkbPolygon25D: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - default: - { - std::cout<<"Geometry type not found: "<<ogrMulti->getGeometryRef(geoIndex)->getGeometryType()<<std::endl; - break; - } - } - } - break; - } - case wkbGeometryCollection25D: - { - DataNodePointerType multi = DataNodeType::New(); - multi->SetNodeType(FEATURE_COLLECTION); - - multiPtr = InternalTreeNodeType::New(); - multiPtr->Set(multi); - folderPtr->AddChild(multiPtr); - - OGRGeometryCollection * ogrMulti = (OGRGeometryCollection *) geometry; - - for (int geoIndex = 0;geoIndex<ogrMulti->getNumGeometries();++geoIndex) - { - switch (ogrMulti->getGeometryRef(geoIndex)->getGeometryType()) - { - case wkbPoint: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - case wkbPoint25D: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - case wkbLineString: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - case wkbLineString25D: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - case wkbPolygon: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - case wkbPolygon25D: - { - typename InternalTreeNodeType::Pointer newNode = InternalTreeNodeType::New(); - newNode->Set(ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex))); - multiPtr->AddChild(newNode); - break; - } - default: - { - std::cout<<"Geometry type not found: "<<ogrMulti->getGeometryRef(geoIndex)->getGeometryType()<<std::endl; - break; - } - } - } - break; - } - default: - { - std::cout<<"Geometry not handled: "<<geometry->getGeometryName()<<std::endl; - break; - } - } - - } - OGRFeature::DestroyFeature( feature ); - chrono.Stop(); - ++counter; - }//end While feature - otbMsgDevMacro(<<layer->GetFeatureCount()<<" features read, average insertion time "<<chrono.GetMeanTime()<<" s"); -} - - -template<class TVectorData> -unsigned int OGRIOFunctor<TVectorData> -::ProcessNodeWrite(InternalTreeNodeType * source, OGRDataSource * m_DataSource, OGRGeometryCollection * ogrCollection, -OGRLayer * ogrCurrentLayer, OGRSpatialReference * oSRS) -{ - //unsigned int m_Kept = 0; - // Get the children list from the input node - ChildrenListType children = source->GetChildrenList(); -// std::cout << "Found " << children.size() << " children" << std::endl; - - // For each child - for(typename ChildrenListType::iterator it = children.begin(); it!=children.end(); ++it) - { - DataNodePointerType dataNode = (*it)->Get(); -// std::cout << "Processing " << dataNode->GetNodeType() << " with Id: " << dataNode->GetNodeId() << std::endl; - ++m_Kept; - switch (dataNode->GetNodeType()) - { - case ROOT: - { - break; - } - case DOCUMENT: - { - ogrCurrentLayer = m_DataSource->CreateLayer(dataNode->GetNodeId(),oSRS,wkbUnknown,NULL); - if (ogrCurrentLayer == NULL) - { - //itkExceptionMacro(<<"Failed to create layer "<<dataNode->GetNodeId()); - std::cout << "Failed to create layer "<<dataNode->GetNodeId() << std::endl; - } - ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS); - break; - } - case FOLDER: - { - - ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS); - break; - } - case FEATURE_POINT: - { - //Build the ogrObject - OGRPoint ogrPoint; - ogrPoint.setX(dataNode->GetPoint()[0]); - ogrPoint.setY(dataNode->GetPoint()[1]); - - - if (DataNodeType::Dimension>2) - { - ogrPoint.setZ(dataNode->GetPoint()[2]); - } - - //Save it in the structure - if (ogrCollection == NULL) - { - OGRFeature *ogrFeature; - - ogrFeature = OGRFeature::CreateFeature( ogrCurrentLayer->GetLayerDefn() ); - ogrFeature->SetField("Name",dataNode->GetNodeId()); - ogrFeature->SetGeometry( &ogrPoint ); - - if( ogrCurrentLayer->CreateFeature( ogrFeature ) != OGRERR_NONE ) - { - itkExceptionMacro(<<"Failed to create feature in shapefile."); -// std::cout << "Failed to create feature in shapefile." - } - - OGRFeature::DestroyFeature( ogrFeature ); - } - else - { - ogrCollection->addGeometry(&ogrPoint); - } - - break; - } - case FEATURE_LINE: - { - //Build the ogrObject - OGRLineString ogrLine; - VertexListConstPointerType vertexList = dataNode->GetLine()->GetVertexList(); - - typename VertexListType::ConstIterator vIt = vertexList->Begin(); - - while (vIt != vertexList->End()) - { - OGRPoint ogrPoint; - ogrPoint.setX(vIt.Value()[0]); - ogrPoint.setY(vIt.Value()[1]); - if (DataNodeType::Dimension>2) - { - ogrPoint.setZ(vIt.Value()[2]); - } - ogrLine.addPoint(&ogrPoint); - ++vIt; - } - - //Save it in the structure - if (ogrCollection == NULL) - { - OGRFeature *ogrFeature; - - ogrFeature = OGRFeature::CreateFeature( ogrCurrentLayer->GetLayerDefn() ); - ogrFeature->SetField("Name",dataNode->GetNodeId()); - ogrFeature->SetGeometry( &ogrLine ); - - if( ogrCurrentLayer->CreateFeature( ogrFeature ) != OGRERR_NONE ) - { - itkExceptionMacro(<<"Failed to create feature in shapefile."); - } - - OGRFeature::DestroyFeature( ogrFeature ); - - } - else - { - ogrCollection->addGeometry(&ogrLine); - } - - break; - } - case FEATURE_POLYGON: - { - //Build the ogrObject - OGRPolygon * ogrPolygon = new OGRPolygon(); - OGRLinearRing * ogrExternalRing = new OGRLinearRing(); - VertexListConstPointerType vertexList = dataNode->GetPolygonExteriorRing()->GetVertexList(); - - typename VertexListType::ConstIterator vIt = vertexList->Begin(); - - while (vIt != vertexList->End()) - { - OGRPoint ogrPoint; - ogrPoint.setX(vIt.Value()[0]); - ogrPoint.setY(vIt.Value()[1]); - if (DataNodeType::Dimension>2) - { - ogrPoint.setZ(vIt.Value()[2]); - } - - ogrExternalRing->addPoint(&ogrPoint); - ++vIt; - } - ogrPolygon->addRing(ogrExternalRing); - delete ogrExternalRing; - - // Retrieving internal rings as well - for (typename PolygonListType::Iterator pIt = dataNode->GetPolygonInteriorRings()->Begin(); - pIt!=dataNode->GetPolygonInteriorRings()->End();++pIt) - { - OGRLinearRing * ogrInternalRing = new OGRLinearRing(); - vertexList = pIt.Get()->GetVertexList(); - vIt = vertexList->Begin(); - - while (vIt != vertexList->End()) - { - OGRPoint ogrPoint; - ogrPoint.setX(vIt.Value()[0]); - ogrPoint.setY(vIt.Value()[1]); - if (DataNodeType::Dimension>2) - { - ogrPoint.setZ(vIt.Value()[2]); - } - ogrInternalRing->addPoint(&ogrPoint); - ++vIt; - } - ogrPolygon->addRing(ogrInternalRing); - delete ogrInternalRing; - } - - //Save it in the structure - if (ogrCollection == NULL) - { - OGRFeature *ogrFeature; - - ogrFeature = OGRFeature::CreateFeature( ogrCurrentLayer->GetLayerDefn() ); - ogrFeature->SetField("Name",dataNode->GetNodeId()); - ogrFeature->SetGeometry( ogrPolygon ); - - if( ogrCurrentLayer->CreateFeature( ogrFeature ) != OGRERR_NONE ) - { - itkExceptionMacro(<<"Failed to create feature in shapefile."); - } - - OGRFeature::DestroyFeature( ogrFeature ); - - } - else - { - ogrCollection->addGeometry(ogrPolygon); - } - - delete ogrPolygon; - break; - } - case FEATURE_MULTIPOINT: - { - if (ogrCollection != NULL) - { - itkExceptionMacro(<<"Problem while creating multipoint."); - } - ogrCollection = new OGRMultiPoint(); - - OGRFeature *ogrFeature; - - ogrFeature = OGRFeature::CreateFeature( ogrCurrentLayer->GetLayerDefn() ); - ogrFeature->SetField("Name",dataNode->GetNodeId()); - ogrFeature->GetDefnRef()->SetGeomType(wkbMultiPoint); - ogrFeature->SetGeometry(ogrCollection ); - - if( ogrCurrentLayer->CreateFeature( ogrFeature ) != OGRERR_NONE ) - { - itkExceptionMacro(<<"Failed to create feature in shapefile."); - } - - ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS); - break; - } - case FEATURE_MULTILINE: - { - if (ogrCollection != NULL) - { - itkExceptionMacro(<<"Problem while creating multiline."); - } - ogrCollection = new OGRMultiLineString(); - - OGRFeature *ogrFeature; - - ogrFeature = OGRFeature::CreateFeature( ogrCurrentLayer->GetLayerDefn() ); - ogrFeature->SetField("Name",dataNode->GetNodeId()); - ogrFeature->GetDefnRef()->SetGeomType(wkbMultiLineString); - ogrFeature->SetGeometry(ogrCollection ); - - if( ogrCurrentLayer->CreateFeature( ogrFeature ) != OGRERR_NONE ) - { - itkExceptionMacro(<<"Failed to create feature in shapefile."); - } - - ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS); - break; - } - case FEATURE_MULTIPOLYGON: - { - if (ogrCollection != NULL) - { - itkExceptionMacro(<<"Problem while creating multipolygon."); - } - ogrCollection = new OGRMultiPolygon(); - - OGRFeature *ogrFeature; - - ogrFeature = OGRFeature::CreateFeature( ogrCurrentLayer->GetLayerDefn() ); - ogrFeature->SetField("Name",dataNode->GetNodeId()); - ogrFeature->GetDefnRef()->SetGeomType(wkbMultiPolygon); - ogrFeature->SetGeometry(ogrCollection ); - - if( ogrCurrentLayer->CreateFeature( ogrFeature ) != OGRERR_NONE ) - { - itkExceptionMacro(<<"Failed to create feature in shapefile."); - } - - ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS); - break; - } - case FEATURE_COLLECTION: - { - if (ogrCollection != NULL) - { - itkExceptionMacro(<<"Problem while creating collection."); - } - ogrCollection = new OGRMultiPoint();//Why is is a multipoint? - - OGRFeature *ogrFeature; - - ogrFeature = OGRFeature::CreateFeature( ogrCurrentLayer->GetLayerDefn() ); - ogrFeature->SetField("Name",dataNode->GetNodeId()); - ogrFeature->GetDefnRef()->SetGeomType(wkbGeometryCollection); - ogrFeature->SetGeometry(ogrCollection ); - - if( ogrCurrentLayer->CreateFeature( ogrFeature ) != OGRERR_NONE ) - { - itkExceptionMacro(<<"Failed to create feature in shapefile."); - } - - ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS); - break; - } - } - } - - return m_Kept; -} -/* -template<class TLabelObject, class TPolygon> -inline typename OGRIOFunctor<TLabelObject,TPolygon> -::PolygonPointerType -OGRIOFunctor<TLabelObject,TPolygon> -::operator()(const LabelObjectType * labelObject) -{ - -} -*/ - - - - - - - - -} // end namespace Functor - -} // end namespace otb - -#endif -- GitLab