diff --git a/MIGRATION_GUIDE.TXT b/MIGRATION_GUIDE.TXT index ba9cfc713aee..fc09f286e357 100644 --- a/MIGRATION_GUIDE.TXT +++ b/MIGRATION_GUIDE.TXT @@ -12,6 +12,13 @@ MIGRATION GUIDE FROM GDAL 3.10 to GDAL 3.11 ``bool bForce``). Drivers must implement IGetExtent3D(int iGeomField, OGREnvelope3D*, bool bForce). The user-facing method checks that the iGeomField value is in range. +- The OGRLayer::SetSpatialFilter() and SetSpatialFilterRect() methods are + no longer virtual methods that are implemented by drivers. They are now + user facing methods (with the change that they return OGRErr instead of void, + and accept a ``const OGRGeometry*``). Drivers must implement + ISetSpatialFilter(int iGeomField, const OGRGeometry*). The user-facing methods + check that the iGeomField value is in range. + - GDAL drivers may now return raster bands with the new data types GDT_Float16 or GDT_CFloat16. Code that use the GDAL API must be ready to react to the new data type, possibly by doing RasterIO() diff --git a/apps/ogr2ogr_lib.cpp b/apps/ogr2ogr_lib.cpp index f72c19593fbf..ed507ce88a50 100644 --- a/apps/ogr2ogr_lib.cpp +++ b/apps/ogr2ogr_lib.cpp @@ -795,26 +795,10 @@ class OGRSplitListFieldLayer : public OGRLayer return poSrcLayer->GetStyleTable(); } - virtual void SetSpatialFilter(OGRGeometry *poGeom) override + virtual OGRErr ISetSpatialFilter(int iGeom, + const OGRGeometry *poGeom) override { - poSrcLayer->SetSpatialFilter(poGeom); - } - - virtual void SetSpatialFilter(int iGeom, OGRGeometry *poGeom) override - { - poSrcLayer->SetSpatialFilter(iGeom, poGeom); - } - - virtual void SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) override - { - poSrcLayer->SetSpatialFilterRect(dfMinX, dfMinY, dfMaxX, dfMaxY); - } - - virtual void SetSpatialFilterRect(int iGeom, double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) override - { - poSrcLayer->SetSpatialFilterRect(iGeom, dfMinX, dfMinY, dfMaxX, dfMaxY); + return poSrcLayer->SetSpatialFilter(iGeom, poGeom); } virtual OGRErr SetAttributeFilter(const char *pszFilter) override diff --git a/autotest/ogr/ogr_geojson.py b/autotest/ogr/ogr_geojson.py index ee83ba27c291..8a367786d1f3 100755 --- a/autotest/ogr/ogr_geojson.py +++ b/autotest/ogr/ogr_geojson.py @@ -648,7 +648,8 @@ def test_ogr_geojson_23(tmp_vsimem): lyr.CreateFeature(feat) assert lyr.GetExtent() == (1.0, 2.0, 10.0, 20.0) assert lyr.GetExtent(geom_field=0) == (1.0, 2.0, 10.0, 20.0) - assert lyr.GetExtent(geom_field=1, can_return_null=True) is None + with gdaltest.disable_exceptions(): + assert lyr.GetExtent(geom_field=1, can_return_null=True) is None lyr = None ds = None diff --git a/autotest/ogr/ogr_oapif.py b/autotest/ogr/ogr_oapif.py index 8159efad971f..7a4ba0a56c27 100755 --- a/autotest/ogr/ogr_oapif.py +++ b/autotest/ogr/ogr_oapif.py @@ -548,7 +548,7 @@ def NO_LONGER_USED_test_ogr_oapif_fc_links_next_headers(): ############################################################################### -def test_ogr_oapif_spatial_filter(): +def test_ogr_oapif_spatial_filter_deprecated_api(): # Deprecated API handler = webserver.SequentialHandler() @@ -568,7 +568,31 @@ def test_ogr_oapif_spatial_filter(): ds = ogr.Open("OAPIF:http://localhost:%d/oapif" % gdaltest.webserver_port) lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCFastGetExtent) - assert lyr.GetExtent() == (-10.0, 15.0, 40.0, 50.0) + + handler = webserver.SequentialHandler() + _add_dummy_root_and_api_pages(handler) + handler.add( + "GET", + "/oapif/collections/foo/items?limit=20", + 200, + {"Content-Type": "application/geo+json"}, + """{ "type": "FeatureCollection", "features": [ + { + "type": "Feature", + "properties": { + "foo": "bar" + } + } + ] }""", + ) + with webserver.install_http_handler(handler): + assert lyr.GetExtent() == (-10.0, 15.0, 40.0, 50.0) + + +############################################################################### + + +def test_ogr_oapif_spatial_filter(): # Nominal API handler = webserver.SequentialHandler() @@ -591,7 +615,6 @@ def test_ogr_oapif_spatial_filter(): with webserver.install_http_handler(handler): ds = ogr.Open("OAPIF:http://localhost:%d/oapif" % gdaltest.webserver_port) lyr = ds.GetLayer(0) - assert lyr.GetExtent() == (-10.0, 15.0, 40.0, 50.0) handler = webserver.SequentialHandler() _add_dummy_root_and_api_pages(handler) @@ -610,6 +633,7 @@ def test_ogr_oapif_spatial_filter(): ] }""", ) with webserver.install_http_handler(handler): + assert lyr.GetExtent() == (-10.0, 15.0, 40.0, 50.0) assert lyr.GetLayerDefn().GetFieldCount() == 1 lyr.SetSpatialFilterRect(2, 49, 3, 50) @@ -1365,11 +1389,6 @@ def test_ogr_oapif_storage_crs_easting_northing(): with webserver.install_http_handler(handler): ds = ogr.Open("OAPIF:http://localhost:%d/oapif" % gdaltest.webserver_port) lyr = ds.GetLayer(0) - minx, maxx, miny, maxy = lyr.GetExtent() - assert (minx, miny, maxx, maxy) == pytest.approx( - (-611288.854779237, 4427761.561734099, 1525592.2813932528, 5620112.89047953), - abs=1e-3, - ) handler = webserver.SequentialHandler() _add_dummy_root_and_api_pages(handler) @@ -1389,10 +1408,16 @@ def test_ogr_oapif_storage_crs_easting_northing(): ] }""", ) with webserver.install_http_handler(handler): - srs = lyr.GetSpatialRef() - assert srs - assert srs.GetAuthorityCode(None) == "32631" - assert lyr.GetLayerDefn().GetFieldCount() == 1 + minx, maxx, miny, maxy = lyr.GetExtent() + assert (minx, miny, maxx, maxy) == pytest.approx( + (-611288.854779237, 4427761.561734099, 1525592.2813932528, 5620112.89047953), + abs=1e-3, + ) + + srs = lyr.GetSpatialRef() + assert srs + assert srs.GetAuthorityCode(None) == "32631" + assert lyr.GetLayerDefn().GetFieldCount() == 1 handler = webserver.SequentialHandler() handler.add( @@ -1467,8 +1492,6 @@ def test_ogr_oapif_storage_crs_latitude_longitude(): with webserver.install_http_handler(handler): ds = ogr.Open("OAPIF:http://localhost:%d/oapif" % gdaltest.webserver_port) lyr = ds.GetLayer(0) - minx, maxx, miny, maxy = lyr.GetExtent() - assert (minx, miny, maxx, maxy) == pytest.approx((-10, 40, 15, 50), abs=1e-3) handler = webserver.SequentialHandler() _add_dummy_root_and_api_pages(handler) @@ -1488,12 +1511,15 @@ def test_ogr_oapif_storage_crs_latitude_longitude(): ] }""", ) with webserver.install_http_handler(handler): - srs = lyr.GetSpatialRef() - assert srs - assert srs.GetAuthorityCode(None) == "4326" - assert srs.GetDataAxisToSRSAxisMapping() == [2, 1] - assert srs.GetCoordinateEpoch() == 2022.5 - assert lyr.GetLayerDefn().GetFieldCount() == 1 + minx, maxx, miny, maxy = lyr.GetExtent() + assert (minx, miny, maxx, maxy) == pytest.approx((-10, 40, 15, 50), abs=1e-3) + + srs = lyr.GetSpatialRef() + assert srs + assert srs.GetAuthorityCode(None) == "4326" + assert srs.GetDataAxisToSRSAxisMapping() == [2, 1] + assert srs.GetCoordinateEpoch() == 2022.5 + assert lyr.GetLayerDefn().GetFieldCount() == 1 handler = webserver.SequentialHandler() # Coordinates must be in lat, lon order in the GeoJSON answer @@ -1573,11 +1599,6 @@ def test_ogr_oapif_storage_crs_latitude_longitude_non_compliant_server(): open_options=["SERVER_FEATURE_AXIS_ORDER=GIS_FRIENDLY"], ) lyr = ds.GetLayer(0) - minx, maxx, miny, maxy = lyr.GetExtent() - assert (minx, miny, maxx, maxy) == pytest.approx((-10, 40, 15, 50), abs=1e-3) - - supported_srs_list = lyr.GetSupportedSRSList() - assert supported_srs_list is None handler = webserver.SequentialHandler() _add_dummy_root_and_api_pages(handler) @@ -1597,12 +1618,18 @@ def test_ogr_oapif_storage_crs_latitude_longitude_non_compliant_server(): ] }""", ) with webserver.install_http_handler(handler): - srs = lyr.GetSpatialRef() - assert srs - assert srs.GetAuthorityCode(None) == "4326" - assert srs.GetDataAxisToSRSAxisMapping() == [2, 1] - assert srs.GetCoordinateEpoch() == 2022.5 - assert lyr.GetLayerDefn().GetFieldCount() == 1 + minx, maxx, miny, maxy = lyr.GetExtent() + assert (minx, miny, maxx, maxy) == pytest.approx((-10, 40, 15, 50), abs=1e-3) + + supported_srs_list = lyr.GetSupportedSRSList() + assert supported_srs_list is None + + srs = lyr.GetSpatialRef() + assert srs + assert srs.GetAuthorityCode(None) == "4326" + assert srs.GetDataAxisToSRSAxisMapping() == [2, 1] + assert srs.GetCoordinateEpoch() == 2022.5 + assert lyr.GetLayerDefn().GetFieldCount() == 1 handler = webserver.SequentialHandler() # Coordinates must be in lat, lon order in the GeoJSON answer @@ -1665,19 +1692,6 @@ def get_collections_handler(): assert ds lyr = ds.GetLayer(0) - minx, maxx, miny, maxy = lyr.GetExtent() - assert (minx, miny, maxx, maxy) == pytest.approx( - (-611288.854779237, 4427761.561734099, 1525592.2813932528, 5620112.89047953), - abs=1e-3, - ) - - supported_srs_list = lyr.GetSupportedSRSList() - assert supported_srs_list - assert len(supported_srs_list) == 2 - assert supported_srs_list[0].GetAuthorityCode(None) == "32631" - # Below doesn't work with early PROJ 6 versions - # assert supported_srs_list[1].GetAuthorityCode(None) == "CRS84" - def get_items_handler(): handler = webserver.SequentialHandler() _add_dummy_root_and_api_pages(handler) @@ -1699,9 +1713,22 @@ def get_items_handler(): return handler with webserver.install_http_handler(get_items_handler()): - srs = lyr.GetSpatialRef() - assert srs - assert srs.GetAuthorityCode(None) == "32631" + minx, maxx, miny, maxy = lyr.GetExtent() + assert (minx, miny, maxx, maxy) == pytest.approx( + (-611288.854779237, 4427761.561734099, 1525592.2813932528, 5620112.89047953), + abs=1e-3, + ) + + supported_srs_list = lyr.GetSupportedSRSList() + assert supported_srs_list + assert len(supported_srs_list) == 2 + assert supported_srs_list[0].GetAuthorityCode(None) == "32631" + # Below doesn't work with early PROJ 6 versions + # assert supported_srs_list[1].GetAuthorityCode(None) == "CRS84" + + srs = lyr.GetSpatialRef() + assert srs + assert srs.GetAuthorityCode(None) == "32631" json_info = gdal.VectorInfo(ds, format="json", featureCount=False) assert "supportedSRSList" in json_info["layers"][0]["geometryFields"][0] diff --git a/autotest/ogr/ogr_sql_sqlite.py b/autotest/ogr/ogr_sql_sqlite.py index 63130f113f5b..3b79d7ce6cd0 100755 --- a/autotest/ogr/ogr_sql_sqlite.py +++ b/autotest/ogr/ogr_sql_sqlite.py @@ -2473,7 +2473,7 @@ def test_ogr_sql_sqlite_execute_sql_error_on_spatial_filter_mem_layer(): ds.CreateLayer("test") geom = ogr.CreateGeometryFromWkt("POLYGON((0 0,0 1,1 1,1 0,0 0))") with pytest.raises( - Exception, match="Cannot set spatial filter: no geometry field selected" + Exception, match="Cannot set spatial filter: no geometry field present in layer" ): ds.ExecuteSQL("SELECT 1 FROM test", spatialFilter=geom, dialect="SQLITE") @@ -2490,6 +2490,6 @@ def test_ogr_sql_sqlite_execute_sql_error_on_spatial_filter_shp_layer(tmp_vsimem ds.CreateLayer("test") geom = ogr.CreateGeometryFromWkt("POLYGON((0 0,0 1,1 1,1 0,0 0))") with pytest.raises( - Exception, match="Cannot set spatial filter: no geometry field selected" + Exception, match="Cannot set spatial filter: no geometry field present in layer" ): ds.ExecuteSQL("SELECT 1 FROM test", spatialFilter=geom, dialect="SQLITE") diff --git a/autotest/ogr/ogr_vrt.py b/autotest/ogr/ogr_vrt.py index e2ec52a08062..bd42431dfc30 100755 --- a/autotest/ogr/ogr_vrt.py +++ b/autotest/ogr/ogr_vrt.py @@ -2381,9 +2381,9 @@ def test_ogr_vrt_33b(ogr_vrt_33, tmp_path): ret = gdaltest.runexternal( test_cli_utilities.get_test_ogrsf_path() + f" -ro {tmp_path}/ogr_vrt_33.vrt" ) - os.unlink(tmp_path / "ogr_vrt_33.vrt") - assert ret.find("INFO") != -1 and ret.find("ERROR") == -1 + assert "INFO" in ret + assert "ERROR" not in ret @pytest.mark.require_driver("CSV") diff --git a/frmts/eeda/eedadataset.cpp b/frmts/eeda/eedadataset.cpp index 05e7cb6d703d..4e98c56ba970 100644 --- a/frmts/eeda/eedadataset.cpp +++ b/frmts/eeda/eedadataset.cpp @@ -140,13 +140,8 @@ class GDALEEDALayer final : public OGRLayer return -1; } - virtual void SetSpatialFilter(OGRGeometry *poGeom) CPL_OVERRIDE; - - virtual void SetSpatialFilter(int iGeomField, - OGRGeometry *poGeom) CPL_OVERRIDE - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) CPL_OVERRIDE; @@ -938,10 +933,11 @@ OGRErr GDALEEDALayer::SetAttributeFilter(const char *pszQuery) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void GDALEEDALayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr GDALEEDALayer::ISetSpatialFilter(int /* iGeomField */, + const OGRGeometry *poGeomIn) { if (poGeomIn) { @@ -960,6 +956,7 @@ void GDALEEDALayer::SetSpatialFilter(OGRGeometry *poGeomIn) InstallFilter(poGeomIn); ResetReading(); + return OGRERR_NONE; } /************************************************************************/ diff --git a/frmts/mbtiles/mbtilesdataset.cpp b/frmts/mbtiles/mbtilesdataset.cpp index 1e14ba7071c5..b383cf91ca69 100644 --- a/frmts/mbtiles/mbtilesdataset.cpp +++ b/frmts/mbtiles/mbtilesdataset.cpp @@ -274,12 +274,8 @@ class MBTilesVectorLayer final : public OGRLayer virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) override; - virtual void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRFeature *GetFeature(GIntBig nFID) override; }; @@ -1565,71 +1561,76 @@ void MBTilesVectorLayer::ResetReading() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void MBTilesVectorLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr MBTilesVectorLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - OGRLayer::SetSpatialFilter(poGeomIn); - - if (m_poFilterGeom != nullptr && m_sFilterEnvelope.MinX <= -MAX_GM && - m_sFilterEnvelope.MinY <= -MAX_GM && m_sFilterEnvelope.MaxX >= MAX_GM && - m_sFilterEnvelope.MaxY >= MAX_GM) - { - if (m_bZoomLevelAuto) - { - m_nZoomLevel = m_poDS->m_nMinZoomLevel; - } - m_nFilterMinX = 0; - m_nFilterMinY = 0; - m_nFilterMaxX = (1 << m_nZoomLevel) - 1; - m_nFilterMaxY = (1 << m_nZoomLevel) - 1; - } - else if (m_poFilterGeom != nullptr && - m_sFilterEnvelope.MinX >= -10 * MAX_GM && - m_sFilterEnvelope.MinY >= -10 * MAX_GM && - m_sFilterEnvelope.MaxX <= 10 * MAX_GM && - m_sFilterEnvelope.MaxY <= 10 * MAX_GM) - { - if (m_bZoomLevelAuto) - { - double dfExtent = - std::min(m_sFilterEnvelope.MaxX - m_sFilterEnvelope.MinX, - m_sFilterEnvelope.MaxY - m_sFilterEnvelope.MinY); - m_nZoomLevel = std::max( - m_poDS->m_nMinZoomLevel, - std::min(static_cast(0.5 + log(2 * MAX_GM / dfExtent) / - log(2.0)), - m_poDS->m_nZoomLevel)); - CPLDebug("MBTILES", "Zoom level = %d", m_nZoomLevel); - } - const double dfTileDim = 2 * MAX_GM / (1 << m_nZoomLevel); - m_nFilterMinX = - std::max(0, static_cast(floor( - (m_sFilterEnvelope.MinX + MAX_GM) / dfTileDim))); - m_nFilterMinY = - std::max(0, static_cast(floor( - (m_sFilterEnvelope.MinY + MAX_GM) / dfTileDim))); - m_nFilterMaxX = - std::min(static_cast( - ceil((m_sFilterEnvelope.MaxX + MAX_GM) / dfTileDim)), - (1 << m_nZoomLevel) - 1); - m_nFilterMaxY = - std::min(static_cast( - ceil((m_sFilterEnvelope.MaxY + MAX_GM) / dfTileDim)), - (1 << m_nZoomLevel) - 1); - } - else + OGRErr eErr = OGRLayer::ISetSpatialFilter(iGeomField, poGeomIn); + if (eErr == OGRERR_NONE) { - if (m_bZoomLevelAuto) + if (m_poFilterGeom != nullptr && m_sFilterEnvelope.MinX <= -MAX_GM && + m_sFilterEnvelope.MinY <= -MAX_GM && + m_sFilterEnvelope.MaxX >= MAX_GM && + m_sFilterEnvelope.MaxY >= MAX_GM) { - m_nZoomLevel = m_poDS->m_nZoomLevel; + if (m_bZoomLevelAuto) + { + m_nZoomLevel = m_poDS->m_nMinZoomLevel; + } + m_nFilterMinX = 0; + m_nFilterMinY = 0; + m_nFilterMaxX = (1 << m_nZoomLevel) - 1; + m_nFilterMaxY = (1 << m_nZoomLevel) - 1; + } + else if (m_poFilterGeom != nullptr && + m_sFilterEnvelope.MinX >= -10 * MAX_GM && + m_sFilterEnvelope.MinY >= -10 * MAX_GM && + m_sFilterEnvelope.MaxX <= 10 * MAX_GM && + m_sFilterEnvelope.MaxY <= 10 * MAX_GM) + { + if (m_bZoomLevelAuto) + { + double dfExtent = + std::min(m_sFilterEnvelope.MaxX - m_sFilterEnvelope.MinX, + m_sFilterEnvelope.MaxY - m_sFilterEnvelope.MinY); + m_nZoomLevel = std::max( + m_poDS->m_nMinZoomLevel, + std::min(static_cast(0.5 + log(2 * MAX_GM / dfExtent) / + log(2.0)), + m_poDS->m_nZoomLevel)); + CPLDebug("MBTILES", "Zoom level = %d", m_nZoomLevel); + } + const double dfTileDim = 2 * MAX_GM / (1 << m_nZoomLevel); + m_nFilterMinX = std::max( + 0, static_cast( + floor((m_sFilterEnvelope.MinX + MAX_GM) / dfTileDim))); + m_nFilterMinY = std::max( + 0, static_cast( + floor((m_sFilterEnvelope.MinY + MAX_GM) / dfTileDim))); + m_nFilterMaxX = + std::min(static_cast(ceil( + (m_sFilterEnvelope.MaxX + MAX_GM) / dfTileDim)), + (1 << m_nZoomLevel) - 1); + m_nFilterMaxY = + std::min(static_cast(ceil( + (m_sFilterEnvelope.MaxY + MAX_GM) / dfTileDim)), + (1 << m_nZoomLevel) - 1); + } + else + { + if (m_bZoomLevelAuto) + { + m_nZoomLevel = m_poDS->m_nZoomLevel; + } + m_nFilterMinX = 0; + m_nFilterMinY = 0; + m_nFilterMaxX = (1 << m_nZoomLevel) - 1; + m_nFilterMaxY = (1 << m_nZoomLevel) - 1; } - m_nFilterMinX = 0; - m_nFilterMinY = 0; - m_nFilterMaxX = (1 << m_nZoomLevel) - 1; - m_nFilterMaxY = (1 << m_nZoomLevel) - 1; } + return eErr; } /************************************************************************/ diff --git a/frmts/ogcapi/gdalogcapidataset.cpp b/frmts/ogcapi/gdalogcapidataset.cpp index 0e71c87da00e..b59afc75a331 100644 --- a/frmts/ogcapi/gdalogcapidataset.cpp +++ b/frmts/ogcapi/gdalogcapidataset.cpp @@ -300,12 +300,8 @@ class OGCAPITiledLayer final OGRErr IGetExtent(int iGeomFiel, OGREnvelope *psExtent, bool bForce) override; - void SetSpatialFilter(OGRGeometry *) override; - - void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; OGRFeature *GetFeature(GIntBig nFID) override; int TestCapability(const char *) override; @@ -2778,51 +2774,55 @@ OGRErr OGCAPITiledLayer::IGetExtent(int /* iGeomField */, OGREnvelope *psExtent, } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGCAPITiledLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGCAPITiledLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - OGRLayer::SetSpatialFilter(poGeomIn); - - OGREnvelope sEnvelope; - if (m_poFilterGeom != nullptr) - sEnvelope = m_sFilterEnvelope; - else - sEnvelope = m_sEnvelope; - - const double dfTileDim = m_oTileMatrix.mResX * m_oTileMatrix.mTileWidth; - const double dfOriX = - m_bInvertAxis ? m_oTileMatrix.mTopLeftY : m_oTileMatrix.mTopLeftX; - const double dfOriY = - m_bInvertAxis ? m_oTileMatrix.mTopLeftX : m_oTileMatrix.mTopLeftY; - if (sEnvelope.MinX - dfOriX >= -10 * dfTileDim && - dfOriY - sEnvelope.MinY >= -10 * dfTileDim && - sEnvelope.MaxX - dfOriX <= 10 * dfTileDim && - dfOriY - sEnvelope.MaxY <= 10 * dfTileDim) - { - m_nCurMinX = std::max( - m_nMinX, - static_cast(floor((sEnvelope.MinX - dfOriX) / dfTileDim))); - m_nCurMinY = std::max( - m_nMinY, - static_cast(floor((dfOriY - sEnvelope.MaxY) / dfTileDim))); - m_nCurMaxX = std::min( - m_nMaxX, - static_cast(floor((sEnvelope.MaxX - dfOriX) / dfTileDim))); - m_nCurMaxY = std::min( - m_nMaxY, - static_cast(floor((dfOriY - sEnvelope.MinY) / dfTileDim))); - } - else + const OGRErr eErr = OGRLayer::ISetSpatialFilter(iGeomField, poGeomIn); + if (eErr == OGRERR_NONE) { - m_nCurMinX = m_nMinX; - m_nCurMinY = m_nMinY; - m_nCurMaxX = m_nMaxX; - m_nCurMaxY = m_nMaxY; - } + OGREnvelope sEnvelope; + if (m_poFilterGeom != nullptr) + sEnvelope = m_sFilterEnvelope; + else + sEnvelope = m_sEnvelope; - ResetReading(); + const double dfTileDim = m_oTileMatrix.mResX * m_oTileMatrix.mTileWidth; + const double dfOriX = + m_bInvertAxis ? m_oTileMatrix.mTopLeftY : m_oTileMatrix.mTopLeftX; + const double dfOriY = + m_bInvertAxis ? m_oTileMatrix.mTopLeftX : m_oTileMatrix.mTopLeftY; + if (sEnvelope.MinX - dfOriX >= -10 * dfTileDim && + dfOriY - sEnvelope.MinY >= -10 * dfTileDim && + sEnvelope.MaxX - dfOriX <= 10 * dfTileDim && + dfOriY - sEnvelope.MaxY <= 10 * dfTileDim) + { + m_nCurMinX = std::max( + m_nMinX, + static_cast(floor((sEnvelope.MinX - dfOriX) / dfTileDim))); + m_nCurMinY = std::max( + m_nMinY, + static_cast(floor((dfOriY - sEnvelope.MaxY) / dfTileDim))); + m_nCurMaxX = std::min( + m_nMaxX, + static_cast(floor((sEnvelope.MaxX - dfOriX) / dfTileDim))); + m_nCurMaxY = std::min( + m_nMaxY, + static_cast(floor((dfOriY - sEnvelope.MinY) / dfTileDim))); + } + else + { + m_nCurMinX = m_nMinX; + m_nCurMinY = m_nMinY; + m_nCurMaxX = m_nMaxX; + m_nCurMaxY = m_nMaxY; + } + + ResetReading(); + } + return eErr; } /************************************************************************/ diff --git a/gcore/gdalpythondriverloader.cpp b/gcore/gdalpythondriverloader.cpp index db2fda824088..1769622a7d54 100644 --- a/gcore/gdalpythondriverloader.cpp +++ b/gcore/gdalpythondriverloader.cpp @@ -335,8 +335,7 @@ class PythonPluginLayer final : public OGRLayer const char *GetFIDColumn() override; OGRErr SetAttributeFilter(const char *) override; - void SetSpatialFilter(OGRGeometry *) override; - void SetSpatialFilter(int iGeomField, OGRGeometry *) override; + OGRErr ISetSpatialFilter(int iGeomField, const OGRGeometry *) override; OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) override; @@ -507,19 +506,16 @@ void PythonPluginLayer::StoreSpatialFilter() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void PythonPluginLayer::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr PythonPluginLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) { - OGRLayer::SetSpatialFilter(poGeom); - StoreSpatialFilter(); -} - -void PythonPluginLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) -{ - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - StoreSpatialFilter(); + const OGRErr eErr = OGRLayer::ISetSpatialFilter(iGeomField, poGeom); + if (eErr == OGRERR_NONE) + StoreSpatialFilter(); + return eErr; } /************************************************************************/ diff --git a/gnm/gnm.h b/gnm/gnm.h index 643b47d72b61..41641d83451f 100644 --- a/gnm/gnm.h +++ b/gnm/gnm.h @@ -495,14 +495,9 @@ class GNMGenericLayer : public OGRLayer // OGRLayer Interface virtual OGRGeometry *GetSpatialFilter() override; - virtual void SetSpatialFilter(OGRGeometry *) override; - virtual void SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; - virtual void SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, - double dfMaxY) override; + + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *) override; virtual OGRErr SetAttributeFilter(const char *) override; diff --git a/gnm/gnmlayer.cpp b/gnm/gnmlayer.cpp index bfae4b8f97c6..c2f73551fbb6 100644 --- a/gnm/gnmlayer.cpp +++ b/gnm/gnmlayer.cpp @@ -181,27 +181,10 @@ OGRGeometry *GNMGenericLayer::GetSpatialFilter() return m_poLayer->GetSpatialFilter(); } -void GNMGenericLayer::SetSpatialFilter(OGRGeometry *poGeometry) +OGRErr GNMGenericLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeometry) { - m_poLayer->SetSpatialFilter(poGeometry); -} - -void GNMGenericLayer::SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) -{ - m_poLayer->SetSpatialFilterRect(dfMinX, dfMinY, dfMaxX, dfMaxY); -} - -void GNMGenericLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeometry) -{ - m_poLayer->SetSpatialFilter(iGeomField, poGeometry); -} - -void GNMGenericLayer::SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, - double dfMaxY) -{ - m_poLayer->SetSpatialFilterRect(iGeomField, dfMinX, dfMinY, dfMaxX, dfMaxY); + return m_poLayer->SetSpatialFilter(iGeomField, poGeometry); } OGRErr GNMGenericLayer::SetAttributeFilter(const char *pszFilter) diff --git a/ogr/ogrsf_frmts/adbc/ogr_adbc.h b/ogr/ogrsf_frmts/adbc/ogr_adbc.h index 3a6517b95147..0ecdf99c50e6 100644 --- a/ogr/ogrsf_frmts/adbc/ogr_adbc.h +++ b/ogr/ogrsf_frmts/adbc/ogr_adbc.h @@ -154,13 +154,9 @@ class OGRADBCLayer final : public OGRLayer, CSLConstList papszOptions = nullptr) override; GIntBig GetFeatureCount(int bForce) override; - void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } - OGRErr SetAttributeFilter(const char *pszFilter) override; - void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) override; diff --git a/ogr/ogrsf_frmts/adbc/ogradbclayer.cpp b/ogr/ogrsf_frmts/adbc/ogradbclayer.cpp index 726128971776..8cfe1920dc01 100644 --- a/ogr/ogrsf_frmts/adbc/ogradbclayer.cpp +++ b/ogr/ogrsf_frmts/adbc/ogradbclayer.cpp @@ -735,15 +735,13 @@ OGRErr OGRADBCLayer::SetAttributeFilter(const char *pszFilter) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRADBCLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) +OGRErr OGRADBCLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - if (!ValidateGeometryFieldIndexForSetSpatialFilter(iGeomField, poGeomIn)) - return; - if (iGeomField < GetLayerDefn()->GetGeomFieldCount()) { m_iGeomFieldFilter = iGeomField; @@ -751,6 +749,7 @@ void OGRADBCLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) ResetReading(); UpdateStatement(); } + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/amigocloud/ogr_amigocloud.h b/ogr/ogrsf_frmts/amigocloud/ogr_amigocloud.h index fe8f621973ae..4bfc98bc52d8 100644 --- a/ogr/ogrsf_frmts/amigocloud/ogr_amigocloud.h +++ b/ogr/ogrsf_frmts/amigocloud/ogr_amigocloud.h @@ -181,12 +181,8 @@ class OGRAmigoCloudTableLayer final : public OGRAmigoCloudLayer virtual OGRErr ISetFeature(OGRFeature *poFeature) override; virtual OGRErr DeleteFeature(GIntBig nFID) override; - virtual void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) override; virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, diff --git a/ogr/ogrsf_frmts/amigocloud/ogramigocloudtablelayer.cpp b/ogr/ogrsf_frmts/amigocloud/ogramigocloudtablelayer.cpp index 62fd91b9efe9..a0531e54d3ff 100644 --- a/ogr/ogrsf_frmts/amigocloud/ogramigocloudtablelayer.cpp +++ b/ogr/ogrsf_frmts/amigocloud/ogramigocloudtablelayer.cpp @@ -279,23 +279,13 @@ OGRErr OGRAmigoCloudTableLayer::SetAttributeFilter(const char *pszQuery) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRAmigoCloudTableLayer::SetSpatialFilter(int iGeomField, - OGRGeometry *poGeomIn) +OGRErr OGRAmigoCloudTableLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount() || - GetLayerDefn()->GetGeomFieldDefn(iGeomField)->GetType() == wkbNone) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return; - } m_iGeomFieldFilter = iGeomField; if (InstallFilter(poGeomIn)) @@ -304,6 +294,7 @@ void OGRAmigoCloudTableLayer::SetSpatialFilter(int iGeomField, ResetReading(); } + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/arrow_common/ogr_arrow.h b/ogr/ogrsf_frmts/arrow_common/ogr_arrow.h index ab0b4ca10d22..e82de160e7c7 100644 --- a/ogr/ogrsf_frmts/arrow_common/ogr_arrow.h +++ b/ogr/ogrsf_frmts/arrow_common/ogr_arrow.h @@ -304,12 +304,8 @@ class OGRArrowLayer CPL_NON_FINAL bool bForce) override; OGRErr SetAttributeFilter(const char *pszFilter) override; - void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } - - void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; int TestCapability(const char *pszCap) override; diff --git a/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp b/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp index 780c5e73e281..0bb21a73ca51 100644 --- a/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp +++ b/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp @@ -5099,16 +5099,13 @@ OGRArrowLayer::GetExtentFromMetadata(const CPLJSONObject &oJSONDef, } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -inline void OGRArrowLayer::SetSpatialFilter(int iGeomField, - OGRGeometry *poGeomIn) +inline OGRErr OGRArrowLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - if (!ValidateGeometryFieldIndexForSetSpatialFilter(iGeomField, poGeomIn)) - return; - // When changing filters, we need to invalidate cached batches, as // PostFilterArrowArray() has potentially modified array contents if (m_poFilterGeom) @@ -5132,6 +5129,7 @@ inline void OGRArrowLayer::SetSpatialFilter(int iGeomField, } SetBatch(m_poBatch); + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/carto/ogr_carto.h b/ogr/ogrsf_frmts/carto/ogr_carto.h index faf77089779c..7bffe63198d2 100644 --- a/ogr/ogrsf_frmts/carto/ogr_carto.h +++ b/ogr/ogrsf_frmts/carto/ogr_carto.h @@ -164,12 +164,9 @@ class OGRCARTOTableLayer final : public OGRCARTOLayer virtual OGRErr ISetFeature(OGRFeature *poFeature) override; virtual OGRErr DeleteFeature(GIntBig nFID) override; - virtual void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) override; OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, diff --git a/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp b/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp index 8c7a17879e83..c4bc29761b55 100644 --- a/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp +++ b/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp @@ -432,22 +432,13 @@ OGRErr OGRCARTOTableLayer::SetAttributeFilter(const char *pszQuery) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRCARTOTableLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) +OGRErr OGRCARTOTableLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount() || - GetLayerDefn()->GetGeomFieldDefn(iGeomField)->GetType() == wkbNone) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return; - } m_iGeomFieldFilter = iGeomField; if (InstallFilter(poGeomIn)) @@ -456,6 +447,8 @@ void OGRCARTOTableLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) ResetReading(); } + + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/csw/ogrcswdataset.cpp b/ogr/ogrsf_frmts/csw/ogrcswdataset.cpp index 168b6a7b5192..e9f9995514b6 100644 --- a/ogr/ogrsf_frmts/csw/ogrcswdataset.cpp +++ b/ogr/ogrsf_frmts/csw/ogrcswdataset.cpp @@ -65,12 +65,8 @@ class OGRCSWLayer final : public OGRLayer return FALSE; } - virtual void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) override; }; @@ -692,14 +688,18 @@ GDALDataset *OGRCSWLayer::FetchGetRecords() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRCSWLayer::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr OGRCSWLayer::ISetSpatialFilter(int iGeomField, const OGRGeometry *poGeom) { - OGRLayer::SetSpatialFilter(poGeom); - ResetReading(); - BuildQuery(); + const OGRErr eErr = OGRLayer::ISetSpatialFilter(iGeomField, poGeom); + if (eErr == OGRERR_NONE) + { + ResetReading(); + BuildQuery(); + } + return eErr; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/dgn/ogr_dgn.h b/ogr/ogrsf_frmts/dgn/ogr_dgn.h index 307845d41294..b69b75b98ed3 100644 --- a/ogr/ogrsf_frmts/dgn/ogr_dgn.h +++ b/ogr/ogrsf_frmts/dgn/ogr_dgn.h @@ -53,12 +53,8 @@ class OGRDGNLayer final : public OGRLayer int bUpdate); virtual ~OGRDGNLayer(); - void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; void ResetReading() override; OGRFeature *GetNextFeature() override; diff --git a/ogr/ogrsf_frmts/dgn/ogrdgnlayer.cpp b/ogr/ogrsf_frmts/dgn/ogrdgnlayer.cpp index 533e5c654b9a..408d486bdd7d 100644 --- a/ogr/ogrsf_frmts/dgn/ogrdgnlayer.cpp +++ b/ogr/ogrsf_frmts/dgn/ogrdgnlayer.cpp @@ -187,14 +187,14 @@ OGRDGNLayer::~OGRDGNLayer() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRDGNLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGRDGNLayer::ISetSpatialFilter(int, const OGRGeometry *poGeomIn) { if (!InstallFilter(poGeomIn)) - return; + return OGRERR_NONE; if (m_poFilterGeom != nullptr) { @@ -208,6 +208,7 @@ void OGRDGNLayer::SetSpatialFilter(OGRGeometry *poGeomIn) } ResetReading(); + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/elastic/ogr_elastic.h b/ogr/ogrsf_frmts/elastic/ogr_elastic.h index e1970f84d493..637ca6c8c1fd 100644 --- a/ogr/ogrsf_frmts/elastic/ogr_elastic.h +++ b/ogr/ogrsf_frmts/elastic/ogr_elastic.h @@ -188,12 +188,9 @@ class OGRElasticLayer final : public OGRLayer virtual GIntBig GetFeatureCount(int bForce) override; - virtual void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *pszFilter) override; virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, @@ -301,8 +298,8 @@ class OGRElasticAggregationLayer final GIntBig GetFeatureCount(int bForce) override; int TestCapability(const char *) override; - using OGRLayer::SetSpatialFilter; - void SetSpatialFilter(OGRGeometry *poGeom) override; + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; GDALDataset *GetDataset() override; diff --git a/ogr/ogrsf_frmts/elastic/ogrelasticaggregationlayer.cpp b/ogr/ogrsf_frmts/elastic/ogrelasticaggregationlayer.cpp index 57f433fa27bc..32bbf383eca2 100644 --- a/ogr/ogrsf_frmts/elastic/ogrelasticaggregationlayer.cpp +++ b/ogr/ogrsf_frmts/elastic/ogrelasticaggregationlayer.cpp @@ -226,15 +226,20 @@ void OGRElasticAggregationLayer::ResetReading() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRElasticAggregationLayer::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr OGRElasticAggregationLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) { - OGRLayer::SetSpatialFilter(poGeom); - m_bFeaturesRequested = false; - m_apoCachedFeatures.clear(); + const OGRErr eErr = OGRLayer::ISetSpatialFilter(iGeomField, poGeom); + if (eErr == OGRERR_NONE) + { + m_bFeaturesRequested = false; + m_apoCachedFeatures.clear(); + } + return eErr; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/elastic/ogrelasticlayer.cpp b/ogr/ogrsf_frmts/elastic/ogrelasticlayer.cpp index 2610ae6a03d3..ffd16b88c810 100644 --- a/ogr/ogrsf_frmts/elastic/ogrelasticlayer.cpp +++ b/ogr/ogrsf_frmts/elastic/ogrelasticlayer.cpp @@ -3772,24 +3772,15 @@ void OGRElasticLayer::ClampEnvelope(OGREnvelope &sEnvelope) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRElasticLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) +OGRErr OGRElasticLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { FinalizeFeatureDefn(); - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount() || - GetLayerDefn()->GetGeomFieldDefn(iGeomField)->GetType() == wkbNone) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return; - } m_iGeomFieldFilter = iGeomField; InstallFilter(poGeomIn); @@ -3798,14 +3789,14 @@ void OGRElasticLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) m_poSpatialFilter = nullptr; if (poGeomIn == nullptr) - return; + return OGRERR_NONE; if (!m_osESSearch.empty()) { CPLError( CE_Failure, CPLE_AppDefined, "Setting a spatial filter on a resulting layer is not supported"); - return; + return OGRERR_FAILURE; } OGREnvelope sEnvelope; @@ -3815,7 +3806,7 @@ void OGRElasticLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) if (sEnvelope.MinX == -180 && sEnvelope.MinY == -90 && sEnvelope.MaxX == 180 && sEnvelope.MaxY == 90) { - return; + return OGRERR_NONE; } m_poSpatialFilter = json_object_new_object(); @@ -3884,6 +3875,8 @@ void OGRElasticLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) json_object_new_double_with_precision(sEnvelope.MinY, 6)); json_object_array_add(coordinates, bottom_right); } + + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/filegdb/FGdbLayer.cpp b/ogr/ogrsf_frmts/filegdb/FGdbLayer.cpp index fa3ece2cfc7e..f27933a096e2 100644 --- a/ogr/ogrsf_frmts/filegdb/FGdbLayer.cpp +++ b/ogr/ogrsf_frmts/filegdb/FGdbLayer.cpp @@ -1027,13 +1027,13 @@ void FGdbLayer::ResetReading() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void FGdbLayer::SetSpatialFilter(OGRGeometry *pOGRGeom) +OGRErr FGdbLayer::ISetSpatialFilter(int iGeomField, const OGRGeometry *pOGRGeom) { m_bFilterDirty = true; - OGRLayer::SetSpatialFilter(pOGRGeom); + return OGRLayer::ISetSpatialFilter(iGeomField, pOGRGeom); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/filegdb/ogr_fgdb.h b/ogr/ogrsf_frmts/filegdb/ogr_fgdb.h index 4e6db96af54c..35461f984a80 100644 --- a/ogr/ogrsf_frmts/filegdb/ogr_fgdb.h +++ b/ogr/ogrsf_frmts/filegdb/ogr_fgdb.h @@ -145,12 +145,8 @@ class FGdbLayer final : public FGdbBaseLayer virtual GIntBig GetFeatureCount(int bForce) override; virtual OGRErr SetAttributeFilter(const char *pszQuery) override; - virtual void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; OGRFeatureDefn *GetLayerDefn() override { diff --git a/ogr/ogrsf_frmts/generic/ogr_gensql.cpp b/ogr/ogrsf_frmts/generic/ogr_gensql.cpp index b109f270a389..641131d4c1c0 100644 --- a/ogr/ogrsf_frmts/generic/ogr_gensql.cpp +++ b/ogr/ogrsf_frmts/generic/ogr_gensql.cpp @@ -2754,17 +2754,14 @@ OGRErr OGRGenSQLResultsLayer::SetAttributeFilter(const char *pszAttributeFilter) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRGenSQLResultsLayer::SetSpatialFilter(int iGeomField, - OGRGeometry *poGeom) +OGRErr OGRGenSQLResultsLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) { InvalidateOrderByIndex(); - if (iGeomField == 0) - OGRLayer::SetSpatialFilter(poGeom); - else - OGRLayer::SetSpatialFilter(iGeomField, poGeom); + return OGRLayer::ISetSpatialFilter(iGeomField, poGeom); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/generic/ogr_gensql.h b/ogr/ogrsf_frmts/generic/ogr_gensql.h index bbafea6dd95e..22c6b964a5e7 100644 --- a/ogr/ogrsf_frmts/generic/ogr_gensql.h +++ b/ogr/ogrsf_frmts/generic/ogr_gensql.h @@ -122,12 +122,8 @@ class OGRGenSQLResultsLayer final : public OGRLayer virtual int TestCapability(const char *) override; - virtual void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *) override; virtual OGRErr SetAttributeFilter(const char *) override; bool GetArrowStream(struct ArrowArrayStream *out_stream, diff --git a/ogr/ogrsf_frmts/generic/ogreditablelayer.cpp b/ogr/ogrsf_frmts/generic/ogreditablelayer.cpp index 399136e4eb68..2c2ded31b8d3 100644 --- a/ogr/ogrsf_frmts/generic/ogreditablelayer.cpp +++ b/ogr/ogrsf_frmts/generic/ogreditablelayer.cpp @@ -551,60 +551,25 @@ bool OGREditableLayer::GetArrowStream(struct ArrowArrayStream *out_stream, } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGREditableLayer::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr OGREditableLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) { - SetSpatialFilter(0, poGeom); -} - -/************************************************************************/ -/* SetSpatialFilter() */ -/************************************************************************/ - -void OGREditableLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) -{ - if (iGeomField < 0 || - (iGeomField != 0 && iGeomField >= GetLayerDefn()->GetGeomFieldCount())) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - return; - } - m_iGeomFieldFilter = iGeomField; if (InstallFilter(poGeom)) ResetReading(); - int iSrcGeomFieldIdx = GetSrcGeomFieldIndex(iGeomField); + OGRErr eErr = OGRERR_NONE; + const int iSrcGeomFieldIdx = GetSrcGeomFieldIndex(iGeomField); if (iSrcGeomFieldIdx >= 0) { - m_poDecoratedLayer->SetSpatialFilter(iSrcGeomFieldIdx, poGeom); + eErr = m_poDecoratedLayer->SetSpatialFilter(iSrcGeomFieldIdx, poGeom); } - m_poMemLayer->SetSpatialFilter(iGeomField, poGeom); -} - -/************************************************************************/ -/* SetSpatialFilterRect() */ -/************************************************************************/ - -void OGREditableLayer::SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) -{ - return OGRLayer::SetSpatialFilterRect(dfMinX, dfMinY, dfMaxX, dfMaxY); -} - -/************************************************************************/ -/* SetSpatialFilterRect() */ -/************************************************************************/ - -void OGREditableLayer::SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, - double dfMaxY) -{ - return OGRLayer::SetSpatialFilterRect(iGeomField, dfMinX, dfMinY, dfMaxX, - dfMaxY); + if (eErr == OGRERR_NONE) + eErr = m_poMemLayer->SetSpatialFilter(iGeomField, poGeom); + return eErr; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/generic/ogreditablelayer.h b/ogr/ogrsf_frmts/generic/ogreditablelayer.h index bac3749c5090..bebf94811602 100644 --- a/ogr/ogrsf_frmts/generic/ogreditablelayer.h +++ b/ogr/ogrsf_frmts/generic/ogreditablelayer.h @@ -65,13 +65,8 @@ class CPL_DLL OGREditableLayer : public OGRLayerDecorator void SetSupportsCurveGeometries(bool bSupportsCurveGeometries); virtual OGRGeometry *GetSpatialFilter() override; - virtual void SetSpatialFilter(OGRGeometry *) override; - virtual void SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) override; - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; - virtual void SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, - double dfMaxY) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *) override; virtual OGRErr SetAttributeFilter(const char *) override; virtual bool GetArrowStream(struct ArrowArrayStream *out_stream, diff --git a/ogr/ogrsf_frmts/generic/ogrlayer.cpp b/ogr/ogrsf_frmts/generic/ogrlayer.cpp index 8e34f1ce31d9..ca106aacf412 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayer.cpp +++ b/ogr/ogrsf_frmts/generic/ogrlayer.cpp @@ -1699,45 +1699,172 @@ bool OGRLayer::ValidateGeometryFieldIndexForSetSpatialFilter( /* SetSpatialFilter() */ /************************************************************************/ -void OGRLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +/** + \brief Set a new spatial filter. -{ - if (poGeomIn && !ValidateGeometryFieldIndexForSetSpatialFilter(0, poGeomIn)) - return; + This method set the geometry to be used as a spatial filter when + fetching features via the GetNextFeature() method. Only features that + geometrically intersect the filter geometry will be returned. - m_iGeomFieldFilter = 0; - if (InstallFilter(poGeomIn)) - ResetReading(); + Currently this test is may be inaccurately implemented, but it is + guaranteed that all features whose envelope (as returned by + OGRGeometry::getEnvelope()) overlaps the envelope of the spatial filter + will be returned. This can result in more shapes being returned that + should strictly be the case. + + Starting with GDAL 2.3, features with null or empty geometries will never + be considered as matching a spatial filter. + + This method makes an internal copy of the passed geometry. The + passed geometry remains the responsibility of the caller, and may + be safely destroyed. + + For the time being the passed filter geometry should be in the same + SRS as the layer (as returned by OGRLayer::GetSpatialRef()). In the + future this may be generalized. + + This method is the same as the C function OGR_L_SetSpatialFilter(). + + @param poFilter the geometry to use as a filtering region. NULL may + be passed indicating that the current spatial filter should be cleared, + but no new one instituted. + */ + +OGRErr OGRLayer::SetSpatialFilter(const OGRGeometry *poFilter) + +{ + return SetSpatialFilter(0, poFilter); } -void OGRLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) +/** + \brief Set a new spatial filter. + + This method set the geometry to be used as a spatial filter when + fetching features via the GetNextFeature() method. Only features that + geometrically intersect the filter geometry will be returned. + + Currently this test is may be inaccurately implemented, but it is + guaranteed that all features who's envelope (as returned by + OGRGeometry::getEnvelope()) overlaps the envelope of the spatial filter + will be returned. This can result in more shapes being returned that + should strictly be the case. + + This method makes an internal copy of the passed geometry. The + passed geometry remains the responsibility of the caller, and may + be safely destroyed. + + For the time being the passed filter geometry should be in the same + SRS as the geometry field definition it corresponds to (as returned by + GetLayerDefn()->OGRFeatureDefn::GetGeomFieldDefn(iGeomField)->GetSpatialRef()). In the + future this may be generalized. + + Note that only the last spatial filter set is applied, even if several + successive calls are done with different iGeomField values. + + This method is the same as the C function OGR_L_SetSpatialFilterEx(). + + @param iGeomField index of the geometry field on which the spatial filter + operates. + @param poFilter the geometry to use as a filtering region. NULL may + be passed indicating that the current spatial filter should be cleared, + but no new one instituted. + + @since GDAL 1.11 + */ + +OGRErr OGRLayer::SetSpatialFilter(int iGeomField, const OGRGeometry *poFilter) { if (iGeomField == 0) { - if (poGeomIn && - !ValidateGeometryFieldIndexForSetSpatialFilter(0, poGeomIn)) - return; - - m_iGeomFieldFilter = iGeomField; - SetSpatialFilter(poGeomIn); + if (poFilter && + !ValidateGeometryFieldIndexForSetSpatialFilter(0, poFilter)) + { + return OGRERR_FAILURE; + } } else { if (!ValidateGeometryFieldIndexForSetSpatialFilter(iGeomField, - poGeomIn)) - return; - - m_iGeomFieldFilter = iGeomField; - if (InstallFilter(poGeomIn)) - ResetReading(); + poFilter)) + { + return OGRERR_FAILURE; + } } + + return ISetSpatialFilter(iGeomField, poFilter); +} + +/************************************************************************/ +/* ISetSpatialFilter() */ +/************************************************************************/ + +/** + \brief Set a new spatial filter. + + Virtual method implemented by drivers since 3.11. In previous versions, + SetSpatialFilter() / SetSpatialFilterRect() itself was the virtual method. + + Driver implementations, when wanting to call the base method, must take + care of calling OGRLayer::ISetSpatialFilter() (and note the public method without + the leading I). + + @param iGeomField index of the geometry field on which the spatial filter + operates. + @param poFilter the geometry to use as a filtering region. NULL may + be passed indicating that the current spatial filter should be cleared, + but no new one instituted. + + @since GDAL 3.11 + */ + +OGRErr OGRLayer::ISetSpatialFilter(int iGeomField, const OGRGeometry *poFilter) + +{ + m_iGeomFieldFilter = iGeomField; + if (InstallFilter(poFilter)) + ResetReading(); + return OGRERR_NONE; } /************************************************************************/ /* OGR_L_SetSpatialFilter() */ /************************************************************************/ +/** + \brief Set a new spatial filter. + + This function set the geometry to be used as a spatial filter when + fetching features via the OGR_L_GetNextFeature() function. Only + features that geometrically intersect the filter geometry will be + returned. + + Currently this test is may be inaccurately implemented, but it is + guaranteed that all features whose envelope (as returned by + OGR_G_GetEnvelope()) overlaps the envelope of the spatial filter + will be returned. This can result in more shapes being returned that + should strictly be the case. + + Starting with GDAL 2.3, features with null or empty geometries will never + be considered as matching a spatial filter. + + This function makes an internal copy of the passed geometry. The + passed geometry remains the responsibility of the caller, and may + be safely destroyed. + + For the time being the passed filter geometry should be in the same + SRS as the layer (as returned by OGR_L_GetSpatialRef()). In the + future this may be generalized. + + This function is the same as the C++ method OGRLayer::SetSpatialFilter. + + @param hLayer handle to the layer on which to set the spatial filter. + @param hGeom handle to the geometry to use as a filtering region. NULL may + be passed indicating that the current spatial filter should be cleared, + but no new one instituted. + + */ + void OGR_L_SetSpatialFilter(OGRLayerH hLayer, OGRGeometryH hGeom) { @@ -1756,6 +1883,45 @@ void OGR_L_SetSpatialFilter(OGRLayerH hLayer, OGRGeometryH hGeom) /* OGR_L_SetSpatialFilterEx() */ /************************************************************************/ +/** + \brief Set a new spatial filter. + + This function set the geometry to be used as a spatial filter when + fetching features via the OGR_L_GetNextFeature() function. Only + features that geometrically intersect the filter geometry will be + returned. + + Currently this test is may be inaccurately implemented, but it is + guaranteed that all features who's envelope (as returned by + OGR_G_GetEnvelope()) overlaps the envelope of the spatial filter + will be returned. This can result in more shapes being returned that + should strictly be the case. + + This function makes an internal copy of the passed geometry. The + passed geometry remains the responsibility of the caller, and may + be safely destroyed. + + For the time being the passed filter geometry should be in the same + SRS as the geometry field definition it corresponds to (as returned by + GetLayerDefn()->OGRFeatureDefn::GetGeomFieldDefn(iGeomField)->GetSpatialRef()). In the + future this may be generalized. + + Note that only the last spatial filter set is applied, even if several + successive calls are done with different iGeomField values. + + This function is the same as the C++ method OGRLayer::SetSpatialFilter. + + @param hLayer handle to the layer on which to set the spatial filter. + @param iGeomField index of the geometry field on which the spatial filter + operates. + @param hGeom handle to the geometry to use as a filtering region. NULL may + be passed indicating that the current spatial filter should be cleared, + but no new one instituted. + + @since GDAL 1.11 + + */ + void OGR_L_SetSpatialFilterEx(OGRLayerH hLayer, int iGeomField, OGRGeometryH hGeom) @@ -1775,39 +1941,116 @@ void OGR_L_SetSpatialFilterEx(OGRLayerH hLayer, int iGeomField, /* SetSpatialFilterRect() */ /************************************************************************/ -void OGRLayer::SetSpatialFilterRect(double dfMinX, double dfMinY, double dfMaxX, - double dfMaxY) +/** + \brief Set a new rectangular spatial filter. + + This method set rectangle to be used as a spatial filter when + fetching features via the GetNextFeature() method. Only features that + geometrically intersect the given rectangle will be returned. + + The x/y values should be in the same coordinate system as the layer as + a whole (as returned by OGRLayer::GetSpatialRef()). Internally this + method is normally implemented as creating a 5 vertex closed rectangular + polygon and passing it to OGRLayer::SetSpatialFilter(). It exists as + a convenience. + + The only way to clear a spatial filter set with this method is to + call OGRLayer::SetSpatialFilter(NULL). + + This method is the same as the C function OGR_L_SetSpatialFilterRect(). + + @param dfMinX the minimum X coordinate for the rectangular region. + @param dfMinY the minimum Y coordinate for the rectangular region. + @param dfMaxX the maximum X coordinate for the rectangular region. + @param dfMaxY the maximum Y coordinate for the rectangular region. + + */ + +OGRErr OGRLayer::SetSpatialFilterRect(double dfMinX, double dfMinY, + double dfMaxX, double dfMaxY) { - SetSpatialFilterRect(0, dfMinX, dfMinY, dfMaxX, dfMaxY); + return SetSpatialFilterRect(0, dfMinX, dfMinY, dfMaxX, dfMaxY); } -void OGRLayer::SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, double dfMaxY) +/** + \brief Set a new rectangular spatial filter. + + This method set rectangle to be used as a spatial filter when + fetching features via the GetNextFeature() method. Only features that + geometrically intersect the given rectangle will be returned. + + The x/y values should be in the same coordinate system as as the geometry + field definition it corresponds to (as returned by + GetLayerDefn()->OGRFeatureDefn::GetGeomFieldDefn(iGeomField)->GetSpatialRef()). Internally this + method is normally implemented as creating a 5 vertex closed rectangular + polygon and passing it to OGRLayer::SetSpatialFilter(). It exists as + a convenience. + + The only way to clear a spatial filter set with this method is to + call OGRLayer::SetSpatialFilter(NULL). + + This method is the same as the C function OGR_L_SetSpatialFilterRectEx(). + + @param iGeomField index of the geometry field on which the spatial filter + operates. + @param dfMinX the minimum X coordinate for the rectangular region. + @param dfMinY the minimum Y coordinate for the rectangular region. + @param dfMaxX the maximum X coordinate for the rectangular region. + @param dfMaxY the maximum Y coordinate for the rectangular region. + + @since GDAL 1.11 + */ + +OGRErr OGRLayer::SetSpatialFilterRect(int iGeomField, double dfMinX, + double dfMinY, double dfMaxX, + double dfMaxY) { - OGRLinearRing oRing; + auto poRing = std::make_unique(); OGRPolygon oPoly; - oRing.addPoint(dfMinX, dfMinY); - oRing.addPoint(dfMinX, dfMaxY); - oRing.addPoint(dfMaxX, dfMaxY); - oRing.addPoint(dfMaxX, dfMinY); - oRing.addPoint(dfMinX, dfMinY); + poRing->addPoint(dfMinX, dfMinY); + poRing->addPoint(dfMinX, dfMaxY); + poRing->addPoint(dfMaxX, dfMaxY); + poRing->addPoint(dfMaxX, dfMinY); + poRing->addPoint(dfMinX, dfMinY); - oPoly.addRing(&oRing); + oPoly.addRing(std::move(poRing)); - if (iGeomField == 0) - /* for drivers that only overload SetSpatialFilter(OGRGeometry*) */ - SetSpatialFilter(&oPoly); - else - SetSpatialFilter(iGeomField, &oPoly); + return SetSpatialFilter(iGeomField, &oPoly); } /************************************************************************/ /* OGR_L_SetSpatialFilterRect() */ /************************************************************************/ +/** + \brief Set a new rectangular spatial filter. + + This method set rectangle to be used as a spatial filter when + fetching features via the OGR_L_GetNextFeature() method. Only features that + geometrically intersect the given rectangle will be returned. + + The x/y values should be in the same coordinate system as the layer as + a whole (as returned by OGRLayer::GetSpatialRef()). Internally this + method is normally implemented as creating a 5 vertex closed rectangular + polygon and passing it to OGRLayer::SetSpatialFilter(). It exists as + a convenience. + + The only way to clear a spatial filter set with this method is to + call OGRLayer::SetSpatialFilter(NULL). + + This method is the same as the C++ method OGRLayer::SetSpatialFilterRect(). + + @param hLayer handle to the layer on which to set the spatial filter. + @param dfMinX the minimum X coordinate for the rectangular region. + @param dfMinY the minimum Y coordinate for the rectangular region. + @param dfMaxX the maximum X coordinate for the rectangular region. + @param dfMaxY the maximum Y coordinate for the rectangular region. + + */ + void OGR_L_SetSpatialFilterRect(OGRLayerH hLayer, double dfMinX, double dfMinY, double dfMaxX, double dfMaxY) @@ -1828,6 +2071,36 @@ void OGR_L_SetSpatialFilterRect(OGRLayerH hLayer, double dfMinX, double dfMinY, /* OGR_L_SetSpatialFilterRectEx() */ /************************************************************************/ +/** + \brief Set a new rectangular spatial filter. + + This method set rectangle to be used as a spatial filter when + fetching features via the OGR_L_GetNextFeature() method. Only features that + geometrically intersect the given rectangle will be returned. + + The x/y values should be in the same coordinate system as as the geometry + field definition it corresponds to (as returned by + GetLayerDefn()->OGRFeatureDefn::GetGeomFieldDefn(iGeomField)->GetSpatialRef()). Internally this + method is normally implemented as creating a 5 vertex closed rectangular + polygon and passing it to OGRLayer::SetSpatialFilter(). It exists as + a convenience. + + The only way to clear a spatial filter set with this method is to + call OGRLayer::SetSpatialFilter(NULL). + + This method is the same as the C++ method OGRLayer::SetSpatialFilterRect(). + + @param hLayer handle to the layer on which to set the spatial filter. + @param iGeomField index of the geometry field on which the spatial filter + operates. + @param dfMinX the minimum X coordinate for the rectangular region. + @param dfMinY the minimum Y coordinate for the rectangular region. + @param dfMaxX the maximum X coordinate for the rectangular region. + @param dfMaxY the maximum Y coordinate for the rectangular region. + + @since GDAL 1.11 + */ + void OGR_L_SetSpatialFilterRectEx(OGRLayerH hLayer, int iGeomField, double dfMinX, double dfMinY, double dfMaxX, double dfMaxY) @@ -1860,7 +2133,7 @@ void OGR_L_SetSpatialFilterRectEx(OGRLayerH hLayer, int iGeomField, /************************************************************************/ //! @cond Doxygen_Suppress -int OGRLayer::InstallFilter(OGRGeometry *poFilter) +int OGRLayer::InstallFilter(const OGRGeometry *poFilter) { if (m_poFilterGeom == poFilter) diff --git a/ogr/ogrsf_frmts/generic/ogrlayerdecorator.cpp b/ogr/ogrsf_frmts/generic/ogrlayerdecorator.cpp index aa526f9dfdef..6ddab0159ba1 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayerdecorator.cpp +++ b/ogr/ogrsf_frmts/generic/ogrlayerdecorator.cpp @@ -36,36 +36,12 @@ OGRGeometry *OGRLayerDecorator::GetSpatialFilter() return m_poDecoratedLayer->GetSpatialFilter(); } -void OGRLayerDecorator::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr OGRLayerDecorator::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) { if (!m_poDecoratedLayer) - return; - m_poDecoratedLayer->SetSpatialFilter(poGeom); -} - -void OGRLayerDecorator::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) -{ - if (!m_poDecoratedLayer) - return; - m_poDecoratedLayer->SetSpatialFilter(iGeomField, poGeom); -} - -void OGRLayerDecorator::SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) -{ - if (!m_poDecoratedLayer) - return; - m_poDecoratedLayer->SetSpatialFilterRect(dfMinX, dfMinY, dfMaxX, dfMaxY); -} - -void OGRLayerDecorator::SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, - double dfMaxY) -{ - if (!m_poDecoratedLayer) - return; - m_poDecoratedLayer->SetSpatialFilterRect(iGeomField, dfMinX, dfMinY, dfMaxX, - dfMaxY); + return OGRERR_FAILURE; + return m_poDecoratedLayer->SetSpatialFilter(iGeomField, poGeom); } OGRErr OGRLayerDecorator::SetAttributeFilter(const char *poAttrFilter) diff --git a/ogr/ogrsf_frmts/generic/ogrlayerdecorator.h b/ogr/ogrsf_frmts/generic/ogrlayerdecorator.h index 00432c6e82cd..cc56d4584490 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayerdecorator.h +++ b/ogr/ogrsf_frmts/generic/ogrlayerdecorator.h @@ -30,13 +30,8 @@ class CPL_DLL OGRLayerDecorator : public OGRLayer virtual ~OGRLayerDecorator(); virtual OGRGeometry *GetSpatialFilter() override; - virtual void SetSpatialFilter(OGRGeometry *) override; - virtual void SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) override; - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; - virtual void SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, - double dfMaxY) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *) override; virtual OGRErr SetAttributeFilter(const char *) override; diff --git a/ogr/ogrsf_frmts/generic/ogrlayerpool.cpp b/ogr/ogrsf_frmts/generic/ogrlayerpool.cpp index ca7bc387259e..c69c89844cc2 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayerpool.cpp +++ b/ogr/ogrsf_frmts/generic/ogrlayerpool.cpp @@ -216,25 +216,15 @@ OGRGeometry *OGRProxiedLayer::GetSpatialFilter() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRProxiedLayer::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr OGRProxiedLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) { if (poUnderlyingLayer == nullptr && !OpenUnderlyingLayer()) - return; - poUnderlyingLayer->SetSpatialFilter(poGeom); -} - -/************************************************************************/ -/* SetSpatialFilter() */ -/************************************************************************/ - -void OGRProxiedLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) -{ - if (poUnderlyingLayer == nullptr && !OpenUnderlyingLayer()) - return; - poUnderlyingLayer->SetSpatialFilter(iGeomField, poGeom); + return OGRERR_FAILURE; + return poUnderlyingLayer->SetSpatialFilter(iGeomField, poGeom); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/generic/ogrlayerpool.h b/ogr/ogrsf_frmts/generic/ogrlayerpool.h index efaa1bfe37ac..c7b9818c71ce 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayerpool.h +++ b/ogr/ogrsf_frmts/generic/ogrlayerpool.h @@ -108,8 +108,8 @@ class CPL_DLL OGRProxiedLayer : public OGRAbstractProxiedLayer OGRLayer *GetUnderlyingLayer(); virtual OGRGeometry *GetSpatialFilter() override; - virtual void SetSpatialFilter(OGRGeometry *) override; - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *) override; virtual OGRErr SetAttributeFilter(const char *) override; diff --git a/ogr/ogrsf_frmts/generic/ogrmutexedlayer.cpp b/ogr/ogrsf_frmts/generic/ogrmutexedlayer.cpp index 272bc6fb7eca..51baa0d3ac2c 100644 --- a/ogr/ogrsf_frmts/generic/ogrmutexedlayer.cpp +++ b/ogr/ogrsf_frmts/generic/ogrmutexedlayer.cpp @@ -32,32 +32,11 @@ OGRGeometry *OGRMutexedLayer::GetSpatialFilter() return OGRLayerDecorator::GetSpatialFilter(); } -void OGRMutexedLayer::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr OGRMutexedLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) { CPLMutexHolderOptionalLockD(m_hMutex); - OGRLayerDecorator::SetSpatialFilter(poGeom); -} - -void OGRMutexedLayer::SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) -{ - CPLMutexHolderOptionalLockD(m_hMutex); - OGRLayerDecorator::SetSpatialFilterRect(dfMinX, dfMinY, dfMaxX, dfMaxY); -} - -void OGRMutexedLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) -{ - CPLMutexHolderOptionalLockD(m_hMutex); - OGRLayerDecorator::SetSpatialFilter(iGeomField, poGeom); -} - -void OGRMutexedLayer::SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, - double dfMaxY) -{ - CPLMutexHolderOptionalLockD(m_hMutex); - OGRLayerDecorator::SetSpatialFilterRect(iGeomField, dfMinX, dfMinY, dfMaxX, - dfMaxY); + return OGRLayerDecorator::ISetSpatialFilter(iGeomField, poGeom); } OGRErr OGRMutexedLayer::SetAttributeFilter(const char *poAttrFilter) diff --git a/ogr/ogrsf_frmts/generic/ogrmutexedlayer.h b/ogr/ogrsf_frmts/generic/ogrmutexedlayer.h index bdf28ea8b8ff..b49640f2c1ba 100644 --- a/ogr/ogrsf_frmts/generic/ogrmutexedlayer.h +++ b/ogr/ogrsf_frmts/generic/ogrmutexedlayer.h @@ -41,13 +41,8 @@ class CPL_DLL OGRMutexedLayer : public OGRLayerDecorator virtual ~OGRMutexedLayer(); virtual OGRGeometry *GetSpatialFilter() override; - virtual void SetSpatialFilter(OGRGeometry *) override; - virtual void SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) override; - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; - virtual void SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, - double dfMaxY) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *) override; virtual OGRErr SetAttributeFilter(const char *) override; diff --git a/ogr/ogrsf_frmts/generic/ogrunionlayer.cpp b/ogr/ogrsf_frmts/generic/ogrunionlayer.cpp index 9cd01e92ed07..14fddb79582d 100644 --- a/ogr/ogrsf_frmts/generic/ogrunionlayer.cpp +++ b/ogr/ogrsf_frmts/generic/ogrunionlayer.cpp @@ -1307,30 +1307,12 @@ OGRErr OGRUnionLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRUnionLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGRUnionLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) { - SetSpatialFilter(0, poGeomIn); -} - -/************************************************************************/ -/* SetSpatialFilter() */ -/************************************************************************/ - -void OGRUnionLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) -{ - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount()) - { - if (poGeom != nullptr) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - return; - } - } - m_iGeomFieldFilter = iGeomField; if (InstallFilter(poGeom)) ResetReading(); @@ -1339,6 +1321,8 @@ void OGRUnionLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) { SetSpatialFilterToSourceLayer(papoSrcLayers[iCurLayer]); } + + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/generic/ogrunionlayer.h b/ogr/ogrsf_frmts/generic/ogrunionlayer.h index d7d983911c5e..3357a22ba8d7 100644 --- a/ogr/ogrsf_frmts/generic/ogrunionlayer.h +++ b/ogr/ogrsf_frmts/generic/ogrunionlayer.h @@ -146,8 +146,8 @@ class CPL_DLL OGRUnionLayer final : public OGRLayer virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) override; - virtual void SetSpatialFilter(OGRGeometry *poGeomIn) override; - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *) override; virtual OGRErr SetIgnoredFields(CSLConstList papszFields) override; diff --git a/ogr/ogrsf_frmts/generic/ogrwarpedlayer.cpp b/ogr/ogrsf_frmts/generic/ogrwarpedlayer.cpp index a1e083a8397e..a69205500e82 100644 --- a/ogr/ogrsf_frmts/generic/ogrwarpedlayer.cpp +++ b/ogr/ogrsf_frmts/generic/ogrwarpedlayer.cpp @@ -53,36 +53,12 @@ OGRWarpedLayer::~OGRWarpedLayer() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRWarpedLayer::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr OGRWarpedLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) { - SetSpatialFilter(0, poGeom); -} - -/************************************************************************/ -/* SetSpatialFilterRect() */ -/************************************************************************/ - -void OGRWarpedLayer::SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) -{ - OGRLayer::SetSpatialFilterRect(dfMinX, dfMinY, dfMaxX, dfMaxY); -} - -/************************************************************************/ -/* SetSpatialFilter() */ -/************************************************************************/ - -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)) @@ -92,7 +68,8 @@ void OGRWarpedLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) { if (poGeom == nullptr || m_poReversedCT == nullptr) { - m_poDecoratedLayer->SetSpatialFilter(m_iGeomFieldFilter, nullptr); + return m_poDecoratedLayer->SetSpatialFilter(m_iGeomFieldFilter, + nullptr); } else { @@ -101,40 +78,29 @@ void OGRWarpedLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) if (std::isinf(sEnvelope.MinX) && std::isinf(sEnvelope.MinY) && std::isinf(sEnvelope.MaxX) && std::isinf(sEnvelope.MaxY)) { - m_poDecoratedLayer->SetSpatialFilterRect( + return m_poDecoratedLayer->SetSpatialFilterRect( m_iGeomFieldFilter, sEnvelope.MinX, sEnvelope.MinY, sEnvelope.MaxX, sEnvelope.MaxY); } else if (ReprojectEnvelope(&sEnvelope, m_poReversedCT)) { - m_poDecoratedLayer->SetSpatialFilterRect( + return m_poDecoratedLayer->SetSpatialFilterRect( m_iGeomFieldFilter, sEnvelope.MinX, sEnvelope.MinY, sEnvelope.MaxX, sEnvelope.MaxY); } else { - m_poDecoratedLayer->SetSpatialFilter(m_iGeomFieldFilter, - nullptr); + return m_poDecoratedLayer->SetSpatialFilter(m_iGeomFieldFilter, + nullptr); } } } else { - m_poDecoratedLayer->SetSpatialFilter(m_iGeomFieldFilter, poGeom); + return m_poDecoratedLayer->SetSpatialFilter(m_iGeomFieldFilter, poGeom); } } -/************************************************************************/ -/* SetSpatialFilterRect() */ -/************************************************************************/ - -void OGRWarpedLayer::SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, - double dfMaxY) -{ - OGRLayer::SetSpatialFilterRect(iGeomField, dfMinX, dfMinY, dfMaxX, dfMaxY); -} - /************************************************************************/ /* SrcFeatureToWarpedFeature() */ /************************************************************************/ diff --git a/ogr/ogrsf_frmts/generic/ogrwarpedlayer.h b/ogr/ogrsf_frmts/generic/ogrwarpedlayer.h index 828f18cac36a..468f7e138f11 100644 --- a/ogr/ogrsf_frmts/generic/ogrwarpedlayer.h +++ b/ogr/ogrsf_frmts/generic/ogrwarpedlayer.h @@ -55,13 +55,8 @@ class CPL_DLL OGRWarpedLayer : public OGRLayerDecorator void SetExtent(double dfXMin, double dfYMin, double dfXMax, double dfYMax); - virtual void SetSpatialFilter(OGRGeometry *) override; - virtual void SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY) override; - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; - virtual void SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, - double dfMaxY) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *) override; virtual OGRFeature *GetNextFeature() override; virtual OGRFeature *GetFeature(GIntBig nFID) override; diff --git a/ogr/ogrsf_frmts/gpkg/ogr_geopackage.h b/ogr/ogrsf_frmts/gpkg/ogr_geopackage.h index 8f47e7c8ff01..0ff715ec7f88 100644 --- a/ogr/ogrsf_frmts/gpkg/ogr_geopackage.h +++ b/ogr/ogrsf_frmts/gpkg/ogr_geopackage.h @@ -877,12 +877,9 @@ class OGRGeoPackageTableLayer final : public OGRGeoPackageLayer const int *panUpdatedGeomFieldsIdx, bool bUpdateStyleString) override; OGRErr DeleteFeature(GIntBig nFID) override; - virtual void SetSpatialFilter(OGRGeometry *) override; - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRGeoPackageLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; OGRErr SetAttributeFilter(const char *pszQuery) override; OGRErr SyncToDisk() override; @@ -1068,12 +1065,7 @@ class OGRGeoPackageSelectLayer final : public OGRGeoPackageLayer, virtual OGRFeature *GetNextFeature() override; virtual GIntBig GetFeatureCount(int) override; - virtual void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; + OGRErr ISetSpatialFilter(int iGeomField, const OGRGeometry *) override; virtual OGRErr SetAttributeFilter(const char *) override; virtual int TestCapability(const char *) override; @@ -1111,7 +1103,7 @@ class OGRGeoPackageSelectLayer final : public OGRGeoPackageLayer, return OGRGeoPackageLayer::GetSpatialRef(); } - virtual int InstallFilter(OGRGeometry *poGeomIn) override + virtual int InstallFilter(const OGRGeometry *poGeomIn) override { return OGRGeoPackageLayer::InstallFilter(poGeomIn); } diff --git a/ogr/ogrsf_frmts/gpkg/ogrgeopackageselectlayer.cpp b/ogr/ogrsf_frmts/gpkg/ogrgeopackageselectlayer.cpp index 9000ab5a8118..c0af83a3c92f 100644 --- a/ogr/ogrsf_frmts/gpkg/ogrgeopackageselectlayer.cpp +++ b/ogr/ogrsf_frmts/gpkg/ogrgeopackageselectlayer.cpp @@ -122,14 +122,14 @@ OGRErr OGRGeoPackageSelectLayer::SetAttributeFilter(const char *pszQuery) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRGeoPackageSelectLayer::SetSpatialFilter(int iGeomField, - OGRGeometry *poGeomIn) +OGRErr OGRGeoPackageSelectLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - poBehavior->SetSpatialFilter(iGeomField, poGeomIn); + return poBehavior->SetSpatialFilter(iGeomField, poGeomIn); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp b/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp index 327c9c0ee2b4..83a0ebb9dc8e 100644 --- a/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp +++ b/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp @@ -5487,10 +5487,11 @@ OGRErr OGRGeoPackageTableLayer::Rename(const char *pszDstTableName) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRGeoPackageTableLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGRGeoPackageTableLayer::ISetSpatialFilter(int /*iGeomField*/, + const OGRGeometry *poGeomIn) { if (!m_bFeatureDefnCompleted) @@ -5501,6 +5502,7 @@ void OGRGeoPackageTableLayer::SetSpatialFilter(OGRGeometry *poGeomIn) ResetReading(); } + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/hana/ogr_hana.h b/ogr/ogrsf_frmts/hana/ogr_hana.h index 7a3f01698302..747fcadce8f0 100644 --- a/ogr/ogrsf_frmts/hana/ogr_hana.h +++ b/ogr/ogrsf_frmts/hana/ogr_hana.h @@ -238,12 +238,8 @@ class OGRHanaLayer : public OGRLayer OGRErr SetAttributeFilter(const char *pszQuery) override; - void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } - - void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; }; /************************************************************************/ diff --git a/ogr/ogrsf_frmts/hana/ogrhanalayer.cpp b/ogr/ogrsf_frmts/hana/ogrhanalayer.cpp index be5184e0c8dd..6df86d7228b3 100644 --- a/ogr/ogrsf_frmts/hana/ogrhanalayer.cpp +++ b/ogr/ogrsf_frmts/hana/ogrhanalayer.cpp @@ -993,27 +993,21 @@ OGRErr OGRHanaLayer::SetAttributeFilter(const char *pszQuery) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRHanaLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) +OGRErr OGRHanaLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) { - m_iGeomFieldFilter = 0; - - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount()) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - return; - } m_iGeomFieldFilter = iGeomField; if (!InstallFilter(poGeom)) - return; + return OGRERR_NONE; ClearQueryStatement(); BuildWhereClause(); ResetReading(); + return OGRERR_NONE; } } // namespace OGRHANA diff --git a/ogr/ogrsf_frmts/mitab/mitab.h b/ogr/ogrsf_frmts/mitab/mitab.h index 860195c40037..778ebb557468 100644 --- a/ogr/ogrsf_frmts/mitab/mitab.h +++ b/ogr/ogrsf_frmts/mitab/mitab.h @@ -592,12 +592,8 @@ class TABSeamless final : public IMapInfoFile return m_poFeatureDefnRef ? m_poFeatureDefnRef->GetName() : ""; } - virtual void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual void ResetReading() override; virtual int TestCapability(const char *pszCap) override; diff --git a/ogr/ogrsf_frmts/mitab/mitab_tabseamless.cpp b/ogr/ogrsf_frmts/mitab/mitab_tabseamless.cpp index 984f5249592a..84ca02099443 100644 --- a/ogr/ogrsf_frmts/mitab/mitab_tabseamless.cpp +++ b/ogr/ogrsf_frmts/mitab/mitab_tabseamless.cpp @@ -758,7 +758,8 @@ OGRSpatialReference *TABSeamless::GetSpatialRef() * Standard OGR SetSpatialFiltere implementation. This method is used * to set a SpatialFilter for this OGRLayer. **********************************************************************/ -void TABSeamless::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr TABSeamless::ISetSpatialFilter(int /*iGeomField*/, + const OGRGeometry *poGeomIn) { IMapInfoFile::SetSpatialFilter(poGeomIn); @@ -768,6 +769,8 @@ void TABSeamless::SetSpatialFilter(OGRGeometry *poGeomIn) if (m_poCurBaseTable) m_poCurBaseTable->SetSpatialFilter(poGeomIn); + + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/mongodbv3/ogrmongodbv3driver.cpp b/ogr/ogrsf_frmts/mongodbv3/ogrmongodbv3driver.cpp index b130b0a1ff70..fc40ac49d434 100644 --- a/ogr/ogrsf_frmts/mongodbv3/ogrmongodbv3driver.cpp +++ b/ogr/ogrsf_frmts/mongodbv3/ogrmongodbv3driver.cpp @@ -180,12 +180,8 @@ class OGRMongoDBv3Layer final : public OGRLayer GIntBig GetFeatureCount(int bForce) override; OGRErr SetAttributeFilter(const char *pszFilter) override; - void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } - - void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; int TestCapability(const char *pszCap) override; OGRFeatureDefn *GetLayerDefn() override; OGRErr CreateField(const OGRFieldDefn *poFieldIn, int) override; @@ -2164,22 +2160,13 @@ OGRErr OGRMongoDBv3Layer::SetAttributeFilter(const char *pszFilter) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRMongoDBv3Layer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) +OGRErr OGRMongoDBv3Layer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount() || - GetLayerDefn()->GetGeomFieldDefn(iGeomField)->GetType() == wkbNone) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return; - } m_iGeomFieldFilter = iGeomField; m_oQuerySpat = bsoncxx::builder::basic::make_document(); @@ -2203,7 +2190,7 @@ void OGRMongoDBv3Layer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) if (sEnvelope.MinX == -180 && sEnvelope.MinY == -90 && sEnvelope.MaxX == 180 && sEnvelope.MaxY == 90) { - return; + return OGRERR_NONE; } try @@ -2237,8 +2224,10 @@ void OGRMongoDBv3Layer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) { CPLError(CE_Failure, CPLE_AppDefined, "%s: %s", "SetSpatialFilter()", ex.what()); + return OGRERR_FAILURE; } } + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/mvt/ogrmvtdataset.cpp b/ogr/ogrsf_frmts/mvt/ogrmvtdataset.cpp index 37990de09590..4c79d6aba2ca 100644 --- a/ogr/ogrsf_frmts/mvt/ogrmvtdataset.cpp +++ b/ogr/ogrsf_frmts/mvt/ogrmvtdataset.cpp @@ -253,12 +253,8 @@ class OGRMVTDirectoryLayer final : public OGRMVTLayerBase OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) override; - virtual void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRFeature *GetFeature(GIntBig nFID) override; @@ -1737,12 +1733,13 @@ GIntBig OGRMVTDirectoryLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRMVTDirectoryLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGRMVTDirectoryLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - OGRLayer::SetSpatialFilter(poGeomIn); + OGRLayer::ISetSpatialFilter(iGeomField, poGeomIn); OGREnvelope sEnvelope; if (m_poFilterGeom != nullptr) @@ -1797,6 +1794,8 @@ void OGRMVTDirectoryLayer::SetSpatialFilter(OGRGeometry *poGeomIn) m_poDS->GetTileMatrixHeight0() - 1)); } + + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/mysql/ogr_mysql.h b/ogr/ogrsf_frmts/mysql/ogr_mysql.h index 559f8c213953..9f67fb67b11d 100644 --- a/ogr/ogrsf_frmts/mysql/ogr_mysql.h +++ b/ogr/ogrsf_frmts/mysql/ogr_mysql.h @@ -172,12 +172,9 @@ class OGRMySQLTableLayer final : public OGRMySQLLayer virtual void ResetReading() override; virtual GIntBig GetFeatureCount(int) override; - void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; + ; virtual OGRErr SetAttributeFilter(const char *) override; virtual OGRErr ICreateFeature(OGRFeature *poFeature) override; diff --git a/ogr/ogrsf_frmts/mysql/ogrmysqltablelayer.cpp b/ogr/ogrsf_frmts/mysql/ogrmysqltablelayer.cpp index 1732708eb37f..76e3d3463cc2 100644 --- a/ogr/ogrsf_frmts/mysql/ogrmysqltablelayer.cpp +++ b/ogr/ogrsf_frmts/mysql/ogrmysqltablelayer.cpp @@ -412,18 +412,18 @@ OGRFeatureDefn *OGRMySQLTableLayer::ReadTableDefinition(const char *pszTable) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRMySQLTableLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGRMySQLTableLayer::ISetSpatialFilter(int, const OGRGeometry *poGeomIn) { - if (!InstallFilter(poGeomIn)) - return; - - BuildWhere(); - - ResetReading(); + if (InstallFilter(poGeomIn)) + { + BuildWhere(); + ResetReading(); + } + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/ngw/ogr_ngw.h b/ogr/ogrsf_frmts/ngw/ogr_ngw.h index 1de9506c031c..c9364ee35cad 100644 --- a/ogr/ogrsf_frmts/ngw/ogr_ngw.h +++ b/ogr/ogrsf_frmts/ngw/ogr_ngw.h @@ -182,8 +182,8 @@ class OGRNGWLayer final : public OGRLayer virtual OGRErr SetIgnoredFields(CSLConstList papszFields) override; virtual OGRErr SetAttributeFilter(const char *pszQuery) override; - virtual void SetSpatialFilter(OGRGeometry *poGeom) override; - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; OGRErr SetSelectedFields(const std::set &aosFields); OGRNGWLayer *Clone() const; diff --git a/ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp b/ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp index b3aeae0fdc8c..df2ef26cf40b 100644 --- a/ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp +++ b/ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp @@ -1681,11 +1681,11 @@ OGRErr OGRNGWLayer::SetIgnoredFields(CSLConstList papszFields) } /* - * SetSpatialFilter() + * ISetSpatialFilter() */ -void OGRNGWLayer::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr OGRNGWLayer::ISetSpatialFilter(int iGeomField, const OGRGeometry *poGeom) { - OGRLayer::SetSpatialFilter(poGeom); + OGRLayer::ISetSpatialFilter(iGeomField, poGeom); if (nullptr == m_poFilterGeom) { @@ -1734,14 +1734,8 @@ void OGRNGWLayer::SetSpatialFilter(OGRGeometry *poGeom) FreeFeaturesCache(); } ResetReading(); -} -/* - * SetSpatialFilter() - */ -void OGRNGWLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) -{ - OGRLayer::SetSpatialFilter(iGeomField, poGeom); + return OGRERR_NONE; } /* diff --git a/ogr/ogrsf_frmts/ntf/ntf.h b/ogr/ogrsf_frmts/ntf/ntf.h index 2251a50ff25c..ea6dd2df4084 100644 --- a/ogr/ogrsf_frmts/ntf/ntf.h +++ b/ogr/ogrsf_frmts/ntf/ntf.h @@ -504,13 +504,6 @@ class OGRNTFFeatureClassLayer final : public OGRLayer return poFilterGeom; } - void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } - void ResetReading() override; OGRFeature *GetNextFeature() override; @@ -554,13 +547,6 @@ class OGRNTFRasterLayer final : public OGRLayer return poFilterGeom; } - void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } - void ResetReading() override; OGRFeature *GetNextFeature() override; diff --git a/ogr/ogrsf_frmts/ntf/ntf_raster.cpp b/ogr/ogrsf_frmts/ntf/ntf_raster.cpp index 77e498977d52..211495a659c4 100644 --- a/ogr/ogrsf_frmts/ntf/ntf_raster.cpp +++ b/ogr/ogrsf_frmts/ntf/ntf_raster.cpp @@ -269,23 +269,6 @@ OGRNTFRasterLayer::~OGRNTFRasterLayer() delete poFilterGeom; } -/************************************************************************/ -/* SetSpatialFilter() */ -/************************************************************************/ - -void OGRNTFRasterLayer::SetSpatialFilter(OGRGeometry *poGeomIn) - -{ - if (poFilterGeom != nullptr) - { - delete poFilterGeom; - poFilterGeom = nullptr; - } - - if (poGeomIn != nullptr) - poFilterGeom = poGeomIn->clone(); -} - /************************************************************************/ /* ResetReading() */ /************************************************************************/ diff --git a/ogr/ogrsf_frmts/ntf/ogrntffeatureclasslayer.cpp b/ogr/ogrsf_frmts/ntf/ogrntffeatureclasslayer.cpp index 28cffb8a6912..a6eb693f3dd5 100644 --- a/ogr/ogrsf_frmts/ntf/ogrntffeatureclasslayer.cpp +++ b/ogr/ogrsf_frmts/ntf/ogrntffeatureclasslayer.cpp @@ -56,23 +56,6 @@ OGRNTFFeatureClassLayer::~OGRNTFFeatureClassLayer() delete poFilterGeom; } -/************************************************************************/ -/* SetSpatialFilter() */ -/************************************************************************/ - -void OGRNTFFeatureClassLayer::SetSpatialFilter(OGRGeometry *poGeomIn) - -{ - if (poFilterGeom != nullptr) - { - delete poFilterGeom; - poFilterGeom = nullptr; - } - - if (poGeomIn != nullptr) - poFilterGeom = poGeomIn->clone(); -} - /************************************************************************/ /* ResetReading() */ /************************************************************************/ diff --git a/ogr/ogrsf_frmts/oapif/ogroapifdriver.cpp b/ogr/ogrsf_frmts/oapif/ogroapifdriver.cpp index 405b79c679b1..6252cba6d8ef 100644 --- a/ogr/ogrsf_frmts/oapif/ogroapifdriver.cpp +++ b/ogr/ogrsf_frmts/oapif/ogroapifdriver.cpp @@ -214,12 +214,8 @@ class OGROAPIFLayer final : public OGRLayer OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) override; - void SetSpatialFilter(OGRGeometry *poGeom) override; - - void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; OGRErr SetAttributeFilter(const char *pszQuery) override; @@ -2453,14 +2449,15 @@ OGRErr OGROAPIFLayer::IGetExtent(int iGeomField, OGREnvelope *psEnvelope, } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGROAPIFLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGROAPIFLayer::ISetSpatialFilter(int, const OGRGeometry *poGeomIn) { InstallFilter(poGeomIn); ResetReading(); + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/oci/ogr_oci.h b/ogr/ogrsf_frmts/oci/ogr_oci.h index e5162b97dc8e..4a6122418759 100644 --- a/ogr/ogrsf_frmts/oci/ogr_oci.h +++ b/ogr/ogrsf_frmts/oci/ogr_oci.h @@ -400,15 +400,6 @@ class OGROCILoaderLayer final : public OGROCIWritableLayer virtual void ResetReading() override; virtual GIntBig GetFeatureCount(int) override; - virtual void SetSpatialFilter(OGRGeometry *) override - { - } - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } - virtual OGRErr SetAttributeFilter(const char *) override { return OGRERR_UNSUPPORTED_OPERATION; @@ -495,12 +486,8 @@ class OGROCITableLayer final : public OGROCIWritableLayer virtual void ResetReading() override; virtual GIntBig GetFeatureCount(int) override; - virtual void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) override; diff --git a/ogr/ogrsf_frmts/oci/ogrocitablelayer.cpp b/ogr/ogrsf_frmts/oci/ogrocitablelayer.cpp index fd6dfa5df5e7..24bf5eea927c 100644 --- a/ogr/ogrsf_frmts/oci/ogrocitablelayer.cpp +++ b/ogr/ogrsf_frmts/oci/ogrocitablelayer.cpp @@ -508,18 +508,19 @@ OGRFeatureDefn *OGROCITableLayer::ReadTableDefinition(const char *pszTable) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGROCITableLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGROCITableLayer::ISetSpatialFilter(int, const OGRGeometry *poGeomIn) { if (!InstallFilter(poGeomIn)) - return; + return OGRERR_NONE; BuildWhere(); ResetReading(); + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/ogdi/ogrogdi.h b/ogr/ogrsf_frmts/ogdi/ogrogdi.h index cee6b3ccbdf1..d68241024531 100644 --- a/ogr/ogrsf_frmts/ogdi/ogrogdi.h +++ b/ogr/ogrsf_frmts/ogdi/ogrogdi.h @@ -51,14 +51,8 @@ class OGROGDILayer final : public OGRLayer public: OGROGDILayer(OGROGDIDataSource *, const char *, ecs_Family); virtual ~OGROGDILayer(); - - virtual void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } - + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *pszQuery) override; void ResetReading() override; diff --git a/ogr/ogrsf_frmts/ogdi/ogrogdilayer.cpp b/ogr/ogrsf_frmts/ogdi/ogrogdilayer.cpp index 67df11e4af2b..615704e02671 100644 --- a/ogr/ogrsf_frmts/ogdi/ogrogdilayer.cpp +++ b/ogr/ogrsf_frmts/ogdi/ogrogdilayer.cpp @@ -60,18 +60,18 @@ OGROGDILayer::~OGROGDILayer() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGROGDILayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGROGDILayer::ISetSpatialFilter(int, const OGRGeometry *poGeomIn) { - if (!InstallFilter(poGeomIn)) - return; - - ResetReading(); - - m_nTotalShapeCount = -1; + if (InstallFilter(poGeomIn)) + { + ResetReading(); + m_nTotalShapeCount = -1; + } + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/ogrsf_frmts.dox b/ogr/ogrsf_frmts/ogrsf_frmts.dox index 786d4ca4b191..15053cda88dc 100644 --- a/ogr/ogrsf_frmts/ogrsf_frmts.dox +++ b/ogr/ogrsf_frmts/ogrsf_frmts.dox @@ -861,288 +861,6 @@ by the OGRSFDriverManager. */ -/** - \fn void OGRLayer::SetSpatialFilter( OGRGeometry * poFilter ); - - \brief Set a new spatial filter. - - This method set the geometry to be used as a spatial filter when - fetching features via the GetNextFeature() method. Only features that - geometrically intersect the filter geometry will be returned. - - Currently this test is may be inaccurately implemented, but it is - guaranteed that all features whose envelope (as returned by - OGRGeometry::getEnvelope()) overlaps the envelope of the spatial filter - will be returned. This can result in more shapes being returned that - should strictly be the case. - - Starting with GDAL 2.3, features with null or empty geometries will never - be considered as matching a spatial filter. - - This method makes an internal copy of the passed geometry. The - passed geometry remains the responsibility of the caller, and may - be safely destroyed. - - For the time being the passed filter geometry should be in the same - SRS as the layer (as returned by OGRLayer::GetSpatialRef()). In the - future this may be generalized. - - This method is the same as the C function OGR_L_SetSpatialFilter(). - - @param poFilter the geometry to use as a filtering region. NULL may - be passed indicating that the current spatial filter should be cleared, - but no new one instituted. - - */ - -/** - \fn void OGR_L_SetSpatialFilter( OGRLayerH hLayer, OGRGeometryH hGeom ); - - \brief Set a new spatial filter. - - This function set the geometry to be used as a spatial filter when - fetching features via the OGR_L_GetNextFeature() function. Only - features that geometrically intersect the filter geometry will be - returned. - - Currently this test is may be inaccurately implemented, but it is - guaranteed that all features whose envelope (as returned by - OGR_G_GetEnvelope()) overlaps the envelope of the spatial filter - will be returned. This can result in more shapes being returned that - should strictly be the case. - - Starting with GDAL 2.3, features with null or empty geometries will never - be considered as matching a spatial filter. - - This function makes an internal copy of the passed geometry. The - passed geometry remains the responsibility of the caller, and may - be safely destroyed. - - For the time being the passed filter geometry should be in the same - SRS as the layer (as returned by OGR_L_GetSpatialRef()). In the - future this may be generalized. - - This function is the same as the C++ method OGRLayer::SetSpatialFilter. - - @param hLayer handle to the layer on which to set the spatial filter. - @param hGeom handle to the geometry to use as a filtering region. NULL may - be passed indicating that the current spatial filter should be cleared, - but no new one instituted. - - */ - -/** - \fn void OGRLayer::SetSpatialFilterRect( double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY ); - - \brief Set a new rectangular spatial filter. - - This method set rectangle to be used as a spatial filter when - fetching features via the GetNextFeature() method. Only features that - geometrically intersect the given rectangle will be returned. - - The x/y values should be in the same coordinate system as the layer as - a whole (as returned by OGRLayer::GetSpatialRef()). Internally this - method is normally implemented as creating a 5 vertex closed rectangular - polygon and passing it to OGRLayer::SetSpatialFilter(). It exists as - a convenience. - - The only way to clear a spatial filter set with this method is to - call OGRLayer::SetSpatialFilter(NULL). - - This method is the same as the C function OGR_L_SetSpatialFilterRect(). - - @param dfMinX the minimum X coordinate for the rectangular region. - @param dfMinY the minimum Y coordinate for the rectangular region. - @param dfMaxX the maximum X coordinate for the rectangular region. - @param dfMaxY the maximum Y coordinate for the rectangular region. - - */ - -/** - \fn void OGR_L_SetSpatialFilterRect( OGRLayerH hLayer, - double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY ); - - \brief Set a new rectangular spatial filter. - - This method set rectangle to be used as a spatial filter when - fetching features via the OGR_L_GetNextFeature() method. Only features that - geometrically intersect the given rectangle will be returned. - - The x/y values should be in the same coordinate system as the layer as - a whole (as returned by OGRLayer::GetSpatialRef()). Internally this - method is normally implemented as creating a 5 vertex closed rectangular - polygon and passing it to OGRLayer::SetSpatialFilter(). It exists as - a convenience. - - The only way to clear a spatial filter set with this method is to - call OGRLayer::SetSpatialFilter(NULL). - - This method is the same as the C++ method OGRLayer::SetSpatialFilterRect(). - - @param hLayer handle to the layer on which to set the spatial filter. - @param dfMinX the minimum X coordinate for the rectangular region. - @param dfMinY the minimum Y coordinate for the rectangular region. - @param dfMaxX the maximum X coordinate for the rectangular region. - @param dfMaxY the maximum Y coordinate for the rectangular region. - - */ - - -/** - \fn void OGRLayer::SetSpatialFilter( int iGeomField, OGRGeometry * poFilter ); - - \brief Set a new spatial filter. - - This method set the geometry to be used as a spatial filter when - fetching features via the GetNextFeature() method. Only features that - geometrically intersect the filter geometry will be returned. - - Currently this test is may be inaccurately implemented, but it is - guaranteed that all features who's envelope (as returned by - OGRGeometry::getEnvelope()) overlaps the envelope of the spatial filter - will be returned. This can result in more shapes being returned that - should strictly be the case. - - This method makes an internal copy of the passed geometry. The - passed geometry remains the responsibility of the caller, and may - be safely destroyed. - - For the time being the passed filter geometry should be in the same - SRS as the geometry field definition it corresponds to (as returned by - GetLayerDefn()->OGRFeatureDefn::GetGeomFieldDefn(iGeomField)->GetSpatialRef()). In the - future this may be generalized. - - Note that only the last spatial filter set is applied, even if several - successive calls are done with different iGeomField values. - - Note to driver implementer: if you implement SetSpatialFilter(int,OGRGeometry*), - you must also implement SetSpatialFilter(OGRGeometry*) to make it call - SetSpatialFilter(0,OGRGeometry*). - - This method is the same as the C function OGR_L_SetSpatialFilterEx(). - - @param iGeomField index of the geometry field on which the spatial filter - operates. - @param poFilter the geometry to use as a filtering region. NULL may - be passed indicating that the current spatial filter should be cleared, - but no new one instituted. - - @since GDAL 1.11 - - */ - -/** - \fn void OGR_L_SetSpatialFilterEx( OGRLayerH hLayer, int iGeomField, OGRGeometryH hGeom ); - - \brief Set a new spatial filter. - - This function set the geometry to be used as a spatial filter when - fetching features via the OGR_L_GetNextFeature() function. Only - features that geometrically intersect the filter geometry will be - returned. - - Currently this test is may be inaccurately implemented, but it is - guaranteed that all features who's envelope (as returned by - OGR_G_GetEnvelope()) overlaps the envelope of the spatial filter - will be returned. This can result in more shapes being returned that - should strictly be the case. - - This function makes an internal copy of the passed geometry. The - passed geometry remains the responsibility of the caller, and may - be safely destroyed. - - For the time being the passed filter geometry should be in the same - SRS as the geometry field definition it corresponds to (as returned by - GetLayerDefn()->OGRFeatureDefn::GetGeomFieldDefn(iGeomField)->GetSpatialRef()). In the - future this may be generalized. - - Note that only the last spatial filter set is applied, even if several - successive calls are done with different iGeomField values. - - This function is the same as the C++ method OGRLayer::SetSpatialFilter. - - @param hLayer handle to the layer on which to set the spatial filter. - @param iGeomField index of the geometry field on which the spatial filter - operates. - @param hGeom handle to the geometry to use as a filtering region. NULL may - be passed indicating that the current spatial filter should be cleared, - but no new one instituted. - - @since GDAL 1.11 - - */ - -/** - \fn void OGRLayer::SetSpatialFilterRect( int iGeomField, - double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY ); - - \brief Set a new rectangular spatial filter. - - This method set rectangle to be used as a spatial filter when - fetching features via the GetNextFeature() method. Only features that - geometrically intersect the given rectangle will be returned. - - The x/y values should be in the same coordinate system as as the geometry - field definition it corresponds to (as returned by - GetLayerDefn()->OGRFeatureDefn::GetGeomFieldDefn(iGeomField)->GetSpatialRef()). Internally this - method is normally implemented as creating a 5 vertex closed rectangular - polygon and passing it to OGRLayer::SetSpatialFilter(). It exists as - a convenience. - - The only way to clear a spatial filter set with this method is to - call OGRLayer::SetSpatialFilter(NULL). - - This method is the same as the C function OGR_L_SetSpatialFilterRectEx(). - - @param iGeomField index of the geometry field on which the spatial filter - operates. - @param dfMinX the minimum X coordinate for the rectangular region. - @param dfMinY the minimum Y coordinate for the rectangular region. - @param dfMaxX the maximum X coordinate for the rectangular region. - @param dfMaxY the maximum Y coordinate for the rectangular region. - - @since GDAL 1.11 - */ - -/** - \fn void OGR_L_SetSpatialFilterRectEx( OGRLayerH hLayer, - int iGeomField, - double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY ); - - \brief Set a new rectangular spatial filter. - - This method set rectangle to be used as a spatial filter when - fetching features via the OGR_L_GetNextFeature() method. Only features that - geometrically intersect the given rectangle will be returned. - - The x/y values should be in the same coordinate system as as the geometry - field definition it corresponds to (as returned by - GetLayerDefn()->OGRFeatureDefn::GetGeomFieldDefn(iGeomField)->GetSpatialRef()). Internally this - method is normally implemented as creating a 5 vertex closed rectangular - polygon and passing it to OGRLayer::SetSpatialFilter(). It exists as - a convenience. - - The only way to clear a spatial filter set with this method is to - call OGRLayer::SetSpatialFilter(NULL). - - This method is the same as the C++ method OGRLayer::SetSpatialFilterRect(). - - @param hLayer handle to the layer on which to set the spatial filter. - @param iGeomField index of the geometry field on which the spatial filter - operates. - @param dfMinX the minimum X coordinate for the rectangular region. - @param dfMinY the minimum Y coordinate for the rectangular region. - @param dfMaxX the maximum X coordinate for the rectangular region. - @param dfMaxY the maximum Y coordinate for the rectangular region. - - @since GDAL 1.11 - */ - - /** \fn OGRGeometry *OGRLayer::GetSpatialFilter(); diff --git a/ogr/ogrsf_frmts/ogrsf_frmts.h b/ogr/ogrsf_frmts/ogrsf_frmts.h index 8f37018a28f9..78610e5cdf98 100644 --- a/ogr/ogrsf_frmts/ogrsf_frmts.h +++ b/ogr/ogrsf_frmts/ogrsf_frmts.h @@ -95,7 +95,7 @@ class CPL_DLL OGRLayer : public GDALMajorObject int FilterGeometry(const OGRGeometry *); // int FilterGeometry( OGRGeometry *, OGREnvelope* // psGeometryEnvelope); - int InstallFilter(OGRGeometry *); + int InstallFilter(const OGRGeometry *); bool ValidateGeometryFieldIndexForSetSpatialFilter(int iGeomField, const OGRGeometry *poGeomIn, @@ -108,6 +108,8 @@ class CPL_DLL OGRLayer : public GDALMajorObject virtual OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, bool bForce) CPL_WARN_UNUSED_RESULT; + virtual OGRErr ISetSpatialFilter(int iGeomField, const OGRGeometry *); + virtual OGRErr ISetFeature(OGRFeature *poFeature) CPL_WARN_UNUSED_RESULT; virtual OGRErr ICreateFeature(OGRFeature *poFeature) CPL_WARN_UNUSED_RESULT; virtual OGRErr IUpsertFeature(OGRFeature *poFeature) CPL_WARN_UNUSED_RESULT; @@ -193,14 +195,14 @@ class CPL_DLL OGRLayer : public GDALMajorObject FeatureIterator end(); virtual OGRGeometry *GetSpatialFilter(); - virtual void SetSpatialFilter(OGRGeometry *); - virtual void SetSpatialFilterRect(double dfMinX, double dfMinY, - double dfMaxX, double dfMaxY); - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *); - virtual void SetSpatialFilterRect(int iGeomField, double dfMinX, - double dfMinY, double dfMaxX, - double dfMaxY); + + OGRErr SetSpatialFilter(const OGRGeometry *); + OGRErr SetSpatialFilterRect(double dfMinX, double dfMinY, double dfMaxX, + double dfMaxY); + + OGRErr SetSpatialFilter(int iGeomField, const OGRGeometry *); + OGRErr SetSpatialFilterRect(int iGeomField, double dfMinX, double dfMinY, + double dfMaxX, double dfMaxY); virtual OGRErr SetAttributeFilter(const char *); diff --git a/ogr/ogrsf_frmts/openfilegdb/ogr_openfilegdb.h b/ogr/ogrsf_frmts/openfilegdb/ogr_openfilegdb.h index b608bbcca086..75d9833cb47b 100644 --- a/ogr/ogrsf_frmts/openfilegdb/ogr_openfilegdb.h +++ b/ogr/ogrsf_frmts/openfilegdb/ogr_openfilegdb.h @@ -273,12 +273,8 @@ class OGROpenFileGDBLayer final : public OGRLayer virtual OGRFeatureDefn *GetLayerDefn() override; - virtual void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *pszFilter) override; diff --git a/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp b/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp index be5d837a2548..103fd90916eb 100644 --- a/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp +++ b/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp @@ -911,15 +911,16 @@ void OGROpenFileGDBLayer::ResetReading() } /***********************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /***********************************************************************/ -void OGROpenFileGDBLayer::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr OGROpenFileGDBLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) { if (!BuildLayerDefinition()) - return; + return OGRERR_FAILURE; - OGRLayer::SetSpatialFilter(poGeom); + OGRLayer::ISetSpatialFilter(iGeomField, poGeom); if (m_bFilterIsEnvelope) { @@ -936,7 +937,7 @@ void OGROpenFileGDBLayer::SetSpatialFilter(OGRGeometry *poGeom) "contains the layer spatial extent"); #endif poGeom = nullptr; - OGRLayer::SetSpatialFilter(poGeom); + OGRLayer::ISetSpatialFilter(iGeomField, poGeom); } } } @@ -991,6 +992,8 @@ void OGROpenFileGDBLayer::SetSpatialFilter(OGRGeometry *poGeom) } BuildCombinedIterator(); + + return OGRERR_NONE; } /***********************************************************************/ diff --git a/ogr/ogrsf_frmts/parquet/ogr_parquet.h b/ogr/ogrsf_frmts/parquet/ogr_parquet.h index c5eeb6b88eda..d0d5d7834cec 100644 --- a/ogr/ogrsf_frmts/parquet/ogr_parquet.h +++ b/ogr/ogrsf_frmts/parquet/ogr_parquet.h @@ -257,12 +257,8 @@ class OGRParquetDatasetLayer final : public OGRParquetLayerBase OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) override; - void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } - - void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; OGRErr SetAttributeFilter(const char *pszFilter) override; diff --git a/ogr/ogrsf_frmts/parquet/ogrparquetdatasetlayer.cpp b/ogr/ogrsf_frmts/parquet/ogrparquetdatasetlayer.cpp index 6dbc0093e250..bfb493d1818b 100644 --- a/ogr/ogrsf_frmts/parquet/ogrparquetdatasetlayer.cpp +++ b/ogr/ogrsf_frmts/parquet/ogrparquetdatasetlayer.cpp @@ -1146,18 +1146,20 @@ OGRErr OGRParquetDatasetLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRParquetDatasetLayer::SetSpatialFilter(int iGeomField, - OGRGeometry *poGeomIn) +OGRErr OGRParquetDatasetLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - OGRParquetLayerBase::SetSpatialFilter(iGeomField, poGeomIn); + const OGRErr eErr = + OGRParquetLayerBase::ISetSpatialFilter(iGeomField, poGeomIn); m_bRebuildScanner = true; // Full invalidation InvalidateCachedBatches(); + return eErr; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/pg/ogr_pg.h b/ogr/ogrsf_frmts/pg/ogr_pg.h index 4871dc81d163..93f0ea3aee5a 100644 --- a/ogr/ogrsf_frmts/pg/ogr_pg.h +++ b/ogr/ogrsf_frmts/pg/ogr_pg.h @@ -369,12 +369,8 @@ class OGRPGTableLayer final : public OGRPGLayer virtual OGRFeature *GetNextFeature() override; virtual GIntBig GetFeatureCount(int) override; - virtual void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) override; @@ -537,12 +533,8 @@ class OGRPGResultLayer final : public OGRPGLayer virtual void ResetReading() override; virtual GIntBig GetFeatureCount(int) override; - virtual void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual int TestCapability(const char *) override; diff --git a/ogr/ogrsf_frmts/pg/ogrpgresultlayer.cpp b/ogr/ogrsf_frmts/pg/ogrpgresultlayer.cpp index 2521c8daa62e..bb23c87fd482 100644 --- a/ogr/ogrsf_frmts/pg/ogrpgresultlayer.cpp +++ b/ogr/ogrsf_frmts/pg/ogrpgresultlayer.cpp @@ -281,23 +281,13 @@ OGRFeature *OGRPGResultLayer::GetNextFeature() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRPGResultLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) +OGRErr OGRPGResultLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount() || - CPLAssertNotNull(GetLayerDefn()->GetGeomFieldDefn(iGeomField)) - ->GetType() == wkbNone) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return; - } m_iGeomFieldFilter = iGeomField; OGRPGGeomFieldDefn *poGeomFieldDefn = @@ -347,6 +337,7 @@ void OGRPGResultLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) ResetReading(); } + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/pg/ogrpgtablelayer.cpp b/ogr/ogrsf_frmts/pg/ogrpgtablelayer.cpp index e1e1c2e1012c..93992a2f9f94 100644 --- a/ogr/ogrsf_frmts/pg/ogrpgtablelayer.cpp +++ b/ogr/ogrsf_frmts/pg/ogrpgtablelayer.cpp @@ -1008,22 +1008,13 @@ void OGRPGTableLayer::SetTableDefinition(const char *pszFIDColumnName, } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRPGTableLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) +OGRErr OGRPGTableLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount() || - GetLayerDefn()->GetGeomFieldDefn(iGeomField)->GetType() == wkbNone) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return; - } m_iGeomFieldFilter = iGeomField; if (InstallFilter(poGeomIn)) @@ -1032,6 +1023,8 @@ void OGRPGTableLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) ResetReading(); } + + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/plscenes/ogr_plscenes.h b/ogr/ogrsf_frmts/plscenes/ogr_plscenes.h index 12cc871b6bde..2c9e864a8647 100644 --- a/ogr/ogrsf_frmts/plscenes/ogr_plscenes.h +++ b/ogr/ogrsf_frmts/plscenes/ogr_plscenes.h @@ -160,12 +160,8 @@ class OGRPLScenesDataV1Layer final : public OGRLayer virtual const char *GetMetadataItem(const char *pszName, const char *pszDomain = "") override; - virtual void SetSpatialFilter(OGRGeometry *poGeom) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) override; diff --git a/ogr/ogrsf_frmts/plscenes/ogrplscenesdatav1layer.cpp b/ogr/ogrsf_frmts/plscenes/ogrplscenesdatav1layer.cpp index 1f3130c43e63..658678171750 100644 --- a/ogr/ogrsf_frmts/plscenes/ogrplscenesdatav1layer.cpp +++ b/ogr/ogrsf_frmts/plscenes/ogrplscenesdatav1layer.cpp @@ -488,10 +488,11 @@ void OGRPLScenesDataV1Layer::ResetReading() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRPLScenesDataV1Layer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGRPLScenesDataV1Layer::ISetSpatialFilter(int /*iGeomField*/, + const OGRGeometry *poGeomIn) { m_poFeatures = nullptr; @@ -512,6 +513,8 @@ void OGRPLScenesDataV1Layer::SetSpatialFilter(OGRGeometry *poGeomIn) InstallFilter(poGeomIn); ResetReading(); + + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/pmtiles/ogr_pmtiles.h b/ogr/ogrsf_frmts/pmtiles/ogr_pmtiles.h index 03a45c4ab4e3..283ca3dd51b9 100644 --- a/ogr/ogrsf_frmts/pmtiles/ogr_pmtiles.h +++ b/ogr/ogrsf_frmts/pmtiles/ogr_pmtiles.h @@ -260,12 +260,8 @@ class OGRPMTilesVectorLayer final OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) override; - void SetSpatialFilter(OGRGeometry *) override; - - void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; GIntBig GetFeatureCount(int bForce) override; diff --git a/ogr/ogrsf_frmts/pmtiles/ogrpmtilesvectorlayer.cpp b/ogr/ogrsf_frmts/pmtiles/ogrpmtilesvectorlayer.cpp index 8e329501f241..2782c2b3f1d5 100644 --- a/ogr/ogrsf_frmts/pmtiles/ogrpmtilesvectorlayer.cpp +++ b/ogr/ogrsf_frmts/pmtiles/ogrpmtilesvectorlayer.cpp @@ -524,12 +524,13 @@ void OGRPMTilesVectorLayer::ExtentToTileExtent(const OGREnvelope &sEnvelope, } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRPMTilesVectorLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGRPMTilesVectorLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - OGRLayer::SetSpatialFilter(poGeomIn); + OGRLayer::ISetSpatialFilter(iGeomField, poGeomIn); if (m_poFilterGeom != nullptr && m_sFilterEnvelope.MinX <= -MAX_GM && m_sFilterEnvelope.MinY <= -MAX_GM && m_sFilterEnvelope.MaxX >= MAX_GM && @@ -576,4 +577,5 @@ void OGRPMTilesVectorLayer::SetSpatialFilter(OGRGeometry *poGeomIn) m_nFilterMaxX = (1 << m_nZoomLevel) - 1; m_nFilterMaxY = (1 << m_nZoomLevel) - 1; } + return OGRERR_NONE; } diff --git a/ogr/ogrsf_frmts/shape/ogrshape.h b/ogr/ogrsf_frmts/shape/ogrshape.h index c4773f999826..acfdc366800c 100644 --- a/ogr/ogrsf_frmts/shape/ogrshape.h +++ b/ogr/ogrsf_frmts/shape/ogrshape.h @@ -267,12 +267,9 @@ class OGRShapeLayer final : public OGRAbstractProxiedLayer int nFlagsIn) override; int TestCapability(const char *) override; - void SetSpatialFilter(OGRGeometry *) override; - void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; OGRErr SetAttributeFilter(const char *) override; diff --git a/ogr/ogrsf_frmts/shape/ogrshapelayer.cpp b/ogr/ogrsf_frmts/shape/ogrshapelayer.cpp index fbcd0340b952..8a7374953493 100644 --- a/ogr/ogrsf_frmts/shape/ogrshapelayer.cpp +++ b/ogr/ogrsf_frmts/shape/ogrshapelayer.cpp @@ -810,10 +810,11 @@ void OGRShapeLayer::ClearSpatialFIDs() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRShapeLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGRShapeLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { ClearMatchingFIDs(); @@ -837,7 +838,7 @@ void OGRShapeLayer::SetSpatialFilter(OGRGeometry *poGeomIn) ClearSpatialFIDs(); } - return OGRLayer::SetSpatialFilter(poGeomIn); + return OGRLayer::ISetSpatialFilter(iGeomField, poGeomIn); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/sqlite/ogr_sqlite.h b/ogr/ogrsf_frmts/sqlite/ogr_sqlite.h index 767e199b1691..dcade1072cbd 100644 --- a/ogr/ogrsf_frmts/sqlite/ogr_sqlite.h +++ b/ogr/ogrsf_frmts/sqlite/ogr_sqlite.h @@ -369,8 +369,8 @@ class OGRSQLiteTableLayer final : public OGRSQLiteLayer return m_bLayerDefnError; } - virtual void SetSpatialFilter(OGRGeometry *) override; - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *) override; virtual OGRErr SetAttributeFilter(const char *) override; virtual OGRErr ISetFeature(OGRFeature *poFeature) override; virtual OGRErr DeleteFeature(GIntBig nFID) override; @@ -504,12 +504,8 @@ class OGRSQLiteViewLayer final : public OGRSQLiteLayer virtual OGRFeature *GetNextFeature() override; virtual GIntBig GetFeatureCount(int) override; - virtual void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRSQLiteLayer::SetSpatialFilter(iGeomField, poGeom); - } + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) override; @@ -552,12 +548,8 @@ class OGRSQLiteSelectLayer CPL_NON_FINAL : public OGRSQLiteLayer, virtual OGRFeature *GetNextFeature() override; virtual GIntBig GetFeatureCount(int) override; - virtual void SetSpatialFilter(OGRGeometry *poGeom) override - { - SetSpatialFilter(0, poGeom); - } - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *) override; virtual OGRErr SetAttributeFilter(const char *) override; virtual int TestCapability(const char *) override; @@ -595,7 +587,7 @@ class OGRSQLiteSelectLayer CPL_NON_FINAL : public OGRSQLiteLayer, return OGRSQLiteLayer::GetSpatialRef(); } - virtual int InstallFilter(OGRGeometry *poGeomIn) override + virtual int InstallFilter(const OGRGeometry *poGeomIn) override { return OGRSQLiteLayer::InstallFilter(poGeomIn); } diff --git a/ogr/ogrsf_frmts/sqlite/ogrsqlitebase.h b/ogr/ogrsf_frmts/sqlite/ogrsqlitebase.h index e3e5b2eebf57..b6d5a03a12ac 100644 --- a/ogr/ogrsf_frmts/sqlite/ogrsqlitebase.h +++ b/ogr/ogrsf_frmts/sqlite/ogrsqlitebase.h @@ -278,7 +278,7 @@ class IOGRSQLiteSelectLayer virtual int &GetIGeomFieldFilter() = 0; virtual OGRSpatialReference *GetSpatialRef() = 0; virtual OGRFeatureDefn *GetLayerDefn() = 0; - virtual int InstallFilter(OGRGeometry *) = 0; + virtual int InstallFilter(const OGRGeometry *) = 0; virtual int HasReadFeature() = 0; virtual void BaseResetReading() = 0; virtual OGRFeature *BaseGetNextFeature() = 0; @@ -322,7 +322,7 @@ class OGRSQLiteSelectLayerCommonBehaviour void ResetReading(); OGRFeature *GetNextFeature(); GIntBig GetFeatureCount(int); - void SetSpatialFilter(int iGeomField, OGRGeometry *); + OGRErr SetSpatialFilter(int iGeomField, const OGRGeometry *); OGRErr SetAttributeFilter(const char *); int TestCapability(const char *); OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce); diff --git a/ogr/ogrsf_frmts/sqlite/ogrsqliteselectlayer.cpp b/ogr/ogrsf_frmts/sqlite/ogrsqliteselectlayer.cpp index 4da8a52ed42b..723df8a0a7af 100644 --- a/ogr/ogrsf_frmts/sqlite/ogrsqliteselectlayer.cpp +++ b/ogr/ogrsf_frmts/sqlite/ogrsqliteselectlayer.cpp @@ -357,37 +357,33 @@ OGRErr OGRSQLiteSelectLayer::ResetStatement() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRSQLiteSelectLayer::SetSpatialFilter(int iGeomField, - OGRGeometry *poGeomIn) +OGRErr OGRSQLiteSelectLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { if (!m_bCanReopenBaseDS && iGeomField == 0) { if (!ValidateGeometryFieldIndexForSetSpatialFilter(iGeomField, poGeomIn, true)) - return; + return OGRERR_FAILURE; // For a Memory datasource, short-circuit // OGRSQLiteExecuteSQL::SetSpatialFilter() // that would try to re-open the Memory datasource, which would fail. - OGRLayer::SetSpatialFilter(poGeomIn); + return OGRLayer::ISetSpatialFilter(iGeomField, poGeomIn); } else { - m_poBehavior->SetSpatialFilter(iGeomField, poGeomIn); + return m_poBehavior->SetSpatialFilter(iGeomField, poGeomIn); } } -void OGRSQLiteSelectLayerCommonBehaviour::SetSpatialFilter( - int iGeomField, OGRGeometry *poGeomIn) +OGRErr OGRSQLiteSelectLayerCommonBehaviour::SetSpatialFilter( + int iGeomField, const OGRGeometry *poGeomIn) { - if (!m_poLayer->ValidateGeometryFieldIndexForSetSpatialFilter( - iGeomField, poGeomIn, true)) - return; - m_bAllowResetReadingEvenIfIndexAtZero = true; int &iGeomFieldFilter = m_poLayer->GetIGeomFieldFilter(); @@ -398,6 +394,8 @@ void OGRSQLiteSelectLayerCommonBehaviour::SetSpatialFilter( ResetReading(); } + + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/sqlite/ogrsqlitetablelayer.cpp b/ogr/ogrsf_frmts/sqlite/ogrsqlitetablelayer.cpp index 68fd0cd4d3a3..3d60bf2a0f06 100644 --- a/ogr/ogrsf_frmts/sqlite/ogrsqlitetablelayer.cpp +++ b/ogr/ogrsf_frmts/sqlite/ogrsqlitetablelayer.cpp @@ -995,40 +995,21 @@ OGRErr OGRSQLiteTableLayer::SetAttributeFilter(const char *pszQuery) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRSQLiteTableLayer::SetSpatialFilter(OGRGeometry *poGeomIn) -{ - SetSpatialFilter(0, poGeomIn); -} - -void OGRSQLiteTableLayer::SetSpatialFilter(int iGeomField, - OGRGeometry *poGeomIn) +OGRErr OGRSQLiteTableLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - if (iGeomField == 0) - { - m_iGeomFieldFilter = 0; - } - else - { - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount()) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - return; - } - - m_iGeomFieldFilter = iGeomField; - } - + m_iGeomFieldFilter = iGeomField; if (InstallFilter(poGeomIn)) { BuildWhere(); ResetReading(); } + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/sqlite/ogrsqliteviewlayer.cpp b/ogr/ogrsf_frmts/sqlite/ogrsqliteviewlayer.cpp index 6395cdfcf8b2..8af281aae356 100644 --- a/ogr/ogrsf_frmts/sqlite/ogrsqliteviewlayer.cpp +++ b/ogr/ogrsf_frmts/sqlite/ogrsqliteviewlayer.cpp @@ -360,10 +360,10 @@ OGRErr OGRSQLiteViewLayer::SetAttributeFilter(const char *pszQuery) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRSQLiteViewLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGRSQLiteViewLayer::ISetSpatialFilter(int, const OGRGeometry *poGeomIn) { if (InstallFilter(poGeomIn)) @@ -372,6 +372,7 @@ void OGRSQLiteViewLayer::SetSpatialFilter(OGRGeometry *poGeomIn) ResetReading(); } + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/vrt/ogr_vrt.h b/ogr/ogrsf_frmts/vrt/ogr_vrt.h index 636168adb036..9173bddc024e 100644 --- a/ogr/ogrsf_frmts/vrt/ogr_vrt.h +++ b/ogr/ogrsf_frmts/vrt/ogr_vrt.h @@ -167,9 +167,8 @@ class OGRVRTLayer final : public OGRLayer virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce = TRUE) override; - virtual void SetSpatialFilter(OGRGeometry *poGeomIn) override; - virtual void SetSpatialFilter(int iGeomField, - OGRGeometry *poGeomIn) override; + virtual OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) override; virtual OGRErr ICreateFeature(OGRFeature *poFeature) override; diff --git a/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp b/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp index 41f76e74bb3d..86c0b3b07061 100644 --- a/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp +++ b/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp @@ -2226,37 +2226,25 @@ GIntBig OGRVRTLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRVRTLayer::SetSpatialFilter(OGRGeometry *poGeomIn) +OGRErr OGRVRTLayer::ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeomIn) { - SetSpatialFilter(0, poGeomIn); -} - -void OGRVRTLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) -{ - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount()) - { - if (poGeomIn != nullptr) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return; - } - if (!bHasFullInitialized) FullInitialize(); if (!poSrcLayer || poDS->GetRecursionDetected()) - return; + return OGRERR_FAILURE; - if (apoGeomFieldProps[iGeomField]->eGeometryStyle == VGS_Direct) + if (iGeomField >= 0 && iGeomField < GetLayerDefn()->GetGeomFieldCount() && + apoGeomFieldProps[iGeomField]->eGeometryStyle == VGS_Direct) bNeedReset = true; m_iGeomFieldFilter = iGeomField; if (InstallFilter(poGeomIn)) ResetReading(); + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/wfs/ogr_wfs.h b/ogr/ogrsf_frmts/wfs/ogr_wfs.h index 92174b012c51..af18ad03f027 100644 --- a/ogr/ogrsf_frmts/wfs/ogr_wfs.h +++ b/ogr/ogrsf_frmts/wfs/ogr_wfs.h @@ -144,12 +144,8 @@ class OGRWFSLayer final : public OGRLayer virtual int TestCapability(const char *) override; - virtual void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) override; @@ -289,12 +285,8 @@ class OGRWFSJoinLayer final : public OGRLayer virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual void SetSpatialFilter(OGRGeometry *) override; - - virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override - { - OGRLayer::SetSpatialFilter(iGeomField, poGeom); - } + OGRErr ISetSpatialFilter(int iGeomField, + const OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) override; }; diff --git a/ogr/ogrsf_frmts/wfs/ogrwfsjoinlayer.cpp b/ogr/ogrsf_frmts/wfs/ogrwfsjoinlayer.cpp index aef643114b56..ac335b766979 100644 --- a/ogr/ogrsf_frmts/wfs/ogrwfsjoinlayer.cpp +++ b/ogr/ogrsf_frmts/wfs/ogrwfsjoinlayer.cpp @@ -779,15 +779,19 @@ int OGRWFSJoinLayer::TestCapability(const char *) } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRWFSJoinLayer::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr OGRWFSJoinLayer::ISetSpatialFilter(int, const OGRGeometry *poGeom) { if (poGeom != nullptr) + { CPLError(CE_Failure, CPLE_NotSupported, "Setting a spatial filter on a layer resulting from a WFS " "join is unsupported"); + return OGRERR_FAILURE; + } + return OGRERR_NONE; } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp b/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp index 6b8467ba69d3..8c6bd9e25791 100644 --- a/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp +++ b/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp @@ -1383,10 +1383,10 @@ OGRFeature *OGRWFSLayer::GetNextFeature() } /************************************************************************/ -/* SetSpatialFilter() */ +/* ISetSpatialFilter() */ /************************************************************************/ -void OGRWFSLayer::SetSpatialFilter(OGRGeometry *poGeom) +OGRErr OGRWFSLayer::ISetSpatialFilter(int iGeomField, const OGRGeometry *poGeom) { if (bStreamingDS) { @@ -1415,8 +1415,9 @@ void OGRWFSLayer::SetSpatialFilter(OGRGeometry *poGeom) bReloadNeeded = true; } nFeatures = -1; - OGRLayer::SetSpatialFilter(poGeom); + const OGRErr eErr = OGRLayer::ISetSpatialFilter(iGeomField, poGeom); ResetReading(); + return eErr; } /************************************************************************/