📄 ogr2gmlgeometry.cpp
字号:
MakeGMLCoordinate( szCoordinate, poPoint->getX(), poPoint->getY(), poPoint->getZ(), TRUE ); _GrowBuffer( *pnLength + strlen(szCoordinate) + 70, ppszText, pnMaxLength ); sprintf( *ppszText + *pnLength, "<gml:Point><gml:coordinates>%s</gml:coordinates></gml:Point>", szCoordinate ); *pnLength += strlen( *ppszText + *pnLength ); }/* -------------------------------------------------------------------- *//* LineString and LinearRing *//* -------------------------------------------------------------------- */ else if( poGeometry->getGeometryType() == wkbLineString || poGeometry->getGeometryType() == wkbLineString25D ) { int bRing = EQUAL(poGeometry->getGeometryName(),"LINEARRING"); if( bRing ) AppendString( ppszText, pnLength, pnMaxLength, "<gml:LinearRing>" ); else AppendString( ppszText, pnLength, pnMaxLength, "<gml:LineString>" ); AppendCoordinateList( (OGRLineString *) poGeometry, ppszText, pnLength, pnMaxLength ); if( bRing ) AppendString( ppszText, pnLength, pnMaxLength, "</gml:LinearRing>" ); else AppendString( ppszText, pnLength, pnMaxLength, "</gml:LineString>" ); }/* -------------------------------------------------------------------- *//* Polygon *//* -------------------------------------------------------------------- */ else if( poGeometry->getGeometryType() == wkbPolygon || poGeometry->getGeometryType() == wkbPolygon25D ) { OGRPolygon *poPolygon = (OGRPolygon *) poGeometry; AppendString( ppszText, pnLength, pnMaxLength, "<gml:Polygon>" ); if( poPolygon->getExteriorRing() != NULL ) { AppendString( ppszText, pnLength, pnMaxLength, "<gml:outerBoundaryIs>" ); if( !OGR2GMLGeometryAppend( poPolygon->getExteriorRing(), ppszText, pnLength, pnMaxLength ) ) return FALSE; AppendString( ppszText, pnLength, pnMaxLength, "</gml:outerBoundaryIs>" ); } for( int iRing = 0; iRing < poPolygon->getNumInteriorRings(); iRing++ ) { OGRLinearRing *poRing = poPolygon->getInteriorRing(iRing); AppendString( ppszText, pnLength, pnMaxLength, "<gml:innerBoundaryIs>" ); if( !OGR2GMLGeometryAppend( poRing, ppszText, pnLength, pnMaxLength ) ) return FALSE; AppendString( ppszText, pnLength, pnMaxLength, "</gml:innerBoundaryIs>" ); } AppendString( ppszText, pnLength, pnMaxLength, "</gml:Polygon>" ); }/* -------------------------------------------------------------------- *//* MultiPolygon *//* -------------------------------------------------------------------- */ else if( poGeometry->getGeometryType() == wkbMultiPolygon || poGeometry->getGeometryType() == wkbMultiPolygon25D ) { OGRMultiPolygon *poMPoly = (OGRMultiPolygon *) poGeometry; int iMember; AppendString( ppszText, pnLength, pnMaxLength, "<gml:MultiPolygon>" ); for( iMember = 0; iMember < poMPoly->getNumGeometries(); iMember++) { OGRGeometry *poMember = poMPoly->getGeometryRef( iMember ); AppendString( ppszText, pnLength, pnMaxLength, "<gml:polygonMember>" ); if( !OGR2GMLGeometryAppend( poMember, ppszText, pnLength, pnMaxLength ) ) return FALSE; AppendString( ppszText, pnLength, pnMaxLength, "</gml:polygonMember>" ); } AppendString( ppszText, pnLength, pnMaxLength, "</gml:MultiPolygon>" ); } else return FALSE; return TRUE;}/************************************************************************//* OGR_G_ExportEnvelopeToGMLTree() *//* *//* Export the envelope of a geometry as a gml:Box. *//************************************************************************/CPLXMLNode *OGR_G_ExportEnvelopeToGMLTree( OGRGeometryH hGeometry ){ CPLXMLNode *psBox, *psCoord; OGREnvelope sEnvelope; char szCoordinate[256]; char *pszY; memset( &sEnvelope, 0, sizeof(sEnvelope) ); ((OGRGeometry *) hGeometry)->getEnvelope( &sEnvelope ); if( sEnvelope.MinX == 0 && sEnvelope.MaxX == 0 && sEnvelope.MaxX == 0 && sEnvelope.MaxY == 0 ) { /* there is apparently a special way of representing a null box geometry ... we should use it here eventually. */ return NULL; } psBox = CPLCreateXMLNode( NULL, CXT_Element, "gml:Box" );/* -------------------------------------------------------------------- *//* Add minxy coordinate. *//* -------------------------------------------------------------------- */ psCoord = CPLCreateXMLNode( psBox, CXT_Element, "gml:coord" ); MakeGMLCoordinate( szCoordinate, sEnvelope.MinX, sEnvelope.MinY, 0.0, FALSE ); pszY = strstr(szCoordinate,",") + 1; pszY[-1] = '\0'; CPLCreateXMLElementAndValue( psCoord, "gml:X", szCoordinate ); CPLCreateXMLElementAndValue( psCoord, "gml:Y", pszY );/* -------------------------------------------------------------------- *//* Add maxxy coordinate. *//* -------------------------------------------------------------------- */ psCoord = CPLCreateXMLNode( psBox, CXT_Element, "gml:coord" ); MakeGMLCoordinate( szCoordinate, sEnvelope.MaxX, sEnvelope.MaxY, 0.0, FALSE ); pszY = strstr(szCoordinate,",") + 1; pszY[-1] = '\0'; CPLCreateXMLElementAndValue( psCoord, "gml:X", szCoordinate ); CPLCreateXMLElementAndValue( psCoord, "gml:Y", pszY ); return psBox;}/************************************************************************//* OGR_G_ExportToGMLTree() *//************************************************************************/CPLXMLNode *OGR_G_ExportToGMLTree( OGRGeometryH hGeometry ){ char *pszText; CPLXMLNode *psTree; pszText = OGR_G_ExportToGML( hGeometry ); if( pszText == NULL ) return NULL; psTree = CPLParseXMLString( pszText ); CPLFree( pszText ); return psTree;}/************************************************************************//* OGR_G_ExportToGML() *//************************************************************************/char *OGR_G_ExportToGML( OGRGeometryH hGeometry ){ char *pszText; int nLength = 0, nMaxLength = 1; if( hGeometry == NULL ) return CPLStrdup( "" ); pszText = (char *) CPLMalloc(nMaxLength); pszText[0] = '\0'; if( !OGR2GMLGeometryAppend( (OGRGeometry *) hGeometry, &pszText, &nLength, &nMaxLength )) { CPLFree( pszText ); return NULL; } else return pszText;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -