⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gml2ogrgeometry.cpp

📁 在linux环境下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -