20 #include "ogrsf_frmts.h"
31 OGRPoint * ogrPoint = (OGRPoint *) ogrGeometry;
35 itkGenericExceptionMacro(<<
"Failed to convert OGRGeometry to OGRPoint");
43 if (DataNodeType::Dimension > 2)
45 if (PointType::PointDimension != 3)
47 itkGenericExceptionMacro(<<
"OTB vector data can't contain the OGR information (2D instead of 2.5D)");
52 node->SetPoint(otbPoint);
60 OGRLineString * ogrLine = (OGRLineString *) ogrGeometry;
64 itkGenericExceptionMacro(<<
"Failed to convert OGRGeometry to OGRLine");
69 OGRPoint * ogrTmpPoint = (OGRPoint *) OGRGeometryFactory::createGeometry(wkbPoint);
71 for (
int pIndex = 0; pIndex < ogrLine->getNumPoints(); ++pIndex)
74 ogrLine->getPoint(pIndex, ogrTmpPoint);
78 vertex[0] = ogrTmpPoint->getX();
79 vertex[1] = ogrTmpPoint->getY();
81 if (DataNodeType::Dimension > 2)
83 if (LineType::VertexType::PointDimension != 3)
85 itkGenericExceptionMacro(<<
"OTB vector data can't contain the OGR information (2D instead of 2.5D)");
87 vertex[2] = ogrTmpPoint->getZ();
90 line->AddVertex(vertex);
92 OGRGeometryFactory::destroyGeometry(ogrTmpPoint);
102 OGRPolygon * ogrPolygon = (OGRPolygon *) ogrGeometry;
104 if (ogrPolygon ==
NULL)
106 itkGenericExceptionMacro(<<
"Failed to convert OGRGeometry to OGRPolygon");
109 OGRPoint * ogrTmpPoint = (OGRPoint *) OGRGeometryFactory::createGeometry(wkbPoint);
110 OGRLinearRing * ogrRing = ogrPolygon->getExteriorRing();
114 for (
int pIndex = 0; pIndex < ogrRing->getNumPoints(); ++pIndex)
116 ogrRing->getPoint(pIndex, ogrTmpPoint);
118 vertex[0] = ogrTmpPoint->getX();
119 vertex[1] = ogrTmpPoint->getY();
121 if (DataNodeType::Dimension > 2)
123 if (PolygonType::VertexType::PointDimension != 3)
125 itkGenericExceptionMacro(<<
"OTB vector data can't contain the OGR information (2D instead of 2.5D)");
127 vertex[2] = ogrTmpPoint->getZ();
130 extRing->AddVertex(vertex);
135 for (
int intRingIndex = 0; intRingIndex < ogrPolygon->getNumInteriorRings(); ++intRingIndex)
138 ogrRing = ogrPolygon->getInteriorRing(intRingIndex);
139 for (
int pIndex = 0; pIndex < ogrRing->getNumPoints(); ++pIndex)
141 ogrRing->getPoint(pIndex, ogrTmpPoint);
144 vertex[0] = ogrTmpPoint->getX();
145 vertex[1] = ogrTmpPoint->getY();
146 if (DataNodeType::Dimension > 2)
148 if (PolygonType::VertexType::PointDimension != 3)
150 itkGenericExceptionMacro(<<
"OTB vector data can't contain the OGR information (2D instead of 2.5D)");
152 vertex[2] = ogrTmpPoint->getZ();
154 ring->AddVertex(vertex);
156 intRings->PushBack(ring);
159 OGRGeometryFactory::destroyGeometry(ogrTmpPoint);
161 node->SetPolygonExteriorRing(extRing);
162 node->SetPolygonInteriorRings(intRings);
182 OGRFeature * feature;
184 layer->ResetReading();
186 unsigned int counter = 0;
189 while ((feature = layer->GetNextFeature()) !=
NULL)
197 OGRGeometry * geometry = feature->GetGeometryRef();
199 if (geometry ==
NULL)
201 OGRFeature::DestroyFeature(feature);
208 for (
int fieldNum = 0; fieldNum < feature->GetFieldCount(); ++fieldNum)
210 if (feature->IsFieldSet(fieldNum))
212 kwl.
AddField(feature->GetFieldDefnRef(fieldNum), feature->GetRawFieldRef(fieldNum));
216 switch (geometry->getGeometryType())
222 ConvertGeometryToPointNode(geometry, dataNode);
223 newNode->Set(dataNode);
226 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
236 ConvertGeometryToPointNode(geometry, dataNode);
237 newNode->Set(dataNode);
240 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
250 ConvertGeometryToLineNode(geometry, dataNode);
251 newNode->Set(dataNode);
254 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
260 case wkbLineString25D:
264 ConvertGeometryToLineNode(geometry, dataNode);
265 newNode->Set(dataNode);
268 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
278 ConvertGeometryToPolygonNode(geometry, dataNode);
279 newNode->Set(dataNode);
282 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
292 ConvertGeometryToPolygonNode(geometry, dataNode);
293 newNode->Set(dataNode);
296 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
307 multiPtr = InternalTreeNodeType::New();
308 multiPtr->Set(multi);
311 OGRMultiPoint * ogrMulti = (OGRMultiPoint *) geometry;
313 for (
int geoIndex = 0; geoIndex < ogrMulti->getNumGeometries(); ++geoIndex)
317 ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
318 newNode->Set(dataNode);
320 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
323 multiPtr->AddChild(newNode);
327 case wkbMultiPoint25D:
332 multiPtr = InternalTreeNodeType::New();
333 multiPtr->Set(multi);
336 OGRMultiPoint * ogrMulti = (OGRMultiPoint *) geometry;
338 for (
int geoIndex = 0; geoIndex < ogrMulti->getNumGeometries(); ++geoIndex)
342 ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
343 newNode->Set(dataNode);
345 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
348 multiPtr->AddChild(newNode);
352 case wkbMultiLineString:
357 multiPtr = InternalTreeNodeType::New();
358 multiPtr->Set(multi);
361 OGRMultiLineString * ogrMulti = (OGRMultiLineString *) geometry;
363 for (
int geoIndex = 0; geoIndex < ogrMulti->getNumGeometries(); ++geoIndex)
367 ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
368 newNode->Set(dataNode);
370 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
373 multiPtr->AddChild(newNode);
377 case wkbMultiLineString25D:
382 multiPtr = InternalTreeNodeType::New();
383 multiPtr->Set(multi);
386 OGRMultiLineString * ogrMulti = (OGRMultiLineString *) geometry;
388 for (
int geoIndex = 0; geoIndex < ogrMulti->getNumGeometries(); ++geoIndex)
392 ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
393 newNode->Set(dataNode);
395 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
398 multiPtr->AddChild(newNode);
402 case wkbMultiPolygon:
407 multiPtr = InternalTreeNodeType::New();
408 multiPtr->Set(multi);
411 OGRMultiPolygon * ogrMulti = (OGRMultiPolygon *) geometry;
413 for (
int geoIndex = 0; geoIndex < ogrMulti->getNumGeometries(); ++geoIndex)
417 ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
418 newNode->Set(dataNode);
420 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
423 multiPtr->AddChild(newNode);
427 case wkbMultiPolygon25D:
432 multiPtr = InternalTreeNodeType::New();
433 multiPtr->Set(multi);
436 OGRMultiPolygon * ogrMulti = (OGRMultiPolygon *) geometry;
438 for (
int geoIndex = 0; geoIndex < ogrMulti->getNumGeometries(); ++geoIndex)
442 ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
443 newNode->Set(dataNode);
445 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
448 multiPtr->AddChild(newNode);
452 case wkbGeometryCollection:
457 multiPtr = InternalTreeNodeType::New();
458 multiPtr->Set(multi);
461 OGRGeometryCollection * ogrMulti = (OGRGeometryCollection *) geometry;
463 for (
int geoIndex = 0; geoIndex < ogrMulti->getNumGeometries(); ++geoIndex)
465 switch (ogrMulti->getGeometryRef(geoIndex)->getGeometryType())
471 ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
472 newNode->Set(dataNode);
474 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
477 multiPtr->AddChild(newNode);
484 ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
485 newNode->Set(dataNode);
487 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
490 multiPtr->AddChild(newNode);
497 ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
498 newNode->Set(dataNode);
500 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
503 multiPtr->AddChild(newNode);
506 case wkbLineString25D:
510 ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
511 newNode->Set(dataNode);
513 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
516 multiPtr->AddChild(newNode);
523 ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
524 newNode->Set(dataNode);
526 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
529 multiPtr->AddChild(newNode);
536 ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
537 newNode->Set(dataNode);
539 itk::EncapsulateMetaData<VectorDataKeywordlist>(dict,
542 multiPtr->AddChild(newNode);
547 otbWarningMacro( <<
"Geometry type not found: " << ogrMulti->getGeometryRef(geoIndex)->getGeometryType());
554 case wkbGeometryCollection25D:
559 multiPtr = InternalTreeNodeType::New();
560 multiPtr->Set(multi);
563 OGRGeometryCollection * ogrMulti = (OGRGeometryCollection *) geometry;
565 for (
int geoIndex = 0; geoIndex < ogrMulti->getNumGeometries(); ++geoIndex)
567 switch (ogrMulti->getGeometryRef(geoIndex)->getGeometryType())
573 ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
574 newNode->Set(dataNode);
575 multiPtr->AddChild(newNode);
582 ConvertGeometryToPointNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
583 newNode->Set(dataNode);
584 multiPtr->AddChild(newNode);
591 ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
592 newNode->Set(dataNode);
593 multiPtr->AddChild(newNode);
596 case wkbLineString25D:
600 ConvertGeometryToLineNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
601 newNode->Set(dataNode);
602 multiPtr->AddChild(newNode);
609 ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
610 newNode->Set(dataNode);
611 multiPtr->AddChild(newNode);
618 ConvertGeometryToPolygonNode(ogrMulti->getGeometryRef(geoIndex), dataNode);
619 newNode->Set(dataNode);
620 multiPtr->AddChild(newNode);
625 otbWarningMacro( <<
"Geometry type not found: " << ogrMulti->getGeometryRef(geoIndex)->getGeometryType());
634 otbWarningMacro(
"Geometry not handled: " << geometry->getGeometryName());
640 OGRFeature::DestroyFeature(feature);
645 << layer->GetFeatureCount() <<
" features read, average insertion time " << chrono.
GetMeanTime() <<
" s");
651 OGRDataSource * m_DataSource,
652 OGRGeometryCollection * ogrCollection,
653 OGRLayer * ogrCurrentLayer,
654 OGRSpatialReference * oSRS)
656 unsigned int kept = 0;
657 bool fieldsAddedToOGRLayer =
false;
663 for (ChildrenListType::iterator it = children.begin(); it != children.end(); ++it)
671 itk::ExposeMetaData<VectorDataKeywordlist>(dataNode->GetMetaDataDictionary(),
676 if (ogrCurrentLayer !=
NULL && !fieldsAddedToOGRLayer)
682 if ( std::string(kwl.
GetNthField(fieldIdx).first->GetNameRef()) !=
"FID" )
685 if (ogrCurrentLayer->CreateField(kwl.
GetNthField(fieldIdx).first) != OGRERR_NONE )
687 itkExceptionMacro(<<
"Failed to create Field "<<kwl.
GetNthField(fieldIdx).first->GetNameRef());
700 fieldsAddedToOGRLayer =
true;
704 switch (dataNode->GetNodeType())
712 ogrCurrentLayer = m_DataSource->CreateLayer(dataNode->GetNodeId(), oSRS, wkbUnknown,
NULL);
713 if (ogrCurrentLayer ==
NULL)
716 std::cout <<
"Failed to create layer " << dataNode->GetNodeId() << std::endl;
721 fieldsAddedToOGRLayer =
false;
723 ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS);
728 ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS);
735 ogrPoint.setX(dataNode->GetPoint()[0]);
736 ogrPoint.setY(dataNode->GetPoint()[1]);
738 if (DataNodeType::Dimension > 2)
740 ogrPoint.setZ(dataNode->GetPoint()[2]);
744 if (ogrCollection ==
NULL)
746 OGRFeature *ogrFeature;
747 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
753 const char * key = kwl.
GetNthField(i).first->GetNameRef();
755 if (std::string(key) !=
"FID")
758 ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.
GetFieldAsString(key).c_str());
763 ogrFeature->SetGeometry(&ogrPoint);
765 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
767 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
771 OGRFeature::DestroyFeature(ogrFeature);
775 ogrCollection->addGeometry(&ogrPoint);
783 OGRLineString ogrLine;
788 while (vIt != vertexList->End())
791 ogrPoint.setX(vIt.
Value()[0]);
792 ogrPoint.setY(vIt.
Value()[1]);
793 if (DataNodeType::Dimension > 2)
795 ogrPoint.setZ(vIt.
Value()[2]);
797 ogrLine.addPoint(&ogrPoint);
802 if (ogrCollection ==
NULL)
804 OGRFeature *ogrFeature;
805 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
811 const char * key = kwl.
GetNthField(i).first->GetNameRef();
813 ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.
GetFieldAsString(key).c_str());
817 ogrFeature->SetGeometry(&ogrLine);
819 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
821 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
824 OGRFeature::DestroyFeature(ogrFeature);
829 ogrCollection->addGeometry(&ogrLine);
838 OGRPolygon * ogrPolygon = (OGRPolygon *) OGRGeometryFactory::createGeometry(wkbPolygon);
839 OGRLinearRing * ogrExternalRing = (OGRLinearRing *) OGRGeometryFactory::createGeometry(wkbLinearRing);
844 while (vIt != vertexList->End())
847 ogrPoint.setX(vIt.
Value()[0]);
848 ogrPoint.setY(vIt.
Value()[1]);
849 if (DataNodeType::Dimension > 2)
851 ogrPoint.setZ(vIt.
Value()[2]);
854 ogrExternalRing->addPoint(&ogrPoint);
857 ogrPolygon->addRing(ogrExternalRing);
859 ogrPolygon->closeRings();
860 OGRGeometryFactory::destroyGeometry(ogrExternalRing);
864 pIt != dataNode->GetPolygonInteriorRings()->End(); ++pIt)
866 OGRLinearRing * ogrInternalRing = (OGRLinearRing *) OGRGeometryFactory::createGeometry(wkbLinearRing);
867 vertexList = pIt.Get()->GetVertexList();
868 vIt = vertexList->Begin();
870 while (vIt != vertexList->End())
873 ogrPoint.setX(vIt.
Value()[0]);
874 ogrPoint.setY(vIt.
Value()[1]);
875 if (DataNodeType::Dimension > 2)
877 ogrPoint.setZ(vIt.
Value()[2]);
879 ogrInternalRing->addPoint(&ogrPoint);
882 ogrPolygon->addRing(ogrInternalRing);
883 OGRGeometryFactory::destroyGeometry(ogrInternalRing);
887 if (ogrCollection ==
NULL)
889 OGRFeature *ogrFeature;
890 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
896 const char * key = kwl.
GetNthField(i).first->GetNameRef();
898 ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.
GetFieldAsString(key).c_str());
901 ogrFeature->SetGeometry(ogrPolygon);
903 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
905 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
908 OGRFeature::DestroyFeature(ogrFeature);
912 ogrCollection->addGeometry(ogrPolygon);
915 OGRGeometryFactory::destroyGeometry(ogrPolygon);
920 if (ogrCollection !=
NULL)
922 itkExceptionMacro(<<
"Problem while creating multipoint.");
925 OGRMultiPoint* ogrMultiPoint = (OGRMultiPoint*) OGRGeometryFactory::createGeometry(wkbMultiPoint);
926 OGRFeature * ogrFeature;
928 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
930 ogrFeature->GetDefnRef()->SetGeomType(wkbMultiPoint);
931 ogrFeature->SetGeometry(ogrMultiPoint);
933 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
935 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
938 ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS);
943 if (ogrCollection !=
NULL)
945 itkExceptionMacro(<<
"Problem while creating multiline.");
949 OGRMultiLineString* ogrMultiLineString = (OGRMultiLineString*) OGRGeometryFactory::createGeometry(
952 OGRFeature *ogrFeature;
954 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
956 ogrFeature->GetDefnRef()->SetGeomType(wkbMultiLineString);
957 ogrFeature->SetGeometry(ogrMultiLineString);
959 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
961 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
963 ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS);
968 if (ogrCollection !=
NULL)
970 itkExceptionMacro(<<
"Problem while creating multipolygon.");
974 OGRMultiPolygon* ogrMultiPolygon = (OGRMultiPolygon*) OGRGeometryFactory::createGeometry(wkbMultiPolygon);
975 OGRFeature * ogrFeature;
977 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
979 ogrFeature->GetDefnRef()->SetGeomType(wkbMultiPolygon);
980 ogrFeature->SetGeometry(ogrMultiPolygon);
982 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
984 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
986 ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS);
991 if (ogrCollection !=
NULL)
993 itkExceptionMacro(<<
"Problem while creating collection.");
996 OGRGeometryCollection* ogrCollectionGeometry = (OGRGeometryCollection*) OGRGeometryFactory::createGeometry(
997 wkbGeometryCollection);
999 OGRFeature *ogrFeature;
1001 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
1003 ogrFeature->GetDefnRef()->SetGeomType(wkbGeometryCollection);
1004 ogrFeature->SetGeometry(ogrCollectionGeometry);
1006 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
1008 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
1011 ProcessNodeWrite(*it, m_DataSource, ogrCollection, ogrCurrentLayer, oSRS);
1027 OGRDataSource * inMemoryDataSource,
1028 OGRLayer* ogrCurrentLayer,
1029 OGRSpatialReference * oSRS)
1033 if (inMemoryDataSource ==
NULL)
1035 const char * driverName =
"Memory";
1036 OGRSFDriver * ogrDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(driverName);
1037 inMemoryDataSource = ogrDriver->CreateDataSource(
"tempDataSource",
NULL);
1040 std::vector<OGRLayer*> ogrLayerVector;
1041 unsigned int kept = 0;
1042 bool fieldsAddedToOGRLayer =
false;
1048 for (ChildrenListType::iterator it = children.begin(); it != children.end(); ++it)
1054 itk::ExposeMetaData<VectorDataKeywordlist>(dataNode->GetMetaDataDictionary(),
1059 if (ogrCurrentLayer !=
NULL && !fieldsAddedToOGRLayer)
1065 if ( std::string(kwl.
GetNthField(fieldIdx).first->GetNameRef()) !=
"FID" )
1068 if (ogrCurrentLayer->CreateField(kwl.
GetNthField(fieldIdx).first) != OGRERR_NONE )
1070 itkExceptionMacro(<<
"Failed to create Field "<<kwl.
GetNthField(fieldIdx).first->GetNameRef());
1078 fieldsAddedToOGRLayer =
true;
1081 switch (dataNode->GetNodeType())
1089 ogrCurrentLayer = inMemoryDataSource->CreateLayer(dataNode->GetNodeId(), oSRS,
1091 if (ogrCurrentLayer ==
NULL)
1093 std::cout <<
"Failed to create layer " << dataNode->GetNodeId() << std::endl;
1098 fieldsAddedToOGRLayer =
false;
1100 ogrLayerVector.push_back(ogrCurrentLayer);
1101 ConvertDataTreeNodeToOGRLayers(*it, inMemoryDataSource, ogrCurrentLayer, oSRS);
1106 ConvertDataTreeNodeToOGRLayers(*it, inMemoryDataSource, ogrCurrentLayer, oSRS);
1113 ogrPoint.setX(dataNode->GetPoint()[0]);
1114 ogrPoint.setY(dataNode->GetPoint()[1]);
1116 if (DataNodeType::Dimension > 2)
1118 ogrPoint.setZ(dataNode->GetPoint()[2]);
1122 OGRFeature *ogrFeature;
1123 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
1129 const char * key = kwl.
GetNthField(i).first->GetNameRef();
1131 if (std::string(key) !=
"FID")
1134 ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.
GetFieldAsString(key).c_str());
1137 ogrFeature->SetGeometry(&ogrPoint);
1139 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
1141 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
1144 OGRFeature::DestroyFeature(ogrFeature);
1150 OGRLineString ogrLine;
1155 while (vIt != vertexList->End())
1158 ogrPoint.setX(vIt.
Value()[0]);
1159 ogrPoint.setY(vIt.
Value()[1]);
1160 if (DataNodeType::Dimension > 2)
1162 ogrPoint.setZ(vIt.
Value()[2]);
1164 ogrLine.addPoint(&ogrPoint);
1169 OGRFeature *ogrFeature;
1170 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
1176 const char * key = kwl.
GetNthField(i).first->GetNameRef();
1178 ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.
GetFieldAsString(key).c_str());
1180 ogrFeature->SetGeometry(&ogrLine);
1182 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
1184 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
1187 OGRFeature::DestroyFeature(ogrFeature);
1193 OGRPolygon * ogrPolygon = (OGRPolygon *) OGRGeometryFactory::createGeometry(wkbPolygon);
1194 OGRLinearRing * ogrExternalRing = (OGRLinearRing *) OGRGeometryFactory::createGeometry(wkbLinearRing);
1199 while (vIt != vertexList->End())
1202 ogrPoint.setX(vIt.
Value()[0]);
1203 ogrPoint.setY(vIt.
Value()[1]);
1204 if (DataNodeType::Dimension > 2)
1206 ogrPoint.setZ(vIt.
Value()[2]);
1209 ogrExternalRing->addPoint(&ogrPoint);
1212 ogrPolygon->addRing(ogrExternalRing);
1214 ogrPolygon->closeRings();
1215 OGRGeometryFactory::destroyGeometry(ogrExternalRing);
1219 pIt != dataNode->GetPolygonInteriorRings()->End(); ++pIt)
1221 OGRLinearRing * ogrInternalRing = (OGRLinearRing *) OGRGeometryFactory::createGeometry(wkbLinearRing);
1222 vertexList = pIt.Get()->GetVertexList();
1223 vIt = vertexList->Begin();
1225 while (vIt != vertexList->End())
1228 ogrPoint.setX(vIt.
Value()[0]);
1229 ogrPoint.setY(vIt.
Value()[1]);
1230 if (DataNodeType::Dimension > 2)
1232 ogrPoint.setZ(vIt.
Value()[2]);
1234 ogrInternalRing->addPoint(&ogrPoint);
1237 ogrPolygon->addRing(ogrInternalRing);
1238 OGRGeometryFactory::destroyGeometry(ogrInternalRing);
1241 OGRFeature *ogrFeature;
1242 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
1248 const char * key = kwl.
GetNthField(i).first->GetNameRef();
1250 ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.
GetFieldAsString(key).c_str());
1253 ogrFeature->SetGeometry(ogrPolygon);
1255 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
1257 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
1260 OGRFeature::DestroyFeature(ogrFeature);
1261 OGRGeometryFactory::destroyGeometry(ogrPolygon);
1266 OGRMultiPoint* ogrMultiPoint = (OGRMultiPoint*) OGRGeometryFactory::createGeometry(wkbMultiPoint);
1267 OGRFeature * ogrFeature;
1269 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
1270 ogrFeature->GetDefnRef()->SetGeomType(wkbMultiPoint);
1271 ogrFeature->SetGeometry(ogrMultiPoint);
1273 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
1275 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
1277 ConvertDataTreeNodeToOGRLayers(*it, inMemoryDataSource, ogrCurrentLayer, oSRS);
1283 OGRMultiLineString* ogrMultiLineString = (OGRMultiLineString*) OGRGeometryFactory::createGeometry(
1284 wkbMultiLineString);
1286 OGRFeature *ogrFeature;
1288 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
1289 ogrFeature->GetDefnRef()->SetGeomType(wkbMultiLineString);
1290 ogrFeature->SetGeometry(ogrMultiLineString);
1292 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
1294 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
1296 ConvertDataTreeNodeToOGRLayers(*it, inMemoryDataSource, ogrCurrentLayer, oSRS);
1302 OGRMultiPolygon* ogrMultiPolygon = (OGRMultiPolygon*) OGRGeometryFactory::createGeometry(wkbMultiPolygon);
1303 OGRFeature * ogrFeature;
1305 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
1306 ogrFeature->GetDefnRef()->SetGeomType(wkbMultiPolygon);
1307 ogrFeature->SetGeometry(ogrMultiPolygon);
1309 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
1311 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
1313 ConvertDataTreeNodeToOGRLayers(*it, inMemoryDataSource, ogrCurrentLayer, oSRS);
1318 OGRGeometryCollection* ogrCollectionGeometry = (OGRGeometryCollection*) OGRGeometryFactory::createGeometry(
1319 wkbGeometryCollection);
1321 OGRFeature *ogrFeature;
1323 ogrFeature = OGRFeature::CreateFeature(ogrCurrentLayer->GetLayerDefn());
1324 ogrFeature->GetDefnRef()->SetGeomType(wkbGeometryCollection);
1325 ogrFeature->SetGeometry(ogrCollectionGeometry);
1327 if (ogrCurrentLayer->CreateFeature(ogrFeature) != OGRERR_NONE)
1329 itkExceptionMacro(<<
"Failed to create feature in shapefile.");
1331 ConvertDataTreeNodeToOGRLayers(*it, inMemoryDataSource, ogrCurrentLayer, oSRS);
1337 return ogrLayerVector;