📄 ogrvrtlayer.cpp
字号:
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 + -