📄 gml2ogrgeometry.cpp
字号:
psYNode = FindBareXMLChild( psCoordNode, "Y" ); psZNode = FindBareXMLChild( psCoordNode, "Z" ); if( psXNode == NULL || psYNode == NULL || GetElementText(psXNode) == NULL || GetElementText(psYNode) == NULL || (psZNode != NULL && GetElementText(psZNode) == NULL) ) { CPLError( CE_Failure, CPLE_AppDefined, "Corrupt <coord> element, missing <X> or <Y> element?" ); return FALSE; } dfX = atof( GetElementText(psXNode) ); dfY = atof( GetElementText(psYNode) ); if( psZNode != NULL && GetElementText(psZNode) != NULL ) dfZ = atof( GetElementText(psZNode) ); if( !AddPoint( poGeometry, dfX, dfY, dfZ ) ) return FALSE; iCoord++; } return iCoord > 0.0;}/************************************************************************//* GML2OGRGeometry_XMLNode() *//* *//* Translates the passed XMLnode and it's children into an *//* OGRGeometry. This is used recursively for geometry *//* collections. *//************************************************************************/static OGRGeometry *GML2OGRGeometry_XMLNode( CPLXMLNode *psNode ){ const char *pszBaseGeometry = BareGMLElement( psNode->pszValue );/* -------------------------------------------------------------------- *//* Polygon *//* -------------------------------------------------------------------- */ if( EQUAL(pszBaseGeometry,"Polygon") ) { CPLXMLNode *psChild; OGRPolygon *poPolygon = new OGRPolygon(); OGRLinearRing *poRing; // Find outer ring. psChild = FindBareXMLChild( psNode, "outerBoundaryIs" ); if( psChild == NULL || psChild->psChild == NULL ) { CPLError( CE_Failure, CPLE_AppDefined, "Missing outerBoundaryIs property on Polygon." ); delete poPolygon; return NULL; } // Translate outer ring and add to polygon. poRing = (OGRLinearRing *) GML2OGRGeometry_XMLNode( psChild->psChild ); if( poRing == NULL ) { delete poPolygon; return NULL; } if( !EQUAL(poRing->getGeometryName(),"LINEARRING") ) { CPLError( CE_Failure, CPLE_AppDefined, "Got %.500s geometry as outerBoundaryIs instead of LINEARRING.", poRing->getGeometryName() ); delete poPolygon; delete poRing; return NULL; } poPolygon->addRingDirectly( poRing ); // Find all inner rings for( psChild = psNode->psChild; psChild != NULL; psChild = psChild->psNext ) { if( psChild->eType == CXT_Element && EQUAL(BareGMLElement(psChild->pszValue),"innerBoundaryIs") ) { poRing = (OGRLinearRing *) GML2OGRGeometry_XMLNode( psChild->psChild ); if( !EQUAL(poRing->getGeometryName(),"LINEARRING") ) { CPLError( CE_Failure, CPLE_AppDefined, "Got %.500s geometry as innerBoundaryIs instead of LINEARRING.", poRing->getGeometryName() ); delete poPolygon; delete poRing; return NULL; } poPolygon->addRingDirectly( poRing ); } } return poPolygon; }/* -------------------------------------------------------------------- *//* LinearRing *//* -------------------------------------------------------------------- */ if( EQUAL(pszBaseGeometry,"LinearRing") ) { OGRLinearRing *poLinearRing = new OGRLinearRing(); if( !ParseGMLCoordinates( psNode, poLinearRing ) ) { delete poLinearRing; return NULL; } return poLinearRing; }/* -------------------------------------------------------------------- *//* LineString *//* -------------------------------------------------------------------- */ if( EQUAL(pszBaseGeometry,"LineString") ) { OGRLineString *poLine = new OGRLineString(); if( !ParseGMLCoordinates( psNode, poLine ) ) { delete poLine; return NULL; } return poLine; }/* -------------------------------------------------------------------- *//* PointType *//* -------------------------------------------------------------------- */ if( EQUAL(pszBaseGeometry,"PointType") || EQUAL(pszBaseGeometry,"Point") ) { OGRPoint *poPoint = new OGRPoint(); if( !ParseGMLCoordinates( psNode, poPoint ) ) { delete poPoint; return NULL; } return poPoint; }/* -------------------------------------------------------------------- *//* Box *//* -------------------------------------------------------------------- */ if( EQUAL(pszBaseGeometry,"BoxType") || EQUAL(pszBaseGeometry,"Box") ) { OGRLineString oPoints; if( !ParseGMLCoordinates( psNode, &oPoints ) ) return NULL; if( oPoints.getNumPoints() < 2 ) return NULL; OGRLinearRing *poBoxRing = new OGRLinearRing(); OGRPolygon *poBoxPoly = new OGRPolygon(); poBoxRing->setNumPoints( 5 ); poBoxRing->setPoint( 0, oPoints.getX(0), oPoints.getY(0), oPoints.getZ(0) ); poBoxRing->setPoint( 1, oPoints.getX(1), oPoints.getY(0), oPoints.getZ(0) ); poBoxRing->setPoint( 2, oPoints.getX(1), oPoints.getY(1), oPoints.getZ(1) ); poBoxRing->setPoint( 3, oPoints.getX(0), oPoints.getY(1), oPoints.getZ(0) ); poBoxRing->setPoint( 4, oPoints.getX(0), oPoints.getY(0), oPoints.getZ(0) ); poBoxPoly->addRingDirectly( poBoxRing ); return poBoxPoly; }/* -------------------------------------------------------------------- *//* MultiPolygon *//* -------------------------------------------------------------------- */ if( EQUAL(pszBaseGeometry,"MultiPolygon") ) { CPLXMLNode *psChild; OGRMultiPolygon *poMPoly = new OGRMultiPolygon(); // Find all inner rings for( psChild = psNode->psChild; psChild != NULL; psChild = psChild->psNext ) { if( psChild->eType == CXT_Element && EQUAL(BareGMLElement(psChild->pszValue),"polygonMember") ) { OGRPolygon *poPolygon; poPolygon = (OGRPolygon *) GML2OGRGeometry_XMLNode( psChild->psChild ); if( !EQUAL(poPolygon->getGeometryName(),"POLYGON") ) { CPLError( CE_Failure, CPLE_AppDefined, "Got %.500s geometry as polygonMember instead of POLYGON.", poPolygon->getGeometryName() ); delete poPolygon; delete poMPoly; return NULL; } poMPoly->addGeometryDirectly( poPolygon ); } } return poMPoly; } CPLError( CE_Failure, CPLE_AppDefined, "Unrecognised geometry type <%.500s>.", pszBaseGeometry ); return NULL;}/************************************************************************//* OGR_G_CreateFromGMLTree() *//************************************************************************/OGRGeometryH OGR_G_CreateFromGMLTree( const CPLXMLNode *psTree ){ return (OGRGeometryH) GML2OGRGeometry_XMLNode( (CPLXMLNode *) psTree );}/************************************************************************//* OGR_G_CreateFromGML() *//************************************************************************/OGRGeometryH OGR_G_CreateFromGML( const char *pszGML ){ if( pszGML == NULL || strlen(pszGML) == 0 ) { CPLError( CE_Failure, CPLE_AppDefined, "GML Geometry is empty in GML2OGRGeometry()." ); return NULL; }/* -------------------------------------------------------------------- *//* Try to parse the XML snippet using the MiniXML API. If this *//* fails, we assume the minixml api has already posted a CPL *//* error, and just return NULL. *//* -------------------------------------------------------------------- */ CPLXMLNode *psGML = CPLParseXMLString( pszGML ); if( psGML == NULL ) return NULL;/* -------------------------------------------------------------------- *//* Convert geometry recursively. *//* -------------------------------------------------------------------- */ OGRGeometry *poGeometry; poGeometry = GML2OGRGeometry_XMLNode( psGML ); CPLDestroyXMLNode( psGML ); return (OGRGeometryH) poGeometry;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -