OGRErr OGRUnionLayer::GetExtent( OGREnvelope *psExtent, int bForce ) { if( sStaticEnvelope.IsInit() ) { memcpy(psExtent, &sStaticEnvelope, sizeof(OGREnvelope)); return OGRERR_NONE; } int bInit = FALSE; for(int i = 0; i < nSrcLayers; i++) { AutoWarpLayerIfNecessary(i); if( !bInit ) { if( papoSrcLayers[i]->GetExtent(psExtent, bForce) == OGRERR_NONE ) bInit = TRUE; } else { OGREnvelope sExtent; if( papoSrcLayers[i]->GetExtent(&sExtent, bForce) == OGRERR_NONE ) { psExtent->Merge(sExtent); } } } return (bInit) ? OGRERR_NONE : OGRERR_FAILURE; }
OGRErr OGRUnionLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) { if( iGeomField >= 0 && iGeomField < nGeomFields && papoGeomFields[iGeomField]->sStaticEnvelope.IsInit() ) { memcpy(psExtent, &papoGeomFields[iGeomField]->sStaticEnvelope, sizeof(OGREnvelope)); return OGRERR_NONE; } if( iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount() ) { CPLError(CE_Failure, CPLE_AppDefined, "Invalid geometry field index : %d", iGeomField); return OGRERR_FAILURE; } int bInit = FALSE; for(int i = 0; i < nSrcLayers; i++) { AutoWarpLayerIfNecessary(i); int iSrcGeomField = papoSrcLayers[i]->GetLayerDefn()->GetGeomFieldIndex( GetLayerDefn()->GetGeomFieldDefn(iGeomField)->GetNameRef()); if( iSrcGeomField >= 0 ) { if( !bInit ) { if( papoSrcLayers[i]->GetExtent(iSrcGeomField, psExtent, bForce) == OGRERR_NONE ) bInit = TRUE; } else { OGREnvelope sExtent; if( papoSrcLayers[i]->GetExtent(iSrcGeomField, &sExtent, bForce) == OGRERR_NONE ) { psExtent->Merge(sExtent); } } } } return (bInit) ? OGRERR_NONE : OGRERR_FAILURE; }
GIntBig OGRUnionLayer::GetFeatureCount( int bForce ) { if (nFeatureCount >= 0 && m_poFilterGeom == NULL && m_poAttrQuery == NULL) { return nFeatureCount; } if( !GetAttrFilterPassThroughValue() ) return OGRLayer::GetFeatureCount(bForce); GIntBig nRet = 0; for(int i = 0; i < nSrcLayers; i++) { AutoWarpLayerIfNecessary(i); ApplyAttributeFilterToSrcLayer(i); SetSpatialFilterToSourceLayer(papoSrcLayers[i]); nRet += papoSrcLayers[i]->GetFeatureCount(bForce); } ResetReading(); return nRet; }
void OGRUnionLayer::ConfigureActiveLayer() { AutoWarpLayerIfNecessary(iCurLayer); ApplyAttributeFilterToSrcLayer(iCurLayer); SetSpatialFilterToSourceLayer(papoSrcLayers[iCurLayer]); papoSrcLayers[iCurLayer]->ResetReading(); /* Establish map */ GetLayerDefn(); OGRFeatureDefn* poSrcFeatureDefn = papoSrcLayers[iCurLayer]->GetLayerDefn(); CPLFree(panMap); panMap = (int*) CPLMalloc(poSrcFeatureDefn->GetFieldCount() * sizeof(int)); for(int i=0; i < poSrcFeatureDefn->GetFieldCount(); i++) { OGRFieldDefn* poSrcFieldDefn = poSrcFeatureDefn->GetFieldDefn(i); if( CSLFindString(papszIgnoredFields, poSrcFieldDefn->GetNameRef() ) == -1 ) { panMap[i] = poFeatureDefn->GetFieldIndex(poSrcFieldDefn->GetNameRef()); } else { panMap[i] = -1; } } if( papoSrcLayers[iCurLayer]->TestCapability(OLCIgnoreFields) ) { char** papszIter = papszIgnoredFields; char** papszFieldsSrc = NULL; while ( papszIter != NULL && *papszIter != NULL ) { const char* pszFieldName = *papszIter; if ( EQUAL(pszFieldName, "OGR_GEOMETRY") || EQUAL(pszFieldName, "OGR_STYLE") || poSrcFeatureDefn->GetFieldIndex(pszFieldName) >= 0 || poSrcFeatureDefn->GetGeomFieldIndex(pszFieldName) >= 0 ) { papszFieldsSrc = CSLAddString(papszFieldsSrc, pszFieldName); } papszIter++; } /* Attribute fields */ int* panSrcFieldsUsed = (int*) CPLCalloc(sizeof(int), poSrcFeatureDefn->GetFieldCount()); for(int iField = 0; iField < poFeatureDefn->GetFieldCount(); iField++) { OGRFieldDefn* poFieldDefn = poFeatureDefn->GetFieldDefn(iField); int iSrcField = poSrcFeatureDefn->GetFieldIndex(poFieldDefn->GetNameRef()); if (iSrcField >= 0) panSrcFieldsUsed[iSrcField] = TRUE; } for(int iSrcField = 0; iSrcField < poSrcFeatureDefn->GetFieldCount(); iSrcField ++) { if( !panSrcFieldsUsed[iSrcField] ) { OGRFieldDefn *poSrcDefn = poSrcFeatureDefn->GetFieldDefn( iSrcField ); papszFieldsSrc = CSLAddString(papszFieldsSrc, poSrcDefn->GetNameRef()); } } CPLFree(panSrcFieldsUsed); /* geometry fields now */ panSrcFieldsUsed = (int*) CPLCalloc(sizeof(int), poSrcFeatureDefn->GetGeomFieldCount()); for(int iField = 0; iField < poFeatureDefn->GetGeomFieldCount(); iField++) { OGRGeomFieldDefn* poFieldDefn = poFeatureDefn->GetGeomFieldDefn(iField); int iSrcField = poSrcFeatureDefn->GetGeomFieldIndex(poFieldDefn->GetNameRef()); if (iSrcField >= 0) panSrcFieldsUsed[iSrcField] = TRUE; } for(int iSrcField = 0; iSrcField < poSrcFeatureDefn->GetGeomFieldCount(); iSrcField ++) { if( !panSrcFieldsUsed[iSrcField] ) { OGRGeomFieldDefn *poSrcDefn = poSrcFeatureDefn->GetGeomFieldDefn( iSrcField ); papszFieldsSrc = CSLAddString(papszFieldsSrc, poSrcDefn->GetNameRef()); } } CPLFree(panSrcFieldsUsed); papoSrcLayers[iCurLayer]->SetIgnoredFields((const char**)papszFieldsSrc); CSLDestroy(papszFieldsSrc); } }
int OGRUnionLayer::TestCapability( const char * pszCap ) { if( EQUAL(pszCap, OLCFastFeatureCount ) ) { if( nFeatureCount >= 0 && m_poFilterGeom == NULL && m_poAttrQuery == NULL ) return TRUE; if( !GetAttrFilterPassThroughValue() ) return FALSE; for(int i = 0; i < nSrcLayers; i++) { AutoWarpLayerIfNecessary(i); ApplyAttributeFilterToSrcLayer(i); SetSpatialFilterToSourceLayer(papoSrcLayers[i]); if( !papoSrcLayers[i]->TestCapability(pszCap) ) return FALSE; } return TRUE; } if( EQUAL(pszCap, OLCFastGetExtent ) ) { if( nGeomFields >= 1 && papoGeomFields[0]->sStaticEnvelope.IsInit() ) return TRUE; for(int i = 0; i < nSrcLayers; i++) { AutoWarpLayerIfNecessary(i); if( !papoSrcLayers[i]->TestCapability(pszCap) ) return FALSE; } return TRUE; } if( EQUAL(pszCap, OLCFastSpatialFilter) ) { for(int i = 0; i < nSrcLayers; i++) { AutoWarpLayerIfNecessary(i); ApplyAttributeFilterToSrcLayer(i); if( !papoSrcLayers[i]->TestCapability(pszCap) ) return FALSE; } return TRUE; } if( EQUAL(pszCap, OLCStringsAsUTF8) ) { for(int i = 0; i < nSrcLayers; i++) { if( !papoSrcLayers[i]->TestCapability(pszCap) ) return FALSE; } return TRUE; } if( EQUAL(pszCap, OLCRandomRead ) ) { if( !bPreserveSrcFID ) return FALSE; for(int i = 0; i < nSrcLayers; i++) { if( !papoSrcLayers[i]->TestCapability(pszCap) ) return FALSE; } return TRUE; } if( EQUAL(pszCap, OLCRandomWrite ) ) { if( !bPreserveSrcFID || osSourceLayerFieldName.size() == 0) return FALSE; for(int i = 0; i < nSrcLayers; i++) { if( !papoSrcLayers[i]->TestCapability(pszCap) ) return FALSE; } return TRUE; } if( EQUAL(pszCap, OLCSequentialWrite ) ) { if( osSourceLayerFieldName.size() == 0) return FALSE; for(int i = 0; i < nSrcLayers; i++) { if( !papoSrcLayers[i]->TestCapability(pszCap) ) return FALSE; } return TRUE; } if( EQUAL(pszCap, OLCIgnoreFields) ) return TRUE; if( EQUAL(pszCap,OLCCurveGeometries) ) return TRUE; return FALSE; }