OGRFeature *OGRUnionLayer::GetNextFeature() { if( poFeatureDefn == NULL ) GetLayerDefn(); if( iCurLayer < 0 ) ResetReading(); if( iCurLayer == nSrcLayers ) return NULL; while( true ) { OGRFeature* poSrcFeature = papoSrcLayers[iCurLayer]->GetNextFeature(); if( poSrcFeature == NULL ) { iCurLayer ++; if( iCurLayer < nSrcLayers ) { ConfigureActiveLayer(); continue; } else break; } OGRFeature* poFeature = TranslateFromSrcLayer(poSrcFeature); delete poSrcFeature; if( (m_poFilterGeom == NULL || FilterGeometry( poFeature->GetGeomFieldRef(m_iGeomFieldFilter) ) ) && (m_poAttrQuery == NULL || m_poAttrQuery->Evaluate( poFeature )) ) { return poFeature; } delete poFeature; } return NULL; }
OGRFeature *OGRUnionLayer::GetFeature( GIntBig nFeatureId ) { OGRFeature* poFeature = NULL; if( !bPreserveSrcFID ) { poFeature = OGRLayer::GetFeature(nFeatureId); } else { int iGeomFieldFilterSave = m_iGeomFieldFilter; OGRGeometry* poGeomSave = m_poFilterGeom; m_poFilterGeom = NULL; SetSpatialFilter(NULL); for(int i=0;i<nSrcLayers;i++) { iCurLayer = i; ConfigureActiveLayer(); OGRFeature* poSrcFeature = papoSrcLayers[i]->GetFeature(nFeatureId); if( poSrcFeature != NULL ) { poFeature = TranslateFromSrcLayer(poSrcFeature); delete poSrcFeature; break; } } SetSpatialFilter(iGeomFieldFilterSave, poGeomSave); delete poGeomSave; ResetReading(); } return poFeature; }
OGRFeature *OGRUnionLayer::GetFeature( long nFeatureId ) { if( !bPreserveSrcFID ) return OGRLayer::GetFeature(nFeatureId); for(int i=0;i<nSrcLayers;i++) { iCurLayer = i; ConfigureActiveLayer(); OGRFeature* poSrcFeature = papoSrcLayers[i]->GetFeature(nFeatureId); if( poSrcFeature != NULL ) { OGRFeature* poFeature = TranslateFromSrcLayer(poSrcFeature); delete poSrcFeature; return poFeature; } } ResetReading(); return NULL; }
void OGRUnionLayer::ResetReading() { iCurLayer = 0; ConfigureActiveLayer(); nNextFID = 0; }