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

📄 ogrvrtlayer.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 2 页
字号:
     else     {         if( poSrcLayer->GetSpatialRef() != NULL )             poSRS = poSrcLayer->GetSpatialRef()->Clone();         else             poSRS = NULL;     }/* -------------------------------------------------------------------- *//*      Handle GeometryField.                                           *//* -------------------------------------------------------------------- */     const char *pszEncoding;     pszEncoding = CPLGetXMLValue( psLTree,"GeometryField.encoding", "direct");     if( EQUAL(pszEncoding,"Direct") )         eGeometryType = VGS_Direct;     else if( EQUAL(pszEncoding,"None") )         eGeometryType = VGS_None;     else if( EQUAL(pszEncoding,"WKT") )     {         eGeometryType = VGS_WKT;     }     else if( EQUAL(pszEncoding,"WKB") )     {         eGeometryType = VGS_WKB;     }     else if( EQUAL(pszEncoding,"PointFromColumns") )     {         eGeometryType = VGS_PointFromColumns;         iGeomXField = poSrcLayer->GetLayerDefn()->GetFieldIndex(             CPLGetXMLValue( psLTree, "GeometryField.x", "missing" ) );         iGeomYField = poSrcLayer->GetLayerDefn()->GetFieldIndex(             CPLGetXMLValue( psLTree, "GeometryField.y", "missing" ) );         iGeomZField = poSrcLayer->GetLayerDefn()->GetFieldIndex(             CPLGetXMLValue( psLTree, "GeometryField.z", "missing" ) );         if( iGeomXField == -1 || iGeomYField == -1 )         {             CPLError( CE_Failure, CPLE_AppDefined,                        "Unable to identify source X or Y field for PointFromColumns encoding." );             return FALSE;         }     }     else     {         CPLError( CE_Failure, CPLE_AppDefined,                    "encoding=\"%s\" not recognised.", pszEncoding );         return FALSE;     }     if( eGeometryType == VGS_WKT || eGeometryType == VGS_WKB )     {         const char *pszFieldName =              CPLGetXMLValue( psLTree, "GeometryField.field", "missing" );         iGeomField = poSrcLayer->GetLayerDefn()->GetFieldIndex(pszFieldName);         if( iGeomField == -1 )         {             CPLError( CE_Failure, CPLE_AppDefined,                        "Unable to identify source field '%s' for geometry.",                       pszFieldName );             return FALSE;         }     }                                               /* -------------------------------------------------------------------- *//*      Figure out what should be used as an FID.                       *//* -------------------------------------------------------------------- */     const char *pszFIDFieldName = CPLGetXMLValue( psLTree, "FID", NULL );     if( pszFIDFieldName != NULL )     {         iFIDField =              poSrcLayer->GetLayerDefn()->GetFieldIndex( pszFIDFieldName );         if( iFIDField == -1 )         {             CPLError( CE_Failure, CPLE_AppDefined,                        "Unable to identify FID field '%s'.",                       pszFIDFieldName );             return FALSE;         }     }          return TRUE;}/************************************************************************//*                            ResetReading()                            *//************************************************************************/void OGRVRTLayer::ResetReading(){    bNeedReset = TRUE;}/************************************************************************//*                           GetNextFeature()                           *//************************************************************************/OGRFeature *OGRVRTLayer::GetNextFeature(){    if( poSrcLayer == NULL )        return NULL;    if( bNeedReset )    {        poSrcLayer->SetAttributeFilter( NULL );        poSrcLayer->SetSpatialFilter( NULL );        poSrcLayer->ResetReading();        bNeedReset = FALSE;    }    for( ; TRUE; )    {        OGRFeature      *poSrcFeature, *poFeature;        poSrcFeature = poSrcLayer->GetNextFeature();        if( poSrcFeature == NULL )            return NULL;        poFeature = TranslateFeature( poSrcFeature );        delete poSrcFeature;        if( poFeature == NULL )            return NULL;        if( (m_poFilterGeom == NULL            || FilterGeometry( poFeature->GetGeometryRef() ) )            && (m_poAttrQuery == NULL                || m_poAttrQuery->Evaluate( poFeature )) )            return poFeature;        delete poFeature;    }}/************************************************************************//*                          TranslateFeature()                          *//*                                                                      *//*      Translate a source feature into a feature for this layer.       *//************************************************************************/OGRFeature *OGRVRTLayer::TranslateFeature( OGRFeature *poSrcFeat ){    OGRFeature *poDstFeat = new OGRFeature( poFeatureDefn );    m_nFeaturesRead++;/* -------------------------------------------------------------------- *//*      Handle FID.  We should offer an option to derive it from a      *//*      field.  (TODO)                                                  *//* -------------------------------------------------------------------- */    if( iFIDField == -1 )        poDstFeat->SetFID( poSrcFeat->GetFID() );    else        poDstFeat->SetFID( poSrcFeat->GetFieldAsInteger( iFIDField ) );    /* -------------------------------------------------------------------- *//*      Handle the geometry.  Eventually there will be several more     *//*      supported options.                                              *//* -------------------------------------------------------------------- */    if( eGeometryType == VGS_None )    {        /* do nothing */    }    else if( eGeometryType == VGS_WKT )    {        char *pszWKT = (char *) poSrcFeat->GetFieldAsString( iGeomField );                if( pszWKT != NULL )        {            OGRGeometry *poGeom = NULL;            OGRGeometryFactory::createFromWkt( &pszWKT, NULL, &poGeom );            poDstFeat->SetGeometryDirectly( poGeom );        }    }    else if( eGeometryType == VGS_Direct )    {        poDstFeat->SetGeometry( poSrcFeat->GetGeometryRef() );    }    else if( eGeometryType == VGS_PointFromColumns )    {        double dfZ = 0.0;        if( iGeomZField != -1 )            dfZ = poSrcFeat->GetFieldAsDouble( iGeomZField );                poDstFeat->SetGeometryDirectly(             new OGRPoint( poSrcFeat->GetFieldAsDouble( iGeomXField ),                          poSrcFeat->GetFieldAsDouble( iGeomYField ),                          dfZ ) );    }    else        /* add other options here. */;/* -------------------------------------------------------------------- *//*      Copy fields.                                                    *//* -------------------------------------------------------------------- */    int iField;    for( iField = 0; iField < poFeatureDefn->GetFieldCount(); iField++ )    {        OGRFieldDefn *poDstDefn = poFeatureDefn->GetFieldDefn( iField );        if( panSrcField[iField] < 0 )            continue;        if( pabDirectCopy[iField]             && (poDstDefn->GetType() == OFTInteger                || poDstDefn->GetType() == OFTReal) )        {            memcpy( poDstFeat->GetRawFieldRef( iField ),                     poSrcFeat->GetRawFieldRef( panSrcField[iField] ),                     sizeof(OGRField) );            continue;        }        /* Eventually we need to offer some more sophisticated translation           options here for more esoteric types. */        poDstFeat->SetField( iField,                              poSrcFeat->GetFieldAsString(panSrcField[iField]));    }    return poDstFeat;}/************************************************************************//*                             GetFeature()                             *//************************************************************************/OGRFeature *OGRVRTLayer::GetFeature( long nFeatureId ){    if( poSrcLayer == NULL )        return NULL;    bNeedReset = TRUE;/* -------------------------------------------------------------------- *//*      If the FID is directly mapped, we can do a simple               *//*      GetFeature() to get our target feature.  Otherwise we need      *//*      to setup an appropriate query to get it.                        *//* -------------------------------------------------------------------- */    OGRFeature      *poSrcFeature, *poFeature;        if( iFIDField == -1 )    {        poSrcFeature = poSrcLayer->GetFeature( nFeatureId );    }    else     {        char szFIDQuery[200];        poSrcLayer->ResetReading();        sprintf( szFIDQuery, "%s = %ld",             poSrcLayer->GetLayerDefn()->GetFieldDefn(iFIDField)->GetNameRef(),                 nFeatureId );        poSrcLayer->SetSpatialFilter( NULL );        poSrcLayer->SetAttributeFilter( szFIDQuery );                poSrcFeature = poSrcLayer->GetNextFeature();    }    if( poSrcFeature == NULL )        return NULL;    /* -------------------------------------------------------------------- *//*      Translate feature and return it.                                *//* -------------------------------------------------------------------- */    poFeature = TranslateFeature( poSrcFeature );    delete poSrcFeature;    return poFeature;}/************************************************************************//*                           TestCapability()                           *//************************************************************************/int OGRVRTLayer::TestCapability( const char * pszCap ){    return FALSE;}/************************************************************************//*                           GetSpatialRef()                            *//************************************************************************/OGRSpatialReference *OGRVRTLayer::GetSpatialRef(){    return poSRS;}/************************************************************************//*                          GetFeatureCount()                           *//************************************************************************/int OGRVRTLayer::GetFeatureCount( int bForce ){    if( m_poFilterGeom == NULL && m_poAttrQuery == NULL )        return poSrcLayer->GetFeatureCount( bForce );    else        return OGRLayer::GetFeatureCount( bForce );}

⌨️ 快捷键说明

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