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

📄 ogrocilayer.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        poCollection = new OGRGeometryCollection();    else if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_MULTIPOINT) )        poCollection = new OGRMultiPoint();    else if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_MULTILINESTRING) )        poCollection = new OGRMultiLineString();    else if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_MULTIPOLYGON) )        poCollection = new OGRMultiPolygon();/* ==================================================================== *//*      Loop over the component elements.                               *//* ==================================================================== */    ub4   nNextStartOrdinal = 1;    for( int iElement = 0; iElement < nElemCount; iElement += 3 )    {        boolean bExists;        OCINumber *hNumber;        ub4       nInterpretation, nEType;        int       nStartOrdinal = nNextStartOrdinal;/* -------------------------------------------------------------------- *//*      Get the details about element from the elem_info array.         *//* -------------------------------------------------------------------- */        OCICollGetElem(poSession->hEnv, poSession->hError,                        (OCIColl *)(hLastGeom->sdo_elem_info),                        (sb4)(iElement+1), (boolean *)&bExists,                        (dvoid **)&hNumber, NULL );        OCINumberToInt(poSession->hError, hNumber, (uword)sizeof(ub4),                        OCI_NUMBER_UNSIGNED, (dvoid *) &nEType );                OCICollGetElem(poSession->hEnv, poSession->hError,                        (OCIColl *)(hLastGeom->sdo_elem_info),                        (sb4)(iElement+2), (boolean *)&bExists,                        (dvoid **)&hNumber, NULL );        OCINumberToInt(poSession->hError, hNumber, (uword)sizeof(ub4),                        OCI_NUMBER_UNSIGNED, (dvoid *) &nInterpretation );        if( iElement < nElemCount-3 )        {            OCICollGetElem(poSession->hEnv, poSession->hError,                            (OCIColl *)(hLastGeom->sdo_elem_info),                            (sb4)(iElement+3), (boolean *)&bExists,                            (dvoid **)&hNumber,NULL);            OCINumberToInt(poSession->hError, hNumber, (uword)sizeof(ub4),                            OCI_NUMBER_UNSIGNED, (dvoid *) &nNextStartOrdinal );        }        else            nNextStartOrdinal = nOrdCount+1;/* -------------------------------------------------------------------- *//*      Translate this element.                                         *//* -------------------------------------------------------------------- */        OGRGeometry *poGeom;        poGeom = TranslateGeometryElement( nGType, nDimension,                                            nEType, nInterpretation,                                           nStartOrdinal - 1,                                            nNextStartOrdinal - nStartOrdinal );        if( poGeom == NULL )            return NULL;/* -------------------------------------------------------------------- *//*      Based on GType do what is appropriate.                          *//* -------------------------------------------------------------------- */        if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_LINESTRING) )        {            CPLAssert(wkbFlatten(poGeom->getGeometryType()) == wkbLineString);            return poGeom;        }        else if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_POINT) )        {            CPLAssert(wkbFlatten(poGeom->getGeometryType()) == wkbPoint);            return poGeom;        }        else if( ORA_GTYPE_MATCH(nGType,ORA_GTYPE_POLYGON) )        {            CPLAssert(wkbFlatten(poGeom->getGeometryType()) == wkbLineString );            poPolygon->addRingDirectly( (OGRLinearRing *) poGeom );        }        else         {            CPLAssert( poCollection != NULL );            if( wkbFlatten(poGeom->getGeometryType()) == wkbMultiPoint )            {                int  i;                OGRMultiPoint *poMP = (OGRMultiPoint *) poGeom;                for( i = 0; i < poMP->getNumGeometries(); i++ )                    poCollection->addGeometry( poMP->getGeometryRef(i) );                delete poMP;            }            else if( nEType % 1000 == 3 )            {                /* its one poly ring, create new poly or add to existing */                if( nEType > 999 && nEType < 2999 )                {                    if( poPolygon != NULL                         && poPolygon->getExteriorRing() != NULL )                    {                        poCollection->addGeometryDirectly( poPolygon );                        poPolygon = NULL;                    }                    poPolygon = new OGRPolygon();                }                				if( poPolygon != NULL )                    poPolygon->addRingDirectly( (OGRLinearRing *) poGeom );				else				{					CPLAssert( poPolygon != NULL );				}            }            else                poCollection->addGeometryDirectly( poGeom );        }    }    if( poCollection != NULL         && poPolygon != NULL )        poCollection->addGeometryDirectly( poPolygon );/* -------------------------------------------------------------------- *//*      Return resulting collection geometry.                           *//* -------------------------------------------------------------------- */    if( poCollection == NULL )        return poPolygon;    else        return poCollection;}/************************************************************************//*                      TranslateGeometryElement()                      *//************************************************************************/OGRGeometry *OGROCILayer::TranslateGeometryElement( int nGType, int nDimension,                                       int nEType, int nInterpretation,                                        int nStartOrdinal, int nOrdCount ){/* -------------------------------------------------------------------- *//*      Handle line strings.  For now we treat line strings of          *//*      curves as if they were simple point line strings.               *//* -------------------------------------------------------------------- */    if( nEType == 1 && nInterpretation == 1 )    {        OGRPoint *poPoint = new OGRPoint();        double dfX, dfY, dfZ = 0.0;        GetOrdinalPoint( nStartOrdinal, nDimension, &dfX, &dfY, &dfZ );        poPoint->setX( dfX );        poPoint->setY( dfY );        poPoint->setZ( dfZ );        return poPoint;    }/* -------------------------------------------------------------------- *//*      Handle line strings.  For now we treat line strings of          *//*      curves as if they were simple point line strings.               *//* -------------------------------------------------------------------- */    else if( nEType == 1 )    {        OGRMultiPoint *poMP = new OGRMultiPoint();        double dfX, dfY, dfZ = 0.0;        int i;        CPLAssert( nInterpretation == nOrdCount / nDimension );        for( i = 0; i < nInterpretation; i++ )        {            GetOrdinalPoint( nStartOrdinal + i*nDimension, nDimension,                              &dfX, &dfY, &dfZ );            OGRPoint *poPoint = new OGRPoint( dfX, dfY, dfZ );            poMP->addGeometryDirectly( poPoint );        }        return poMP;    }/* -------------------------------------------------------------------- *//*      Handle line strings.  For now we treat line strings of          *//*      curves as if they were simple point line strings.               *//* -------------------------------------------------------------------- */    else if( nEType == 2 )    {        OGRLineString *poLS = new OGRLineString();        int nPointCount = nOrdCount / nDimension, i;        poLS->setNumPoints( nPointCount );        for( i = 0; i < nPointCount; i++ )        {            double dfX, dfY, dfZ = 0.0;            GetOrdinalPoint( i*nDimension + nStartOrdinal, nDimension,                              &dfX, &dfY, &dfZ );            poLS->setPoint( i, dfX, dfY, dfZ );        }        return poLS;    }/* -------------------------------------------------------------------- *//*      Handle polygon rings.                                           *//* -------------------------------------------------------------------- */    else if( nEType % 1000 == 3              && (nInterpretation == 1 || nInterpretation == 2 ) )    {        OGRLinearRing *poLS = new OGRLinearRing();        int nPointCount = nOrdCount / nDimension, i;        poLS->setNumPoints( nPointCount );        for( i = 0; i < nPointCount; i++ )        {            double dfX, dfY, dfZ = 0.0;            GetOrdinalPoint( i*nDimension + nStartOrdinal, nDimension,                              &dfX, &dfY, &dfZ );            poLS->setPoint( i, dfX, dfY, dfZ );        }        return poLS;    }/* -------------------------------------------------------------------- *//*      Handle rectangle definitions ... translate into a linear ring.  *//* -------------------------------------------------------------------- */    else if( nEType % 1000 == 3 && nInterpretation == 3 )    {        OGRLinearRing *poLS = new OGRLinearRing();        double dfX1, dfY1, dfZ1 = 0.0;        double dfX2, dfY2, dfZ2 = 0.0;                GetOrdinalPoint( nStartOrdinal, nDimension,                          &dfX1, &dfY1, &dfZ1 );        GetOrdinalPoint( nStartOrdinal + nDimension, nDimension,                          &dfX2, &dfY2, &dfZ2 );                poLS->setNumPoints( 5 );        poLS->setPoint( 0, dfX1, dfY1, dfZ1 );        poLS->setPoint( 1, dfX2, dfY1, dfZ1 );        poLS->setPoint( 2, dfX2, dfY2, dfZ2 );        poLS->setPoint( 3, dfX1, dfY2, dfZ2 );        poLS->setPoint( 4, dfX1, dfY1, dfZ1 );        return poLS;    }    return NULL;}/************************************************************************//*                          GetOrdinalPoint()                           *//************************************************************************/int OGROCILayer::GetOrdinalPoint( int iOrdinal, int nDimension,                                  double *pdfX, double *pdfY, double *pdfZ ){    OGROCISession      *poSession = poDS->GetSession();    boolean bExists;    OCINumber *hNumber;    OCICollGetElem( poSession->hEnv, poSession->hError,                             (OCIColl *)(hLastGeom->sdo_ordinates),                     (sb4)iOrdinal+0, (boolean *)&bExists,                     (dvoid **)&hNumber, NULL );    OCINumberToReal(poSession->hError, hNumber,                     (uword)sizeof(double), (dvoid *)pdfX);    OCICollGetElem( poSession->hEnv, poSession->hError,                             (OCIColl *)(hLastGeom->sdo_ordinates),                     (sb4)iOrdinal + 1, (boolean *)&bExists,                     (dvoid **)&hNumber, NULL );    OCINumberToReal(poSession->hError, hNumber,                    (uword)sizeof(double), (dvoid *)pdfY);    if( nDimension == 3 )    {        OCICollGetElem( poSession->hEnv, poSession->hError,                        (OCIColl *)(hLastGeom->sdo_ordinates),                         (sb4)iOrdinal + 2, (boolean *)&bExists,                         (dvoid **)&hNumber, NULL );        OCINumberToReal(poSession->hError, hNumber,                        (uword)sizeof(double), (dvoid *)pdfZ);    }    return TRUE;}                                       /************************************************************************//*                           TestCapability()                           *//************************************************************************/int OGROCILayer::TestCapability( const char * pszCap ){    if( EQUAL(pszCap,OLCRandomRead) )        return TRUE;    else if( EQUAL(pszCap,OLCFastFeatureCount) )        return m_poFilterGeom == NULL;    else if( EQUAL(pszCap,OLCFastSpatialFilter) )        return TRUE;    else if( EQUAL(pszCap,OLCTransactions) )        return TRUE;    else         return FALSE;}/************************************************************************//*                          LookupTableSRID()                           *//*                                                                      *//*      Note that the table name may also be prefixed by the owner      *//*      with a dot separator.                                           *//************************************************************************/int OGROCILayer::LookupTableSRID(){/* -------------------------------------------------------------------- *//*      If we don't have a geometry column, there isn't much point      *//*      in trying.                                                      *//* -------------------------------------------------------------------- */    if( pszGeomName == NULL )        return -1;    /* -------------------------------------------------------------------- *//*      Split out the owner if available.                               *//* -------------------------------------------------------------------- */    const char *pszTableName = GetLayerDefn()->GetName();    char *pszOwner = NULL;    if( strstr(pszTableName,".") != NULL )    {        pszOwner = CPLStrdup(pszTableName);        pszTableName = strstr(pszTableName,".") + 1;        *(strstr(pszOwner,".")) = '\0';    }/* -------------------------------------------------------------------- *//*      Build our query command.                                        *//* -------------------------------------------------------------------- */    OGROCIStringBuf oCommand;    oCommand.Appendf( 1000, "SELECT SRID FROM ALL_SDO_GEOM_METADATA "                      "WHERE TABLE_NAME = '%s' AND COLUMN_NAME = '%s'",                       pszTableName, pszGeomName );        if( pszOwner != NULL )    {        oCommand.Appendf( 500, " AND OWNER = '%s'", pszOwner );        CPLFree( pszOwner );    }/* -------------------------------------------------------------------- *//*      Execute query command.                                          *//* -------------------------------------------------------------------- */    OGROCIStatement oGetTables( poDS->GetSession() );    int nSRID = -1;        if( oGetTables.Execute( oCommand.GetString() ) == CE_None )    {        char **papszRow = oGetTables.SimpleFetchRow();        if( papszRow != NULL && papszRow[0] != NULL )            nSRID = atoi( papszRow[0] );    }    return nSRID;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -