?? ogr2gmlgeometry.cpp
字號:
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -