ogr2kmlgeometry.cpp
来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 430 行 · 第 1/2 页
CPP
430 行
AppendCoordinateList( (OGRLineString *) poGeometry, ppszText, pnLength, pnMaxLength ); if( bRing ) AppendString( ppszText, pnLength, pnMaxLength, "</LinearRing>" ); else AppendString( ppszText, pnLength, pnMaxLength, "</LineString>" ); }/* -------------------------------------------------------------------- *//* Polygon *//* -------------------------------------------------------------------- */ else if( poGeometry->getGeometryType() == wkbPolygon || poGeometry->getGeometryType() == wkbPolygon25D ) { OGRPolygon *poPolygon = (OGRPolygon *) poGeometry; AppendString( ppszText, pnLength, pnMaxLength, "<Polygon>" ); if( poPolygon->getExteriorRing() != NULL ) { AppendString( ppszText, pnLength, pnMaxLength, "<outerBoundaryIs>" ); if( !OGR2KMLGeometryAppend( poPolygon->getExteriorRing(), ppszText, pnLength, pnMaxLength ) ) return FALSE; AppendString( ppszText, pnLength, pnMaxLength, "</outerBoundaryIs>" ); } for( int iRing = 0; iRing < poPolygon->getNumInteriorRings(); iRing++ ) { OGRLinearRing *poRing = poPolygon->getInteriorRing(iRing); AppendString( ppszText, pnLength, pnMaxLength, "<innerBoundaryIs>" ); if( !OGR2KMLGeometryAppend( poRing, ppszText, pnLength, pnMaxLength ) ) return FALSE; AppendString( ppszText, pnLength, pnMaxLength, "</innerBoundaryIs>" ); } AppendString( ppszText, pnLength, pnMaxLength, "</Polygon>" ); }/* -------------------------------------------------------------------- *//* 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 *pszElem, *pszMemberElem; if( wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPolygon ) { pszElem = "MultiPolygon>"; pszMemberElem = "polygonMember>"; } else if( wkbFlatten(poGeometry->getGeometryType()) == wkbMultiLineString ) { pszElem = "MultiLineString>"; pszMemberElem = "lineStringMember>"; } else if( wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPoint ) { pszElem = "MultiPoint>"; pszMemberElem = "pointMember>"; } else { pszElem = "GeometryCollection>"; pszMemberElem = "geometryMember>"; } AppendString( ppszText, pnLength, pnMaxLength, "<" ); AppendString( ppszText, pnLength, pnMaxLength, pszElem ); for( iMember = 0; iMember < poGC->getNumGeometries(); iMember++) { OGRGeometry *poMember = poGC->getGeometryRef( iMember ); AppendString( ppszText, pnLength, pnMaxLength, "<" ); AppendString( ppszText, pnLength, pnMaxLength, pszMemberElem ); if( !OGR2KMLGeometryAppend( poMember, ppszText, pnLength, pnMaxLength ) ) return FALSE; AppendString( ppszText, pnLength, pnMaxLength, "</" ); AppendString( ppszText, pnLength, pnMaxLength, pszMemberElem ); } AppendString( ppszText, pnLength, pnMaxLength, "</" ); AppendString( ppszText, pnLength, pnMaxLength, pszElem ); } else return FALSE; return TRUE;}/************************************************************************//* OGR_G_ExportEnvelopeToKMLTree() *//* *//* Export the envelope of a geometry as a KML:Box. *//************************************************************************/CPLXMLNode *OGR_G_ExportEnvelopeToKMLTree( 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, "Box" );/* -------------------------------------------------------------------- *//* Add minxy coordinate. *//* -------------------------------------------------------------------- */ psCoord = CPLCreateXMLNode( psBox, CXT_Element, "coord" ); MakeKMLCoordinate( szCoordinate, sEnvelope.MinX, sEnvelope.MinY, 0.0, FALSE ); pszY = strstr(szCoordinate,",") + 1; pszY[-1] = '\0'; CPLCreateXMLElementAndValue( psCoord, "X", szCoordinate ); CPLCreateXMLElementAndValue( psCoord, "Y", pszY );/* -------------------------------------------------------------------- *//* Add maxxy coordinate. *//* -------------------------------------------------------------------- */ psCoord = CPLCreateXMLNode( psBox, CXT_Element, "coord" ); MakeKMLCoordinate( szCoordinate, sEnvelope.MaxX, sEnvelope.MaxY, 0.0, FALSE ); pszY = strstr(szCoordinate,",") + 1; pszY[-1] = '\0'; CPLCreateXMLElementAndValue( psCoord, "X", szCoordinate ); CPLCreateXMLElementAndValue( psCoord, "Y", pszY ); return psBox;}/************************************************************************//* OGR_G_ExportToKML() *//************************************************************************/char *OGR_G_ExportToKML( OGRGeometryH hGeometry ){ char *pszText; int nLength = 0, nMaxLength = 1; if( hGeometry == NULL ) return CPLStrdup( "" ); pszText = (char *) CPLMalloc(nMaxLength); pszText[0] = '\0'; if( !OGR2KMLGeometryAppend( (OGRGeometry *) hGeometry, &pszText, &nLength, &nMaxLength )) { CPLFree( pszText ); return NULL; } else return pszText;}/************************************************************************//* OGR_G_ExportToKMLTree() *//************************************************************************/CPLXMLNode *OGR_G_ExportToKMLTree( OGRGeometryH hGeometry ){ char *pszText; CPLXMLNode *psTree; pszText = OGR_G_ExportToKML( hGeometry ); if( pszText == NULL ) return NULL; psTree = CPLParseXMLString( pszText ); CPLFree( pszText ); return psTree;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?