ogr2gmlgeometry.cpp
来自「用于读取TAB、MIF、SHP文件的类」· C++ 代码 · 共 613 行 · 第 1/2 页
CPP
613 行
_GrowBuffer( *pnLength + strlen(szCoordinate) + 70 + nSrsNameLength, ppszText, pnMaxLength ); sprintf( *ppszText + *pnLength, "<gml:Point%s><gml:coordinates>%s</gml:coordinates></gml:Point>", szSrsName, szCoordinate ); *pnLength += strlen( *ppszText + *pnLength ); }/* -------------------------------------------------------------------- *//* LineString and LinearRing *//* -------------------------------------------------------------------- */ else if( poGeometry->getGeometryType() == wkbLineString || poGeometry->getGeometryType() == wkbLineString25D ) { int bRing = EQUAL(poGeometry->getGeometryName(),"LINEARRING"); // Buffer for tag name + srsName attribute if set const size_t nLineTagLength = 16; char* pszLineTagName = NULL; pszLineTagName = (char *) CPLMalloc( nLineTagLength + nSrsNameLength + 1 ); if( bRing ) { sprintf( pszLineTagName, "<gml:LinearRing%s>", szSrsName ); AppendString( ppszText, pnLength, pnMaxLength, pszLineTagName ); } else { sprintf( pszLineTagName, "<gml:LineString%s>", szSrsName ); AppendString( ppszText, pnLength, pnMaxLength, pszLineTagName ); } // FREE TAG BUFFER CPLFree( pszLineTagName ); 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; // Buffer for polygon tag name + srsName attribute if set const size_t nPolyTagLength = 13; char* pszPolyTagName = NULL; pszPolyTagName = (char *) CPLMalloc( nPolyTagLength + nSrsNameLength + 1 ); // Compose Polygon tag with or without srsName attribute sprintf( pszPolyTagName, "<gml:Polygon%s>", szSrsName ); AppendString( ppszText, pnLength, pnMaxLength, pszPolyTagName ); // FREE TAG BUFFER CPLFree( pszPolyTagName ); // Don't add srsName to polygon rings bIsSubGeometry = TRUE; 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>" ); bIsSubGeometry = FALSE; }/* -------------------------------------------------------------------- *//* MultiPolygon *//* -------------------------------------------------------------------- */ else if( wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPolygon || wkbFlatten(poGeometry->getGeometryType()) == wkbMultiLineString || wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPoint || wkbFlatten(poGeometry->getGeometryType()) == wkbGeometryCollection ) { OGRGeometryCollection *poGC = (OGRGeometryCollection *) poGeometry; int iMember; const char *pszElemClose = NULL; const char *pszMemberElem = NULL; // Buffer for opening tag + srsName attribute char* pszElemOpen = NULL; if( wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPolygon ) { pszElemOpen = (char *) CPLMalloc( 13 + nSrsNameLength + 1 ); sprintf( pszElemOpen, "MultiPolygon%s>", szSrsName ); pszElemClose = "MultiPolygon>"; pszMemberElem = "polygonMember>"; } else if( wkbFlatten(poGeometry->getGeometryType()) == wkbMultiLineString ) { pszElemOpen = (char *) CPLMalloc( 16 + nSrsNameLength + 1 ); sprintf( pszElemOpen, "MultiLineString%s>", szSrsName ); pszElemClose = "MultiLineString>"; pszMemberElem = "lineStringMember>"; } else if( wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPoint ) { pszElemOpen = (char *) CPLMalloc( 11 + nSrsNameLength + 1 ); sprintf( pszElemOpen, "MultiPoint%s>", szSrsName ); pszElemClose = "MultiPoint>"; pszMemberElem = "pointMember>"; } else { pszElemOpen = (char *) CPLMalloc( 19 + nSrsNameLength + 1 ); sprintf( pszElemOpen, "GeometryCollection%s>", szSrsName ); pszElemClose = "GeometryCollection>"; pszMemberElem = "geometryMember>"; } AppendString( ppszText, pnLength, pnMaxLength, "<gml:" ); AppendString( ppszText, pnLength, pnMaxLength, pszElemOpen ); // Don't add srsName to geometry collection members bIsSubGeometry = TRUE; for( iMember = 0; iMember < poGC->getNumGeometries(); iMember++) { OGRGeometry *poMember = poGC->getGeometryRef( iMember ); AppendString( ppszText, pnLength, pnMaxLength, "<gml:" ); AppendString( ppszText, pnLength, pnMaxLength, pszMemberElem ); if( !OGR2GMLGeometryAppend( poMember, ppszText, pnLength, pnMaxLength ) ) { return FALSE; } AppendString( ppszText, pnLength, pnMaxLength, "</gml:" ); AppendString( ppszText, pnLength, pnMaxLength, pszMemberElem ); } bIsSubGeometry = FALSE; AppendString( ppszText, pnLength, pnMaxLength, "</gml:" ); AppendString( ppszText, pnLength, pnMaxLength, pszElemClose ); // FREE TAG BUFFER CPLFree( pszElemOpen ); } 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 + =
减小字号Ctrl + -
显示快捷键?