void OGRWarpedLayer::SetSpatialFilter( OGRGeometry * poGeom ) { OGRLayer::SetSpatialFilter(poGeom); if( poGeom == NULL || m_poReversedCT == NULL ) { m_poDecoratedLayer->SetSpatialFilter(NULL); } else { OGREnvelope sEnvelope; poGeom->getEnvelope(&sEnvelope); if( ReprojectEnvelope(&sEnvelope, m_poReversedCT) ) { m_poDecoratedLayer->SetSpatialFilterRect(sEnvelope.MinX, sEnvelope.MinY, sEnvelope.MaxX, sEnvelope.MaxY); } else { m_poDecoratedLayer->SetSpatialFilter(NULL); } } }
OGRErr OGRWarpedLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) { if( iGeomField == m_iGeomField ) { if( sStaticEnvelope.IsInit() ) { memcpy(psExtent, &sStaticEnvelope, sizeof(OGREnvelope)); return OGRERR_NONE; } OGREnvelope sExtent; OGRErr eErr = m_poDecoratedLayer->GetExtent(m_iGeomField, &sExtent, bForce); if( eErr != OGRERR_NONE ) return eErr; if( ReprojectEnvelope(&sExtent, m_poCT) ) { memcpy(psExtent, &sExtent, sizeof(OGREnvelope)); return OGRERR_NONE; } else return OGRERR_FAILURE; } else return m_poDecoratedLayer->GetExtent(iGeomField, psExtent, bForce); }
void OGRWarpedLayer::SetSpatialFilter( int iGeomField, OGRGeometry *poGeom ) { if( iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount() ) { CPLError(CE_Failure, CPLE_AppDefined, "Invalid geometry field index : %d", iGeomField); return; } m_iGeomFieldFilter = iGeomField; if( InstallFilter( poGeom ) ) ResetReading(); if( m_iGeomFieldFilter == m_iGeomField ) { if( poGeom == NULL || m_poReversedCT == NULL ) { m_poDecoratedLayer->SetSpatialFilter(m_iGeomFieldFilter, NULL); } else { OGREnvelope sEnvelope; poGeom->getEnvelope(&sEnvelope); if( CPLIsInf(sEnvelope.MinX) && CPLIsInf(sEnvelope.MinY) && CPLIsInf(sEnvelope.MaxX) && CPLIsInf(sEnvelope.MaxY) ) { m_poDecoratedLayer->SetSpatialFilterRect(m_iGeomFieldFilter, sEnvelope.MinX, sEnvelope.MinY, sEnvelope.MaxX, sEnvelope.MaxY); } else if( ReprojectEnvelope(&sEnvelope, m_poReversedCT) ) { m_poDecoratedLayer->SetSpatialFilterRect(m_iGeomFieldFilter, sEnvelope.MinX, sEnvelope.MinY, sEnvelope.MaxX, sEnvelope.MaxY); } else { m_poDecoratedLayer->SetSpatialFilter(m_iGeomFieldFilter, NULL); } } } else { m_poDecoratedLayer->SetSpatialFilter(m_iGeomFieldFilter, poGeom); } }