From 261aaf826bb2b97e2dde57e5d208f428270a346b Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 6 Feb 2025 18:33:26 +0100 Subject: [PATCH 1/2] RFC 107: make OGRLayer::GetExtent[3D]() non-virtual and add virtual IGetExtent[3D]() --- MIGRATION_GUIDE.TXT | 13 + apps/gdalalg_vector_select.cpp | 8 +- frmts/eeda/eedadataset.cpp | 12 +- frmts/mbtiles/mbtilesdataset.cpp | 14 +- frmts/ogcapi/gdalogcapidataset.cpp | 13 +- frmts/pcidsk/ogrpcidsklayer.cpp | 5 +- frmts/pcidsk/pcidskdataset2.h | 9 +- frmts/tiledb/tiledbheaders.h | 8 +- frmts/tiledb/tiledbsparse.cpp | 7 +- gcore/gdalpythondriverloader.cpp | 17 +- gnm/gnm.h | 6 +- gnm/gnmlayer.cpp | 9 +- ogr/ogrsf_frmts/adbc/ogr_adbc.h | 9 +- ogr/ogrsf_frmts/adbc/ogradbclayer.cpp | 45 +- ogr/ogrsf_frmts/amigocloud/ogr_amigocloud.h | 9 +- .../amigocloud/ogramigocloudtablelayer.cpp | 22 +- ogr/ogrsf_frmts/arrow_common/ogr_arrow.h | 9 +- .../arrow_common/ograrrowlayer.hpp | 45 +- ogr/ogrsf_frmts/carto/ogr_carto.h | 9 +- ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp | 24 +- ogr/ogrsf_frmts/dgn/ogr_dgn.h | 8 +- ogr/ogrsf_frmts/dgn/ogrdgnlayer.cpp | 5 +- ogr/ogrsf_frmts/dwg/ogr_dgnv8.h | 8 +- ogr/ogrsf_frmts/dwg/ogrdgnv8layer.cpp | 7 +- ogr/ogrsf_frmts/edigeo/ogr_edigeo.h | 8 - ogr/ogrsf_frmts/edigeo/ogredigeolayer.cpp | 18 - ogr/ogrsf_frmts/elastic/ogr_elastic.h | 9 +- ogr/ogrsf_frmts/elastic/ogrelasticlayer.cpp | 22 +- ogr/ogrsf_frmts/filegdb/FGdbLayer.cpp | 6 +- ogr/ogrsf_frmts/filegdb/ogr_fgdb.h | 9 +- ogr/ogrsf_frmts/flatgeobuf/ogr_flatgeobuf.h | 9 +- .../flatgeobuf/ogrflatgeobuflayer.cpp | 5 +- ogr/ogrsf_frmts/generic/ogr_gensql.cpp | 21 +- ogr/ogrsf_frmts/generic/ogr_gensql.h | 9 +- ogr/ogrsf_frmts/generic/ogreditablelayer.cpp | 17 +- ogr/ogrsf_frmts/generic/ogreditablelayer.h | 5 +- ogr/ogrsf_frmts/generic/ogrlayer.cpp | 400 ++++++++++++++---- ogr/ogrsf_frmts/generic/ogrlayerdecorator.cpp | 11 +- ogr/ogrsf_frmts/generic/ogrlayerdecorator.h | 7 +- ogr/ogrsf_frmts/generic/ogrlayerpool.cpp | 17 +- ogr/ogrsf_frmts/generic/ogrlayerpool.h | 5 +- ogr/ogrsf_frmts/generic/ogrmutexedlayer.cpp | 12 +- ogr/ogrsf_frmts/generic/ogrmutexedlayer.h | 5 +- ogr/ogrsf_frmts/generic/ogrunionlayer.cpp | 15 +- ogr/ogrsf_frmts/generic/ogrunionlayer.h | 5 +- ogr/ogrsf_frmts/generic/ogrwarpedlayer.cpp | 15 +- ogr/ogrsf_frmts/generic/ogrwarpedlayer.h | 5 +- .../geoconcept/ogrgeoconceptlayer.cpp | 6 +- .../geoconcept/ogrgeoconceptlayer.h | 9 +- ogr/ogrsf_frmts/geojson/ogr_geojson.h | 19 +- ogr/ogrsf_frmts/geojson/ogrgeojsondriver.cpp | 17 +- ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp | 17 +- .../geojson/ogrgeojsonwritelayer.cpp | 5 +- ogr/ogrsf_frmts/gml/ogr_gml.h | 9 +- ogr/ogrsf_frmts/gml/ogrgmllayer.cpp | 7 +- ogr/ogrsf_frmts/gmt/ogr_gmt.h | 9 +- ogr/ogrsf_frmts/gmt/ogrgmtlayer.cpp | 7 +- ogr/ogrsf_frmts/gpkg/ogr_geopackage.h | 30 +- .../gpkg/ogrgeopackageselectlayer.cpp | 6 +- .../gpkg/ogrgeopackagetablelayer.cpp | 22 +- ogr/ogrsf_frmts/hana/ogr_hana.h | 13 +- ogr/ogrsf_frmts/hana/ogrhanalayer.cpp | 25 +- ogr/ogrsf_frmts/hana/ogrhanatablelayer.cpp | 8 +- ogr/ogrsf_frmts/idb/ogr_idb.h | 9 +- ogr/ogrsf_frmts/idb/ogridbselectlayer.cpp | 6 +- ogr/ogrsf_frmts/idrisi/ogr_idrisi.h | 9 +- ogr/ogrsf_frmts/idrisi/ogridrisilayer.cpp | 7 +- ogr/ogrsf_frmts/libkml/ogr_libkml.h | 9 +- ogr/ogrsf_frmts/libkml/ogrlibkmllayer.cpp | 7 +- ogr/ogrsf_frmts/miramon/ogrmiramon.h | 9 +- ogr/ogrsf_frmts/miramon/ogrmiramonlayer.cpp | 5 +- ogr/ogrsf_frmts/mitab/mitab.h | 45 +- ogr/ogrsf_frmts/mitab/mitab_miffile.cpp | 5 +- ogr/ogrsf_frmts/mitab/mitab_tabfile.cpp | 5 +- ogr/ogrsf_frmts/mitab/mitab_tabseamless.cpp | 7 +- ogr/ogrsf_frmts/mitab/mitab_tabview.cpp | 7 +- .../mssqlspatial/ogr_mssqlspatial.h | 17 +- .../ogrmssqlspatialselectlayer.cpp | 13 - .../ogrmssqlspatialtablelayer.cpp | 25 +- ogr/ogrsf_frmts/mvt/ogrmvtdataset.cpp | 16 +- ogr/ogrsf_frmts/mysql/ogr_mysql.h | 8 +- ogr/ogrsf_frmts/mysql/ogrmysqltablelayer.cpp | 6 +- ogr/ogrsf_frmts/nas/ogr_nas.h | 9 +- ogr/ogrsf_frmts/nas/ogrnaslayer.cpp | 7 +- ogr/ogrsf_frmts/ngw/ogr_ngw.h | 5 +- ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp | 13 +- ogr/ogrsf_frmts/oapif/ogroapifdriver.cpp | 15 +- ogr/ogrsf_frmts/oci/ogr_oci.h | 9 +- ogr/ogrsf_frmts/oci/ogrocitablelayer.cpp | 7 +- ogr/ogrsf_frmts/odbc/ogr_odbc.h | 9 +- ogr/ogrsf_frmts/odbc/ogrodbcselectlayer.cpp | 6 +- ogr/ogrsf_frmts/ogrsf_frmts.dox | 205 --------- ogr/ogrsf_frmts/ogrsf_frmts.h | 21 +- ogr/ogrsf_frmts/openfilegdb/ogr_openfilegdb.h | 13 +- .../openfilegdb/ogropenfilegdbdatasource.cpp | 11 +- .../openfilegdb/ogropenfilegdblayer.cpp | 15 +- ogr/ogrsf_frmts/osm/ogr_osm.h | 9 +- ogr/ogrsf_frmts/osm/ogrosmlayer.cpp | 6 +- ogr/ogrsf_frmts/parquet/ogr_parquet.h | 5 +- .../parquet/ogrparquetdatasetlayer.cpp | 27 +- ogr/ogrsf_frmts/pg/ogr_pg.h | 22 +- ogr/ogrsf_frmts/pg/ogrpglayer.cpp | 41 +- ogr/ogrsf_frmts/pg/ogrpgtablelayer.cpp | 19 +- ogr/ogrsf_frmts/pgeo/ogr_pgeo.h | 9 +- ogr/ogrsf_frmts/pgeo/ogrpgeotablelayer.cpp | 6 +- ogr/ogrsf_frmts/plscenes/ogr_plscenes.h | 9 +- .../plscenes/ogrplscenesdatav1layer.cpp | 7 +- ogr/ogrsf_frmts/pmtiles/ogr_pmtiles.h | 8 +- .../pmtiles/ogrpmtilesvectorlayer.cpp | 5 +- ogr/ogrsf_frmts/s57/ogr_s57.h | 9 +- ogr/ogrsf_frmts/s57/ogrs57layer.cpp | 5 +- ogr/ogrsf_frmts/selafin/ogr_selafin.h | 9 +- ogr/ogrsf_frmts/selafin/ogrselafinlayer.cpp | 5 +- ogr/ogrsf_frmts/shape/ogrshape.h | 12 +- ogr/ogrsf_frmts/shape/ogrshapelayer.cpp | 20 +- ogr/ogrsf_frmts/sqlite/ogr_sqlite.h | 24 +- ogr/ogrsf_frmts/sqlite/ogrsqlitebase.h | 5 +- .../sqlite/ogrsqliteselectlayer.cpp | 12 +- .../sqlite/ogrsqlitetablelayer.cpp | 34 +- ogr/ogrsf_frmts/sxf/ogr_sxf.h | 9 +- ogr/ogrsf_frmts/sxf/ogrsxflayer.cpp | 7 +- ogr/ogrsf_frmts/vrt/ogr_vrt.h | 5 +- ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp | 15 +- ogr/ogrsf_frmts/wfs/ogr_wfs.h | 9 +- ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp | 11 +- 125 files changed, 776 insertions(+), 1313 deletions(-) diff --git a/MIGRATION_GUIDE.TXT b/MIGRATION_GUIDE.TXT index 883819628f47..4773e97f7e24 100644 --- a/MIGRATION_GUIDE.TXT +++ b/MIGRATION_GUIDE.TXT @@ -1,6 +1,19 @@ MIGRATION GUIDE FROM GDAL 3.10 to GDAL 3.11 ------------------------------------------- +- The OGRLayer::GetExtent(OGREnvelope*, int bForce) and + OGRLayer::GetExtent(int iGeomField, OGREnvelope*, int bForce) methods are + no longer virtual methods that are implemented by drivers, and the ``int bForce`` + parameter is now a ``bool bForce``. + Drivers may implement the new IGetExtent(int iGeomField, OGREnvelope*, + bool bForce) protected virtual method. The public method checks that the + iGeomField value is in range. + Similarly for OGRLayer::GetExtent3D(int iGeomField, OGREnvelope3D*, int bForce) + which is now a user facing method (with the change that the ``int bForce`` is now a + ``bool bForce``). Drivers may implement the new IGetExtent3D(int iGeomField, OGREnvelope3D*, + bool bForce) protected virtual method. The public method checks 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/gdalalg_vector_select.cpp b/apps/gdalalg_vector_select.cpp index 73dec61fc0e1..28c10de25f6e 100644 --- a/apps/gdalalg_vector_select.cpp +++ b/apps/gdalalg_vector_select.cpp @@ -246,12 +246,8 @@ class GDALVectorSelectAlgorithmLayer final return OGRLayer::GetFeatureCount(bForce); } - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override - { - return m_oSrcLayer.GetExtent(psExtent, bForce); - } - - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) override + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override { return m_oSrcLayer.GetExtent(iGeomField, psExtent, bForce); } diff --git a/frmts/eeda/eedadataset.cpp b/frmts/eeda/eedadataset.cpp index 5620cb42af4d..05e7cb6d703d 100644 --- a/frmts/eeda/eedadataset.cpp +++ b/frmts/eeda/eedadataset.cpp @@ -150,13 +150,8 @@ class GDALEEDALayer final : public OGRLayer virtual OGRErr SetAttributeFilter(const char *) CPL_OVERRIDE; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) CPL_OVERRIDE; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) CPL_OVERRIDE - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; }; /************************************************************************/ @@ -971,7 +966,8 @@ void GDALEEDALayer::SetSpatialFilter(OGRGeometry *poGeomIn) /* GetExtent() */ /************************************************************************/ -OGRErr GDALEEDALayer::GetExtent(OGREnvelope *psExtent, int /* bForce */) +OGRErr GDALEEDALayer::IGetExtent(int /* iGeomField*/, OGREnvelope *psExtent, + bool /* bForce */) { psExtent->MinX = -180; psExtent->MinY = -90; diff --git a/frmts/mbtiles/mbtilesdataset.cpp b/frmts/mbtiles/mbtilesdataset.cpp index 0dd0d6408a4e..1e14ba7071c5 100644 --- a/frmts/mbtiles/mbtilesdataset.cpp +++ b/frmts/mbtiles/mbtilesdataset.cpp @@ -271,13 +271,8 @@ class MBTilesVectorLayer final : public OGRLayer virtual GIntBig GetFeatureCount(int bForce) override; virtual int TestCapability(const char *) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual void SetSpatialFilter(OGRGeometry *) override; @@ -1536,10 +1531,11 @@ int MBTilesVectorLayer::TestCapability(const char *pszCap) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr MBTilesVectorLayer::GetExtent(OGREnvelope *psExtent, int) +OGRErr MBTilesVectorLayer::IGetExtent(int /* iGeomField */, + OGREnvelope *psExtent, bool /* bForce */) { *psExtent = m_sExtent; return OGRERR_NONE; diff --git a/frmts/ogcapi/gdalogcapidataset.cpp b/frmts/ogcapi/gdalogcapidataset.cpp index 25e60e0399b8..c88b04b84894 100644 --- a/frmts/ogcapi/gdalogcapidataset.cpp +++ b/frmts/ogcapi/gdalogcapidataset.cpp @@ -297,12 +297,8 @@ class OGCAPITiledLayer final return -1; } - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; void SetSpatialFilter(OGRGeometry *) override; @@ -2771,10 +2767,11 @@ void OGCAPITiledLayer::SetExtent(double dfXMin, double dfYMin, double dfXMax, } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGCAPITiledLayer::GetExtent(OGREnvelope *psExtent, int /* bForce */) +OGRErr OGCAPITiledLayer::IGetExtent(int /* iGeomField */, OGREnvelope *psExtent, + bool /* bForce */) { *psExtent = m_sEnvelope; return OGRERR_NONE; diff --git a/frmts/pcidsk/ogrpcidsklayer.cpp b/frmts/pcidsk/ogrpcidsklayer.cpp index 77b1c6d14fac..71990a0438e3 100644 --- a/frmts/pcidsk/ogrpcidsklayer.cpp +++ b/frmts/pcidsk/ogrpcidsklayer.cpp @@ -476,10 +476,11 @@ GIntBig OGRPCIDSKLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRPCIDSKLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRPCIDSKLayer::IGetExtent(int /*iGeomField*/, OGREnvelope *psExtent, + bool bForce) { if (!bForce) diff --git a/frmts/pcidsk/pcidskdataset2.h b/frmts/pcidsk/pcidskdataset2.h index 07c30966a218..bc446a0b9cd1 100644 --- a/frmts/pcidsk/pcidskdataset2.h +++ b/frmts/pcidsk/pcidskdataset2.h @@ -198,13 +198,8 @@ class OGRPCIDSKLayer final : public OGRLayer, int bApproxOK = TRUE) override; GIntBig GetFeatureCount(int) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; GDALDataset *GetDataset() override { diff --git a/frmts/tiledb/tiledbheaders.h b/frmts/tiledb/tiledbheaders.h index 46c271ba380f..61d34c37c480 100644 --- a/frmts/tiledb/tiledbheaders.h +++ b/frmts/tiledb/tiledbheaders.h @@ -480,12 +480,8 @@ class OGRTileDBLayer final : public OGRLayer, OGRErr CreateField(const OGRFieldDefn *poField, int bApproxOK) override; int TestCapability(const char *) override; GIntBig GetFeatureCount(int bForce) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; const char *GetFIDColumn() override { diff --git a/frmts/tiledb/tiledbsparse.cpp b/frmts/tiledb/tiledbsparse.cpp index 4ec7384f6f3f..82cfcae43cb4 100644 --- a/frmts/tiledb/tiledbsparse.cpp +++ b/frmts/tiledb/tiledbsparse.cpp @@ -3406,17 +3406,18 @@ GIntBig OGRTileDBLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRTileDBLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRTileDBLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (m_oLayerExtent.IsInit()) { *psExtent = m_oLayerExtent; return OGRERR_NONE; } - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/gcore/gdalpythondriverloader.cpp b/gcore/gdalpythondriverloader.cpp index adc7bb7b25ab..db2fda824088 100644 --- a/gcore/gdalpythondriverloader.cpp +++ b/gcore/gdalpythondriverloader.cpp @@ -338,12 +338,8 @@ class PythonPluginLayer final : public OGRLayer void SetSpatialFilter(OGRGeometry *) override; void SetSpatialFilter(int iGeomField, OGRGeometry *) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; char **GetMetadata(const char *pszDomain = "") override; }; @@ -680,10 +676,11 @@ GIntBig PythonPluginLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr PythonPluginLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr PythonPluginLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { GIL_Holder oHolder(false); if (PyObject_HasAttrString(m_poLayer, "extent")) @@ -696,7 +693,7 @@ OGRErr PythonPluginLayer::GetExtent(OGREnvelope *psExtent, int bForce) if (ErrOccurredEmitCPLError()) { Py_DecRef(poRet); - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } if (poRet == Py_None) @@ -736,7 +733,7 @@ OGRErr PythonPluginLayer::GetExtent(OGREnvelope *psExtent, int bForce) Py_DecRef(poRet); } } - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/gnm/gnm.h b/gnm/gnm.h index b64d711a2afe..643b47d72b61 100644 --- a/gnm/gnm.h +++ b/gnm/gnm.h @@ -521,9 +521,9 @@ class GNMGenericLayer : public OGRLayer virtual OGRSpatialReference *GetSpatialRef() override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; + + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce = true) override; virtual int TestCapability(const char *) override; diff --git a/gnm/gnmlayer.cpp b/gnm/gnmlayer.cpp index 19c2c5b8b8b3..bfae4b8f97c6 100644 --- a/gnm/gnmlayer.cpp +++ b/gnm/gnmlayer.cpp @@ -279,13 +279,8 @@ GIntBig GNMGenericLayer::GetFeatureCount(int bForce) return m_poLayer->GetFeatureCount(bForce); } -OGRErr GNMGenericLayer::GetExtent(OGREnvelope *psExtent, int bForce) -{ - return m_poLayer->GetExtent(psExtent, bForce); -} - -OGRErr GNMGenericLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr GNMGenericLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { return m_poLayer->GetExtent(iGeomField, psExtent, bForce); } diff --git a/ogr/ogrsf_frmts/adbc/ogr_adbc.h b/ogr/ogrsf_frmts/adbc/ogr_adbc.h index 3db9930ca266..3a6517b95147 100644 --- a/ogr/ogrsf_frmts/adbc/ogr_adbc.h +++ b/ogr/ogrsf_frmts/adbc/ogr_adbc.h @@ -162,11 +162,10 @@ class OGRADBCLayer final : public OGRLayer, OGRErr SetAttributeFilter(const char *pszFilter) override; void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; - OGRErr GetExtent3D(int iGeomField, OGREnvelope3D *psExtent, - int bForce = TRUE) override; + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; + OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent, + bool bForce) override; }; /************************************************************************/ diff --git a/ogr/ogrsf_frmts/adbc/ogradbclayer.cpp b/ogr/ogrsf_frmts/adbc/ogradbclayer.cpp index d8709d8936ff..726128971776 100644 --- a/ogr/ogrsf_frmts/adbc/ogradbclayer.cpp +++ b/ogr/ogrsf_frmts/adbc/ogradbclayer.cpp @@ -595,60 +595,31 @@ void OGRADBCLayer::ResetReading() } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRADBCLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRADBCLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { - return GetExtent(0, psExtent, bForce); -} - -/************************************************************************/ -/* GetExtent() */ -/************************************************************************/ - -OGRErr OGRADBCLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) -{ - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount()) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return OGRERR_FAILURE; - } - *psExtent = m_extents[iGeomField]; if (psExtent->IsInit()) return OGRERR_NONE; - return GetExtentInternal(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ -/* GetExtent3D() */ +/* IGetExtent3D() */ /************************************************************************/ -OGRErr OGRADBCLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent, - int bForce) +OGRErr OGRADBCLayer::IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent, + bool bForce) { - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount()) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return OGRERR_FAILURE; - } - *psExtent = m_extents[iGeomField]; if (psExtent->IsInit()) return OGRERR_NONE; - return GetExtentInternal(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent3D(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/amigocloud/ogr_amigocloud.h b/ogr/ogrsf_frmts/amigocloud/ogr_amigocloud.h index 6a00adbe37d5..fe8f621973ae 100644 --- a/ogr/ogrsf_frmts/amigocloud/ogr_amigocloud.h +++ b/ogr/ogrsf_frmts/amigocloud/ogr_amigocloud.h @@ -189,13 +189,8 @@ class OGRAmigoCloudTableLayer final : public OGRAmigoCloudLayer virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override - { - return GetExtent(0, psExtent, bForce); - } - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; void SetDeferredCreation(OGRwkbGeometryType eGType, OGRSpatialReference *poSRS, int bGeomNullable); diff --git a/ogr/ogrsf_frmts/amigocloud/ogramigocloudtablelayer.cpp b/ogr/ogrsf_frmts/amigocloud/ogramigocloudtablelayer.cpp index 27b2e066d04e..62fd91b9efe9 100644 --- a/ogr/ogrsf_frmts/amigocloud/ogramigocloudtablelayer.cpp +++ b/ogr/ogrsf_frmts/amigocloud/ogramigocloudtablelayer.cpp @@ -885,14 +885,14 @@ GIntBig OGRAmigoCloudTableLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /* */ /* For PostGIS use internal Extend(geometry) function */ /* in other cases we use standard OGRLayer::GetExtent() */ /************************************************************************/ -OGRErr OGRAmigoCloudTableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRAmigoCloudTableLayer::IGetExtent(int iGeomField, + OGREnvelope *psExtent, bool bForce) { CPLString osSQL; @@ -900,17 +900,6 @@ OGRErr OGRAmigoCloudTableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, return OGRERR_FAILURE; FlushDeferredInsert(); - 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 OGRERR_FAILURE; - } - OGRGeomFieldDefn *poGeomFieldDefn = poFeatureDefn->GetGeomFieldDefn(iGeomField); @@ -986,10 +975,7 @@ OGRErr OGRAmigoCloudTableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, if (poObj != nullptr) json_object_put(poObj); - if (iGeomField == 0) - return OGRLayer::GetExtent(psExtent, bForce); - else - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/arrow_common/ogr_arrow.h b/ogr/ogrsf_frmts/arrow_common/ogr_arrow.h index 522d3b273063..ab0b4ca10d22 100644 --- a/ogr/ogrsf_frmts/arrow_common/ogr_arrow.h +++ b/ogr/ogrsf_frmts/arrow_common/ogr_arrow.h @@ -298,11 +298,10 @@ class OGRArrowLayer CPL_NON_FINAL return m_osFIDColumn.c_str(); } DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(OGRArrowLayer) - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; - OGRErr GetExtent3D(int iGeomField, OGREnvelope3D *psExtent, - int bForce = TRUE) override; + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; + OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent, + bool bForce) override; OGRErr SetAttributeFilter(const char *pszFilter) override; void SetSpatialFilter(OGRGeometry *poGeom) override diff --git a/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp b/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp index bc6453618ae3..780c5e73e281 100644 --- a/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp +++ b/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp @@ -5064,15 +5064,6 @@ inline OGRFeature *OGRArrowLayer::GetNextRawFeature() return poFeature; } -/************************************************************************/ -/* GetExtent() */ -/************************************************************************/ - -inline OGRErr OGRArrowLayer::GetExtent(OGREnvelope *psExtent, int bForce) -{ - return GetExtent(0, psExtent, bForce); -} - /************************************************************************/ /* GetExtentFromMetadata() */ /************************************************************************/ @@ -5178,22 +5169,12 @@ inline bool OGRArrowLayer::FastGetExtent(int iGeomField, } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -inline OGRErr OGRArrowLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +inline OGRErr OGRArrowLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { - if (iGeomField < 0 || iGeomField >= m_poFeatureDefn->GetGeomFieldCount()) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return OGRERR_FAILURE; - } - if (FastGetExtent(iGeomField, psExtent)) { return OGRERR_NONE; @@ -5387,7 +5368,7 @@ inline OGRErr OGRArrowLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, } } - return GetExtentInternal(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ @@ -5415,28 +5396,18 @@ inline bool OGRArrowLayer::FastGetExtent3D(int iGeomField, } /************************************************************************/ -/* GetExtent3D() */ +/* IGetExtent3D() */ /************************************************************************/ -inline OGRErr OGRArrowLayer::GetExtent3D(int iGeomField, - OGREnvelope3D *psExtent, int bForce) +inline OGRErr OGRArrowLayer::IGetExtent3D(int iGeomField, + OGREnvelope3D *psExtent, bool bForce) { - if (iGeomField < 0 || iGeomField >= m_poFeatureDefn->GetGeomFieldCount()) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return OGRERR_FAILURE; - } - if (FastGetExtent3D(iGeomField, psExtent)) { return OGRERR_NONE; } - return OGRLayer::GetExtent3D(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent3D(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/carto/ogr_carto.h b/ogr/ogrsf_frmts/carto/ogr_carto.h index 35b3fe0caa8a..faf77089779c 100644 --- a/ogr/ogrsf_frmts/carto/ogr_carto.h +++ b/ogr/ogrsf_frmts/carto/ogr_carto.h @@ -172,13 +172,8 @@ class OGRCARTOTableLayer final : public OGRCARTOLayer virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override - { - return GetExtent(0, psExtent, bForce); - } - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override; + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; void SetLaunderFlag(bool bFlag) { diff --git a/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp b/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp index 50e263a4d04d..8c7a17879e83 100644 --- a/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp +++ b/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp @@ -1733,14 +1733,14 @@ GIntBig OGRCARTOTableLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /* */ /* For PostGIS use internal Extend(geometry) function */ -/* in other cases we use standard OGRLayer::GetExtent() */ +/* in other cases we use standard OGRLayer::IGetExtent() */ /************************************************************************/ -OGRErr OGRCARTOTableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRCARTOTableLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { CPLString osSQL; @@ -1749,17 +1749,6 @@ OGRErr OGRCARTOTableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, if (FlushDeferredBuffer() != OGRERR_NONE) return OGRERR_FAILURE; - 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 OGRERR_FAILURE; - } - OGRGeomFieldDefn *poGeomFieldDefn = poFeatureDefn->GetGeomFieldDefn(iGeomField); @@ -1835,10 +1824,7 @@ OGRErr OGRCARTOTableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, if (poObj != nullptr) json_object_put(poObj); - if (iGeomField == 0) - return OGRLayer::GetExtent(psExtent, bForce); - else - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/dgn/ogr_dgn.h b/ogr/ogrsf_frmts/dgn/ogr_dgn.h index 0debc2ad45a6..307845d41294 100644 --- a/ogr/ogrsf_frmts/dgn/ogr_dgn.h +++ b/ogr/ogrsf_frmts/dgn/ogr_dgn.h @@ -65,13 +65,9 @@ class OGRDGNLayer final : public OGRLayer OGRFeature *GetFeature(GIntBig nFeatureId) override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; OGRFeatureDefn *GetLayerDefn() override { diff --git a/ogr/ogrsf_frmts/dgn/ogrdgnlayer.cpp b/ogr/ogrsf_frmts/dgn/ogrdgnlayer.cpp index 007fc3eb743b..533e5c654b9a 100644 --- a/ogr/ogrsf_frmts/dgn/ogrdgnlayer.cpp +++ b/ogr/ogrsf_frmts/dgn/ogrdgnlayer.cpp @@ -984,10 +984,11 @@ GIntBig OGRDGNLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRDGNLayer::GetExtent(OGREnvelope *psExtent, int /* bForce */) +OGRErr OGRDGNLayer::IGetExtent(int /* iGeomField */, OGREnvelope *psExtent, + bool /* bForce */) { double adfExtents[6]; diff --git a/ogr/ogrsf_frmts/dwg/ogr_dgnv8.h b/ogr/ogrsf_frmts/dwg/ogr_dgnv8.h index 5cc10a096628..fb35ffaa62dd 100644 --- a/ogr/ogrsf_frmts/dwg/ogr_dgnv8.h +++ b/ogr/ogrsf_frmts/dwg/ogr_dgnv8.h @@ -86,13 +86,9 @@ class OGRDGNV8Layer final : public OGRLayer void ResetReading() override; OGRFeature *GetNextFeature() override; OGRFeature *GetFeature(GIntBig nFID) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; OGRFeatureDefn *GetLayerDefn() override { diff --git a/ogr/ogrsf_frmts/dwg/ogrdgnv8layer.cpp b/ogr/ogrsf_frmts/dwg/ogrdgnv8layer.cpp index 48d23edd9a39..5faff0aa9a31 100644 --- a/ogr/ogrsf_frmts/dwg/ogrdgnv8layer.cpp +++ b/ogr/ogrsf_frmts/dwg/ogrdgnv8layer.cpp @@ -1583,10 +1583,11 @@ OGRErr OGRDGNV8Layer::DeleteFeature(GIntBig nFID) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRDGNV8Layer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRDGNV8Layer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { OdDgModel::StorageUnitDescription description; m_pModel->getStorageUnit(description); @@ -1634,7 +1635,7 @@ OGRErr OGRDGNV8Layer::GetExtent(OGREnvelope *psExtent, int bForce) } if (bValid) return OGRERR_NONE; - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/edigeo/ogr_edigeo.h b/ogr/ogrsf_frmts/edigeo/ogr_edigeo.h index 91c45952b11d..c52492686cfe 100644 --- a/ogr/ogrsf_frmts/edigeo/ogr_edigeo.h +++ b/ogr/ogrsf_frmts/edigeo/ogr_edigeo.h @@ -58,14 +58,6 @@ class OGREDIGEOLayer final : public OGRLayer, virtual int TestCapability(const char *) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } - void AddFeature(OGRFeature *poFeature); int GetAttributeIndex(const CPLString &osRID); diff --git a/ogr/ogrsf_frmts/edigeo/ogredigeolayer.cpp b/ogr/ogrsf_frmts/edigeo/ogredigeolayer.cpp index 3c74bea444ee..0b792c1b2847 100644 --- a/ogr/ogrsf_frmts/edigeo/ogredigeolayer.cpp +++ b/ogr/ogrsf_frmts/edigeo/ogredigeolayer.cpp @@ -109,24 +109,6 @@ int OGREDIGEOLayer::TestCapability(const char *pszCap) return FALSE; } -/************************************************************************/ -/* GetExtent() */ -/************************************************************************/ - -OGRErr OGREDIGEOLayer::GetExtent(OGREnvelope *psExtent, int bForce) -{ - /*if (poDS->bExtentValid) - { - psExtent->MinX = poDS->dfMinX; - psExtent->MinY = poDS->dfMinY; - psExtent->MaxX = poDS->dfMaxX; - psExtent->MaxY = poDS->dfMaxY; - return OGRERR_NONE; - }*/ - - return OGRLayer::GetExtent(psExtent, bForce); -} - /************************************************************************/ /* GetFeatureCount() */ /************************************************************************/ diff --git a/ogr/ogrsf_frmts/elastic/ogr_elastic.h b/ogr/ogrsf_frmts/elastic/ogr_elastic.h index b9c662aeee07..e1970f84d493 100644 --- a/ogr/ogrsf_frmts/elastic/ogr_elastic.h +++ b/ogr/ogrsf_frmts/elastic/ogr_elastic.h @@ -196,13 +196,8 @@ class OGRElasticLayer final : public OGRLayer virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override; virtual OGRErr SetAttributeFilter(const char *pszFilter) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override - { - return GetExtent(0, psExtent, bForce); - } - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual OGRErr SyncToDisk() override; diff --git a/ogr/ogrsf_frmts/elastic/ogrelasticlayer.cpp b/ogr/ogrsf_frmts/elastic/ogrelasticlayer.cpp index 4582d7d9d828..2610ae6a03d3 100644 --- a/ogr/ogrsf_frmts/elastic/ogrelasticlayer.cpp +++ b/ogr/ogrsf_frmts/elastic/ogrelasticlayer.cpp @@ -3887,24 +3887,14 @@ void OGRElasticLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRElasticLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRElasticLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { FinalizeFeatureDefn(); - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount()) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return OGRERR_FAILURE; - } - // geo_shape aggregation is only available since ES 7.8, but only with XPack // for now if (!m_abIsGeoPoint[iGeomField] && @@ -3912,8 +3902,7 @@ OGRErr OGRElasticLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, (m_poDS->m_nMajorVersion == 7 && m_poDS->m_nMinorVersion >= 8))) { m_bUseSingleQueryParams = true; - const auto eRet = - OGRLayer::GetExtentInternal(iGeomField, psExtent, bForce); + const auto eRet = OGRLayer::IGetExtent(iGeomField, psExtent, bForce); m_bUseSingleQueryParams = false; return eRet; } @@ -3968,8 +3957,7 @@ OGRErr OGRElasticLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, poBottomRightLon == nullptr || poBottomRightLat == nullptr) { m_bUseSingleQueryParams = true; - const auto eRet = - OGRLayer::GetExtentInternal(iGeomField, psExtent, bForce); + const auto eRet = OGRLayer::IGetExtent(iGeomField, psExtent, bForce); m_bUseSingleQueryParams = false; return eRet; } diff --git a/ogr/ogrsf_frmts/filegdb/FGdbLayer.cpp b/ogr/ogrsf_frmts/filegdb/FGdbLayer.cpp index 2738d820d32d..fa3ece2cfc7e 100644 --- a/ogr/ogrsf_frmts/filegdb/FGdbLayer.cpp +++ b/ogr/ogrsf_frmts/filegdb/FGdbLayer.cpp @@ -1508,10 +1508,10 @@ const char *FGdbLayer::GetMetadataItem(const char *pszName, } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr FGdbLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr FGdbLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) { if (m_pTable == nullptr) return OGRERR_FAILURE; @@ -1528,7 +1528,7 @@ OGRErr FGdbLayer::GetExtent(OGREnvelope *psExtent, int bForce) m_pFeatureDefn->GetFieldDefn(i)->IsIgnored(); m_pFeatureDefn->GetFieldDefn(i)->SetIgnored(TRUE); } - OGRErr eErr = OGRLayer::GetExtent(psExtent, bForce); + OGRErr eErr = OGRLayer::IGetExtent(iGeomField, psExtent, bForce); for (int i = 0; i < nFieldCount; i++) { m_pFeatureDefn->GetFieldDefn(i)->SetIgnored(pabSaveFieldIgnored[i]); diff --git a/ogr/ogrsf_frmts/filegdb/ogr_fgdb.h b/ogr/ogrsf_frmts/filegdb/ogr_fgdb.h index 631fd74c2580..4e6db96af54c 100644 --- a/ogr/ogrsf_frmts/filegdb/ogr_fgdb.h +++ b/ogr/ogrsf_frmts/filegdb/ogr_fgdb.h @@ -139,13 +139,8 @@ class FGdbLayer final : public FGdbBaseLayer return m_wstrType; } - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual GIntBig GetFeatureCount(int bForce) override; virtual OGRErr SetAttributeFilter(const char *pszQuery) override; diff --git a/ogr/ogrsf_frmts/flatgeobuf/ogr_flatgeobuf.h b/ogr/ogrsf_frmts/flatgeobuf/ogr_flatgeobuf.h index 993ef7774964..fe10b8184a77 100644 --- a/ogr/ogrsf_frmts/flatgeobuf/ogr_flatgeobuf.h +++ b/ogr/ogrsf_frmts/flatgeobuf/ogr_flatgeobuf.h @@ -169,13 +169,8 @@ class OGRFlatGeobufLayer final : public OGRLayer, } virtual GIntBig GetFeatureCount(int bForce) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; void VerifyBuffers(int bFlag) { diff --git a/ogr/ogrsf_frmts/flatgeobuf/ogrflatgeobuflayer.cpp b/ogr/ogrsf_frmts/flatgeobuf/ogrflatgeobuflayer.cpp index 76863d7718d7..500845b255fc 100644 --- a/ogr/ogrsf_frmts/flatgeobuf/ogrflatgeobuflayer.cpp +++ b/ogr/ogrsf_frmts/flatgeobuf/ogrflatgeobuflayer.cpp @@ -2397,14 +2397,15 @@ OGRErr OGRFlatGeobufLayer::ICreateFeature(OGRFeature *poNewFeature) } } -OGRErr OGRFlatGeobufLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRFlatGeobufLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (m_sExtent.IsInit()) { *psExtent = m_sExtent; return OGRERR_NONE; } - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } int OGRFlatGeobufLayer::TestCapability(const char *pszCap) diff --git a/ogr/ogrsf_frmts/generic/ogr_gensql.cpp b/ogr/ogrsf_frmts/generic/ogr_gensql.cpp index df85675f1176..b109f270a389 100644 --- a/ogr/ogrsf_frmts/generic/ogr_gensql.cpp +++ b/ogr/ogrsf_frmts/generic/ogr_gensql.cpp @@ -651,35 +651,22 @@ OGRErr OGRGenSQLResultsLayer::SetNextByIndex(GIntBig nIndex) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRGenSQLResultsLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRGenSQLResultsLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { swq_select *psSelectInfo = m_pSelectInfo.get(); - 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 OGRERR_FAILURE; - } - if (psSelectInfo->query_mode == SWQM_RECORDSET) { int iSrcGeomField = m_anGeomFieldToSrcGeomField[iGeomField]; if (iSrcGeomField >= 0) return m_poSrcLayer->GetExtent(iSrcGeomField, psExtent, bForce); - else if (iGeomField == 0) - return OGRLayer::GetExtent(psExtent, bForce); else - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } else return OGRERR_FAILURE; diff --git a/ogr/ogrsf_frmts/generic/ogr_gensql.h b/ogr/ogrsf_frmts/generic/ogr_gensql.h index b8b1aabe3824..bbafea6dd95e 100644 --- a/ogr/ogrsf_frmts/generic/ogr_gensql.h +++ b/ogr/ogrsf_frmts/generic/ogr_gensql.h @@ -117,13 +117,8 @@ class OGRGenSQLResultsLayer final : public OGRLayer virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override - { - return GetExtent(0, psExtent, bForce); - } - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual int TestCapability(const char *) override; diff --git a/ogr/ogrsf_frmts/generic/ogreditablelayer.cpp b/ogr/ogrsf_frmts/generic/ogreditablelayer.cpp index bab336a4d8be..399136e4eb68 100644 --- a/ogr/ogrsf_frmts/generic/ogreditablelayer.cpp +++ b/ogr/ogrsf_frmts/generic/ogreditablelayer.cpp @@ -629,20 +629,11 @@ GIntBig OGREditableLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGREditableLayer::GetExtent(OGREnvelope *psExtent, int bForce) -{ - return GetExtent(0, psExtent, bForce); -} - -/************************************************************************/ -/* GetExtent() */ -/************************************************************************/ - -OGRErr OGREditableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGREditableLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (!m_poDecoratedLayer) return OGRERR_FAILURE; @@ -662,7 +653,7 @@ OGRErr OGREditableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, } return eErr; } - return GetExtentInternal(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/generic/ogreditablelayer.h b/ogr/ogrsf_frmts/generic/ogreditablelayer.h index 1b60032a832d..bac3749c5090 100644 --- a/ogr/ogrsf_frmts/generic/ogreditablelayer.h +++ b/ogr/ogrsf_frmts/generic/ogreditablelayer.h @@ -97,9 +97,8 @@ class CPL_DLL OGREditableLayer : public OGRLayerDecorator virtual OGRSpatialReference *GetSpatialRef() override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual int TestCapability(const char *) override; diff --git a/ogr/ogrsf_frmts/generic/ogrlayer.cpp b/ogr/ogrsf_frmts/generic/ogrlayer.cpp index 231963c18160..8e34f1ce31d9 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayer.cpp +++ b/ogr/ogrsf_frmts/generic/ogrlayer.cpp @@ -190,34 +190,78 @@ GIntBig OGR_L_GetFeatureCount(OGRLayerH hLayer, int bForce) } /************************************************************************/ -/* GetExtent() */ +/* GetExtent() */ /************************************************************************/ -OGRErr OGRLayer::GetExtent(OGREnvelope *psExtent, int bForce) +/** + \brief Fetch the extent of this layer. -{ - return GetExtentInternal(0, psExtent, bForce); -} + Returns the extent (MBR) of the data in the layer. If bForce is FALSE, + and it would be expensive to establish the extent then OGRERR_FAILURE + will be returned indicating that the extent isn't know. If bForce is + TRUE then some implementations will actually scan the entire layer once + to compute the MBR of all the features in the layer. + + Depending on the drivers, the returned extent may or may not take the + spatial filter into account. So it is safer to call GetExtent() without + setting a spatial filter. + + Layers without any geometry may return OGRERR_FAILURE just indicating that + no meaningful extents could be collected. + + Note that some implementations of this method may alter the read cursor + of the layer. + + This method is the same as the C function OGR_L_GetExtent(). -OGRErr OGRLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) + @param psExtent the structure in which the extent value will be returned. + @param bForce Flag indicating whether the extent should be computed even + if it is expensive. + @return OGRERR_NONE on success, OGRERR_FAILURE if extent not known. +*/ + +OGRErr OGRLayer::GetExtent(OGREnvelope *psExtent, bool bForce) { - if (iGeomField == 0) - return GetExtent(psExtent, bForce); - else - return GetExtentInternal(iGeomField, psExtent, bForce); + return GetExtent(0, psExtent, bForce); } -OGRErr OGRLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, - int bForce) +/** + \brief Fetch the extent of this layer, on the specified geometry field. + + Returns the extent (MBR) of the data in the layer. If bForce is FALSE, + and it would be expensive to establish the extent then OGRERR_FAILURE + will be returned indicating that the extent isn't know. If bForce is + TRUE then some implementations will actually scan the entire layer once + to compute the MBR of all the features in the layer. + + Depending on the drivers, the returned extent may or may not take the + spatial filter into account. So it is safer to call GetExtent() without + setting a spatial filter. + Layers without any geometry may return OGRERR_FAILURE just indicating that + no meaningful extents could be collected. + + Note that some implementations of this method may alter the read cursor + of the layer. + + This method is the same as the C function OGR_L_GetExtentEx(). + + @param iGeomField the index of the geometry field on which to compute the extent. + @param psExtent the structure in which the extent value will be returned. + @param bForce Flag indicating whether the extent should be computed even + if it is expensive. + + @return OGRERR_NONE on success, OGRERR_FAILURE if extent not known. + +*/ + +OGRErr OGRLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) { - psExtent3D->MinX = 0.0; - psExtent3D->MaxX = 0.0; - psExtent3D->MinY = 0.0; - psExtent3D->MaxY = 0.0; - psExtent3D->MinZ = std::numeric_limits::infinity(); - psExtent3D->MaxZ = -std::numeric_limits::infinity(); + psExtent->MinX = 0.0; + psExtent->MaxX = 0.0; + psExtent->MinY = 0.0; + psExtent->MaxY = 0.0; /* -------------------------------------------------------------------- */ /* If this layer has a none geometry type, then we can */ @@ -234,6 +278,34 @@ OGRErr OGRLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, return OGRERR_FAILURE; } + return IGetExtent(iGeomField, psExtent, bForce); +} + +/************************************************************************/ +/* IGetExtent() */ +/************************************************************************/ + +/** + \brief Fetch the extent of this layer, on the specified geometry field. + + Virtual method implemented by drivers since 3.11. In previous versions, + GetExtent() itself was the virtual method. + + Driver implementations, when wanting to call the base method, must take + care of calling OGRLayer::IGetExtent() (and note the public method without + the leading I). + + @param iGeomField 0-based index of the geometry field to consider. + @param psExtent the computed extent of the layer. + @param bForce if TRUE, the extent will be computed even if all the + layer features have to be fetched. + @return OGRERR_NONE on success or an error code in case of failure. + @since GDAL 3.11 +*/ + +OGRErr OGRLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) + +{ /* -------------------------------------------------------------------- */ /* If not forced, we should avoid having to scan all the */ /* features and just return a failure. */ @@ -245,7 +317,7 @@ OGRErr OGRLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, /* OK, we hate to do this, but go ahead and read through all */ /* the features to collect geometries and build extents. */ /* -------------------------------------------------------------------- */ - OGREnvelope3D oEnv; + OGREnvelope oEnv; bool bExtentSet = false; for (auto &&poFeature : *this) @@ -257,26 +329,24 @@ OGRErr OGRLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, } else if (!bExtentSet) { - poGeom->getEnvelope(psExtent3D); - // This is required because getEnvelope initializes Z to 0 for 2D geometries - if (!poGeom->Is3D()) + poGeom->getEnvelope(psExtent); + if (!(std::isnan(psExtent->MinX) || std::isnan(psExtent->MinY) || + std::isnan(psExtent->MaxX) || std::isnan(psExtent->MaxY))) { - psExtent3D->MinZ = std::numeric_limits::infinity(); - psExtent3D->MaxZ = -std::numeric_limits::infinity(); + bExtentSet = true; } - bExtentSet = true; } else { poGeom->getEnvelope(&oEnv); - // This is required because getEnvelope initializes Z to 0 for 2D geometries - if (!poGeom->Is3D()) - { - oEnv.MinZ = std::numeric_limits::infinity(); - oEnv.MaxZ = -std::numeric_limits::infinity(); - } - // Merge handles infinity correctly - psExtent3D->Merge(oEnv); + if (oEnv.MinX < psExtent->MinX) + psExtent->MinX = oEnv.MinX; + if (oEnv.MinY < psExtent->MinY) + psExtent->MinY = oEnv.MinY; + if (oEnv.MaxX > psExtent->MaxX) + psExtent->MaxX = oEnv.MaxX; + if (oEnv.MaxY > psExtent->MaxY) + psExtent->MaxY = oEnv.MaxY; } } ResetReading(); @@ -284,15 +354,148 @@ OGRErr OGRLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, return bExtentSet ? OGRERR_NONE : OGRERR_FAILURE; } -//! @cond Doxygen_Suppress -OGRErr OGRLayer::GetExtentInternal(int iGeomField, OGREnvelope *psExtent, - int bForce) +/************************************************************************/ +/* OGR_L_GetExtent() */ +/************************************************************************/ + +/** + \brief Fetch the extent of this layer. + + Returns the extent (MBR) of the data in the layer. If bForce is FALSE, + and it would be expensive to establish the extent then OGRERR_FAILURE + will be returned indicating that the extent isn't know. If bForce is + TRUE then some implementations will actually scan the entire layer once + to compute the MBR of all the features in the layer. + + Depending on the drivers, the returned extent may or may not take the + spatial filter into account. So it is safer to call OGR_L_GetExtent() without + setting a spatial filter. + + Layers without any geometry may return OGRERR_FAILURE just indicating that + no meaningful extents could be collected. + + Note that some implementations of this method may alter the read cursor + of the layer. + + This function is the same as the C++ method OGRLayer::GetExtent(). + + @param hLayer handle to the layer from which to get extent. + @param psExtent the structure in which the extent value will be returned. + @param bForce Flag indicating whether the extent should be computed even + if it is expensive. + + @return OGRERR_NONE on success, OGRERR_FAILURE if extent not known. + +*/ + +OGRErr OGR_L_GetExtent(OGRLayerH hLayer, OGREnvelope *psExtent, int bForce) { - psExtent->MinX = 0.0; - psExtent->MaxX = 0.0; - psExtent->MinY = 0.0; - psExtent->MaxY = 0.0; + VALIDATE_POINTER1(hLayer, "OGR_L_GetExtent", OGRERR_INVALID_HANDLE); + +#ifdef OGRAPISPY_ENABLED + if (bOGRAPISpyEnabled) + OGRAPISpy_L_GetExtent(hLayer, bForce); +#endif + + return OGRLayer::FromHandle(hLayer)->GetExtent(0, psExtent, + bForce != FALSE); +} + +/************************************************************************/ +/* OGR_L_GetExtentEx() */ +/************************************************************************/ + +/** + \brief Fetch the extent of this layer, on the specified geometry field. + + Returns the extent (MBR) of the data in the layer. If bForce is FALSE, + and it would be expensive to establish the extent then OGRERR_FAILURE + will be returned indicating that the extent isn't know. If bForce is + TRUE then some implementations will actually scan the entire layer once + to compute the MBR of all the features in the layer. + + Depending on the drivers, the returned extent may or may not take the + spatial filter into account. So it is safer to call OGR_L_GetExtent() without + setting a spatial filter. + + Layers without any geometry may return OGRERR_FAILURE just indicating that + no meaningful extents could be collected. + + Note that some implementations of this method may alter the read cursor + of the layer. + + This function is the same as the C++ method OGRLayer::GetExtent(). + + @param hLayer handle to the layer from which to get extent. + @param iGeomField the index of the geometry field on which to compute the extent. + @param psExtent the structure in which the extent value will be returned. + @param bForce Flag indicating whether the extent should be computed even + if it is expensive. + + @return OGRERR_NONE on success, OGRERR_FAILURE if extent not known. + +*/ +OGRErr OGR_L_GetExtentEx(OGRLayerH hLayer, int iGeomField, + OGREnvelope *psExtent, int bForce) + +{ + VALIDATE_POINTER1(hLayer, "OGR_L_GetExtentEx", OGRERR_INVALID_HANDLE); + +#ifdef OGRAPISPY_ENABLED + if (bOGRAPISpyEnabled) + OGRAPISpy_L_GetExtentEx(hLayer, iGeomField, bForce); +#endif + + return OGRLayer::FromHandle(hLayer)->GetExtent(iGeomField, psExtent, + bForce != FALSE); +} + +/************************************************************************/ +/* GetExtent3D() */ +/************************************************************************/ + +/** + \brief Fetch the 3D extent of this layer, on the specified geometry field. + + Returns the 3D extent (MBR) of the data in the layer. If bForce is FALSE, + and it would be expensive to establish the extent then OGRERR_FAILURE + will be returned indicating that the extent isn't know. If bForce is + TRUE then some implementations will actually scan the entire layer once + to compute the MBR of all the features in the layer. + + (Contrarty to GetExtent() 2D), the returned extent will always take into + account the attribute and spatial filters that may be installed. + + Layers without any geometry may return OGRERR_FAILURE just indicating that + no meaningful extents could be collected. + + For layers that have no 3D geometries, the psExtent3D->MinZ and psExtent3D->MaxZ + fields will be respectively set to +Infinity and -Infinity. + + Note that some implementations of this method may alter the read cursor + of the layer. + + This function is the same as the C function OGR_L_GetExtent3D(). + + @param iGeomField 0-based index of the geometry field to consider. + @param psExtent3D the computed 3D extent of the layer. + @param bForce if TRUE, the extent will be computed even if all the + layer features have to be fetched. + @return OGRERR_NONE on success or an error code in case of failure. + @since GDAL 3.9 +*/ + +OGRErr OGRLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, + bool bForce) + +{ + psExtent3D->MinX = 0.0; + psExtent3D->MaxX = 0.0; + psExtent3D->MinY = 0.0; + psExtent3D->MaxY = 0.0; + psExtent3D->MinZ = std::numeric_limits::infinity(); + psExtent3D->MaxZ = -std::numeric_limits::infinity(); /* -------------------------------------------------------------------- */ /* If this layer has a none geometry type, then we can */ @@ -309,6 +512,37 @@ OGRErr OGRLayer::GetExtentInternal(int iGeomField, OGREnvelope *psExtent, return OGRERR_FAILURE; } + return IGetExtent3D(iGeomField, psExtent3D, bForce); +} + +/************************************************************************/ +/* IGetExtent3D() */ +/************************************************************************/ + +/** + \brief Fetch the 3D extent of this layer, on the specified geometry field. + + See GetExtent3D() documentation. + + Virtual method implemented by drivers since 3.11. In previous versions, + GetExtent3D() itself was the virtual method. + + Driver implementations, when wanting to call the base method, must take + care of calling OGRLayer::IGetExtent3D() (and note the public method without + the leading I). + + @param iGeomField 0-based index of the geometry field to consider. + @param psExtent3D the computed 3D extent of the layer. + @param bForce if TRUE, the extent will be computed even if all the + layer features have to be fetched. + @return OGRERR_NONE on success or an error code in case of failure. + @since GDAL 3.11 +*/ + +OGRErr OGRLayer::IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, + bool bForce) + +{ /* -------------------------------------------------------------------- */ /* If not forced, we should avoid having to scan all the */ /* features and just return a failure. */ @@ -320,7 +554,7 @@ OGRErr OGRLayer::GetExtentInternal(int iGeomField, OGREnvelope *psExtent, /* OK, we hate to do this, but go ahead and read through all */ /* the features to collect geometries and build extents. */ /* -------------------------------------------------------------------- */ - OGREnvelope oEnv; + OGREnvelope3D oEnv; bool bExtentSet = false; for (auto &&poFeature : *this) @@ -332,24 +566,26 @@ OGRErr OGRLayer::GetExtentInternal(int iGeomField, OGREnvelope *psExtent, } else if (!bExtentSet) { - poGeom->getEnvelope(psExtent); - if (!(std::isnan(psExtent->MinX) || std::isnan(psExtent->MinY) || - std::isnan(psExtent->MaxX) || std::isnan(psExtent->MaxY))) + poGeom->getEnvelope(psExtent3D); + // This is required because getEnvelope initializes Z to 0 for 2D geometries + if (!poGeom->Is3D()) { - bExtentSet = true; + psExtent3D->MinZ = std::numeric_limits::infinity(); + psExtent3D->MaxZ = -std::numeric_limits::infinity(); } + bExtentSet = true; } else { poGeom->getEnvelope(&oEnv); - if (oEnv.MinX < psExtent->MinX) - psExtent->MinX = oEnv.MinX; - if (oEnv.MinY < psExtent->MinY) - psExtent->MinY = oEnv.MinY; - if (oEnv.MaxX > psExtent->MaxX) - psExtent->MaxX = oEnv.MaxX; - if (oEnv.MaxY > psExtent->MaxY) - psExtent->MaxY = oEnv.MaxY; + // This is required because getEnvelope initializes Z to 0 for 2D geometries + if (!poGeom->Is3D()) + { + oEnv.MinZ = std::numeric_limits::infinity(); + oEnv.MaxZ = -std::numeric_limits::infinity(); + } + // Merge handles infinity correctly + psExtent3D->Merge(oEnv); } } ResetReading(); @@ -357,47 +593,41 @@ OGRErr OGRLayer::GetExtentInternal(int iGeomField, OGREnvelope *psExtent, return bExtentSet ? OGRERR_NONE : OGRERR_FAILURE; } -//! @endcond - /************************************************************************/ -/* OGR_L_GetExtent() */ +/* OGR_L_GetExtent3D() */ /************************************************************************/ -OGRErr OGR_L_GetExtent(OGRLayerH hLayer, OGREnvelope *psExtent, int bForce) +/** + \brief Fetch the 3D extent of this layer, on the specified geometry field. -{ - VALIDATE_POINTER1(hLayer, "OGR_L_GetExtent", OGRERR_INVALID_HANDLE); + Returns the 3D extent (MBR) of the data in the layer. If bForce is FALSE, + and it would be expensive to establish the extent then OGRERR_FAILURE + will be returned indicating that the extent isn't know. If bForce is + TRUE then some implementations will actually scan the entire layer once + to compute the MBR of all the features in the layer. -#ifdef OGRAPISPY_ENABLED - if (bOGRAPISpyEnabled) - OGRAPISpy_L_GetExtent(hLayer, bForce); -#endif + (Contrarty to GetExtent() 2D), the returned extent will always take into + account the attribute and spatial filters that may be installed. - return OGRLayer::FromHandle(hLayer)->GetExtent(psExtent, bForce); -} + Layers without any geometry may return OGRERR_FAILURE just indicating that + no meaningful extents could be collected. -/************************************************************************/ -/* OGR_L_GetExtentEx() */ -/************************************************************************/ + For layers that have no 3D geometries, the psExtent3D->MinZ and psExtent3D->MaxZ + fields will be respectively set to +Infinity and -Infinity. -OGRErr OGR_L_GetExtentEx(OGRLayerH hLayer, int iGeomField, - OGREnvelope *psExtent, int bForce) + Note that some implementations of this method may alter the read cursor + of the layer. -{ - VALIDATE_POINTER1(hLayer, "OGR_L_GetExtentEx", OGRERR_INVALID_HANDLE); + This function is the same as the C++ method OGRLayer::GetExtent3D(). -#ifdef OGRAPISPY_ENABLED - if (bOGRAPISpyEnabled) - OGRAPISpy_L_GetExtentEx(hLayer, iGeomField, bForce); -#endif - - return OGRLayer::FromHandle(hLayer)->GetExtent(iGeomField, psExtent, - bForce); -} - -/************************************************************************/ -/* OGR_L_GetExtent3D() */ -/************************************************************************/ + @param hLayer the layer to consider. + @param iGeomField 0-based index of the geometry field to consider. + @param psExtent3D the computed 3D extent of the layer. + @param bForce if TRUE, the extent will be computed even if all the + layer features have to be fetched. + @return OGRERR_NONE on success or an error code in case of failure. + @since GDAL 3.9 +*/ OGRErr OGR_L_GetExtent3D(OGRLayerH hLayer, int iGeomField, OGREnvelope3D *psExtent3D, int bForce) @@ -411,7 +641,7 @@ OGRErr OGR_L_GetExtent3D(OGRLayerH hLayer, int iGeomField, #endif return OGRLayer::FromHandle(hLayer)->GetExtent3D(iGeomField, psExtent3D, - bForce); + bForce != FALSE); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/generic/ogrlayerdecorator.cpp b/ogr/ogrsf_frmts/generic/ogrlayerdecorator.cpp index 75ab9612bdeb..aa526f9dfdef 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayerdecorator.cpp +++ b/ogr/ogrsf_frmts/generic/ogrlayerdecorator.cpp @@ -198,19 +198,20 @@ GIntBig OGRLayerDecorator::GetFeatureCount(int bForce) return m_poDecoratedLayer->GetFeatureCount(bForce); } -OGRErr OGRLayerDecorator::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRLayerDecorator::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (!m_poDecoratedLayer) return OGRERR_FAILURE; - return m_poDecoratedLayer->GetExtent(psExtent, bForce); + return m_poDecoratedLayer->GetExtent(iGeomField, psExtent, bForce); } -OGRErr OGRLayerDecorator::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRLayerDecorator::IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent, + bool bForce) { if (!m_poDecoratedLayer) return OGRERR_FAILURE; - return m_poDecoratedLayer->GetExtent(iGeomField, psExtent, bForce); + return m_poDecoratedLayer->GetExtent3D(iGeomField, psExtent, bForce); } int OGRLayerDecorator::TestCapability(const char *pszCapability) diff --git a/ogr/ogrsf_frmts/generic/ogrlayerdecorator.h b/ogr/ogrsf_frmts/generic/ogrlayerdecorator.h index 9b5aef4c815c..00432c6e82cd 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayerdecorator.h +++ b/ogr/ogrsf_frmts/generic/ogrlayerdecorator.h @@ -65,9 +65,10 @@ class CPL_DLL OGRLayerDecorator : public OGRLayer virtual OGRSpatialReference *GetSpatialRef() override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce = true) override; + virtual OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent, + bool bForce = true) override; virtual int TestCapability(const char *) override; diff --git a/ogr/ogrsf_frmts/generic/ogrlayerpool.cpp b/ogr/ogrsf_frmts/generic/ogrlayerpool.cpp index 58a6ef90fa47..3b095c521cd0 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayerpool.cpp +++ b/ogr/ogrsf_frmts/generic/ogrlayerpool.cpp @@ -482,28 +482,17 @@ GIntBig OGRProxiedLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRProxiedLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRProxiedLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (poUnderlyingLayer == nullptr && !OpenUnderlyingLayer()) return OGRERR_FAILURE; return poUnderlyingLayer->GetExtent(iGeomField, psExtent, bForce); } -/************************************************************************/ -/* GetExtent() */ -/************************************************************************/ - -OGRErr OGRProxiedLayer::GetExtent(OGREnvelope *psExtent, int bForce) -{ - if (poUnderlyingLayer == nullptr && !OpenUnderlyingLayer()) - return OGRERR_FAILURE; - return poUnderlyingLayer->GetExtent(psExtent, bForce); -} - /************************************************************************/ /* TestCapability() */ /************************************************************************/ diff --git a/ogr/ogrsf_frmts/generic/ogrlayerpool.h b/ogr/ogrsf_frmts/generic/ogrlayerpool.h index a5aef18d366d..8ed14c0511af 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayerpool.h +++ b/ogr/ogrsf_frmts/generic/ogrlayerpool.h @@ -143,9 +143,8 @@ class CPL_DLL OGRProxiedLayer : public OGRAbstractProxiedLayer virtual OGRSpatialReference *GetSpatialRef() override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual int TestCapability(const char *) override; diff --git a/ogr/ogrsf_frmts/generic/ogrmutexedlayer.cpp b/ogr/ogrsf_frmts/generic/ogrmutexedlayer.cpp index b839dcdb4c21..272bc6fb7eca 100644 --- a/ogr/ogrsf_frmts/generic/ogrmutexedlayer.cpp +++ b/ogr/ogrsf_frmts/generic/ogrmutexedlayer.cpp @@ -170,17 +170,11 @@ GIntBig OGRMutexedLayer::GetFeatureCount(int bForce) return OGRLayerDecorator::GetFeatureCount(bForce); } -OGRErr OGRMutexedLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRMutexedLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { CPLMutexHolderOptionalLockD(m_hMutex); - return OGRLayerDecorator::GetExtent(iGeomField, psExtent, bForce); -} - -OGRErr OGRMutexedLayer::GetExtent(OGREnvelope *psExtent, int bForce) -{ - CPLMutexHolderOptionalLockD(m_hMutex); - return OGRLayerDecorator::GetExtent(psExtent, bForce); + return OGRLayerDecorator::IGetExtent(iGeomField, psExtent, bForce); } int OGRMutexedLayer::TestCapability(const char *pszCapability) diff --git a/ogr/ogrsf_frmts/generic/ogrmutexedlayer.h b/ogr/ogrsf_frmts/generic/ogrmutexedlayer.h index 4ad7501898d5..bdf28ea8b8ff 100644 --- a/ogr/ogrsf_frmts/generic/ogrmutexedlayer.h +++ b/ogr/ogrsf_frmts/generic/ogrmutexedlayer.h @@ -76,9 +76,8 @@ class CPL_DLL OGRMutexedLayer : public OGRLayerDecorator virtual OGRSpatialReference *GetSpatialRef() override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual int TestCapability(const char *) override; diff --git a/ogr/ogrsf_frmts/generic/ogrunionlayer.cpp b/ogr/ogrsf_frmts/generic/ogrunionlayer.cpp index 31df93f66335..9cd01e92ed07 100644 --- a/ogr/ogrsf_frmts/generic/ogrunionlayer.cpp +++ b/ogr/ogrsf_frmts/generic/ogrunionlayer.cpp @@ -1255,11 +1255,11 @@ int OGRUnionLayer::TestCapability(const char *pszCap) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRUnionLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRUnionLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (iGeomField >= 0 && iGeomField < nGeomFields && papoGeomFields[iGeomField]->sStaticEnvelope.IsInit()) @@ -1306,15 +1306,6 @@ OGRErr OGRUnionLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, return (bInit) ? OGRERR_NONE : OGRERR_FAILURE; } -/************************************************************************/ -/* GetExtent() */ -/************************************************************************/ - -OGRErr OGRUnionLayer::GetExtent(OGREnvelope *psExtent, int bForce) -{ - return GetExtent(0, psExtent, bForce); -} - /************************************************************************/ /* SetSpatialFilter() */ /************************************************************************/ diff --git a/ogr/ogrsf_frmts/generic/ogrunionlayer.h b/ogr/ogrsf_frmts/generic/ogrunionlayer.h index 9f9725fdced4..d7d983911c5e 100644 --- a/ogr/ogrsf_frmts/generic/ogrunionlayer.h +++ b/ogr/ogrsf_frmts/generic/ogrunionlayer.h @@ -143,9 +143,8 @@ class CPL_DLL OGRUnionLayer final : public OGRLayer virtual int TestCapability(const char *) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual void SetSpatialFilter(OGRGeometry *poGeomIn) override; virtual void SetSpatialFilter(int iGeomField, OGRGeometry *) override; diff --git a/ogr/ogrsf_frmts/generic/ogrwarpedlayer.cpp b/ogr/ogrsf_frmts/generic/ogrwarpedlayer.cpp index c6acf0636188..a1e083a8397e 100644 --- a/ogr/ogrsf_frmts/generic/ogrwarpedlayer.cpp +++ b/ogr/ogrsf_frmts/generic/ogrwarpedlayer.cpp @@ -320,20 +320,11 @@ GIntBig OGRWarpedLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRWarpedLayer::GetExtent(OGREnvelope *psExtent, int bForce) -{ - return GetExtent(0, psExtent, bForce); -} - -/************************************************************************/ -/* GetExtent() */ -/************************************************************************/ - -OGRErr OGRWarpedLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRWarpedLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (iGeomField == m_iGeomField) { diff --git a/ogr/ogrsf_frmts/generic/ogrwarpedlayer.h b/ogr/ogrsf_frmts/generic/ogrwarpedlayer.h index 1b75e3b8dda6..828f18cac36a 100644 --- a/ogr/ogrsf_frmts/generic/ogrwarpedlayer.h +++ b/ogr/ogrsf_frmts/generic/ogrwarpedlayer.h @@ -79,9 +79,8 @@ class CPL_DLL OGRWarpedLayer : public OGRLayerDecorator virtual OGRSpatialReference *GetSpatialRef() override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce = true) override; virtual int TestCapability(const char *) override; diff --git a/ogr/ogrsf_frmts/geoconcept/ogrgeoconceptlayer.cpp b/ogr/ogrsf_frmts/geoconcept/ogrgeoconceptlayer.cpp index 3d75c6b96a68..585ba3bc438f 100644 --- a/ogr/ogrsf_frmts/geoconcept/ogrgeoconceptlayer.cpp +++ b/ogr/ogrsf_frmts/geoconcept/ogrgeoconceptlayer.cpp @@ -416,11 +416,11 @@ GIntBig OGRGeoconceptLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRGeoconceptLayer::GetExtent(OGREnvelope *psExtent, - CPL_UNUSED int bForce) +OGRErr OGRGeoconceptLayer::IGetExtent(int /* iGeomField*/, + OGREnvelope *psExtent, bool) { GCExtent *theExtent = GetSubTypeExtent_GCIO(_gcFeature); if (!theExtent) diff --git a/ogr/ogrsf_frmts/geoconcept/ogrgeoconceptlayer.h b/ogr/ogrsf_frmts/geoconcept/ogrgeoconceptlayer.h index 0d53a1c84c0a..328b899ab9cf 100644 --- a/ogr/ogrsf_frmts/geoconcept/ogrgeoconceptlayer.h +++ b/ogr/ogrsf_frmts/geoconcept/ogrgeoconceptlayer.h @@ -55,13 +55,8 @@ class OGRGeoconceptLayer final : public OGRLayer OGRSpatialReference *GetSpatialRef() override; GIntBig GetFeatureCount(int bForce = TRUE) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; int TestCapability(const char *pszCap) override; // const char* GetInfo( const char* pszTag ); diff --git a/ogr/ogrsf_frmts/geojson/ogr_geojson.h b/ogr/ogrsf_frmts/geojson/ogr_geojson.h index f80991ac8ec3..9029984818da 100644 --- a/ogr/ogrsf_frmts/geojson/ogr_geojson.h +++ b/ogr/ogrsf_frmts/geojson/ogr_geojson.h @@ -92,11 +92,11 @@ class OGRGeoJSONLayer final : public OGRMemLayer int nFlags) override; virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poGeomField, int bApproxOK = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; - virtual OGRErr GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, - int bForce = TRUE) override; + + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce = true) override; + virtual OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, + bool bForce = true) override; GDALDataset *GetDataset() override; @@ -184,14 +184,9 @@ class OGRGeoJSONWriteLayer final : public OGRLayer OGRErr ICreateFeature(OGRFeature *poFeature) override; OGRErr CreateField(const OGRFieldDefn *poField, int bApproxOK) override; int TestCapability(const char *pszCap) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) override - { - return iGeomField == 0 - ? OGRGeoJSONWriteLayer::GetExtent(psExtent, bForce) - : OGRERR_FAILURE; - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; OGRErr SyncToDisk() override; diff --git a/ogr/ogrsf_frmts/geojson/ogrgeojsondriver.cpp b/ogr/ogrsf_frmts/geojson/ogrgeojsondriver.cpp index df6c72c6fe1b..50bf3f5e3f5e 100644 --- a/ogr/ogrsf_frmts/geojson/ogrgeojsondriver.cpp +++ b/ogr/ogrsf_frmts/geojson/ogrgeojsondriver.cpp @@ -58,13 +58,8 @@ class OGRESRIFeatureServiceLayer final : public OGRLayer void ResetReading() override; OGRFeature *GetNextFeature() override; GIntBig GetFeatureCount(int bForce = TRUE) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce = true) override; int TestCapability(const char *pszCap) override; @@ -290,10 +285,12 @@ GIntBig OGRESRIFeatureServiceLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRESRIFeatureServiceLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRESRIFeatureServiceLayer::IGetExtent(int iGeomField, + OGREnvelope *psExtent, + bool bForce) { OGRErr eErr = OGRERR_FAILURE; CPLString osNewURL = @@ -328,7 +325,7 @@ OGRErr OGRESRIFeatureServiceLayer::GetExtent(OGREnvelope *psExtent, int bForce) } CPLHTTPDestroyResult(pResult); if (eErr == OGRERR_FAILURE) - eErr = OGRLayer::GetExtent(psExtent, bForce); + eErr = OGRLayer::IGetExtent(iGeomField, psExtent, bForce); return eErr; } diff --git a/ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp b/ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp index cc5bde637436..dc31fb3f72d6 100644 --- a/ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp +++ b/ogr/ogrsf_frmts/geojson/ogrgeojsonlayer.cpp @@ -454,13 +454,8 @@ OGRErr OGRGeoJSONLayer::CreateGeomField(const OGRGeomFieldDefn *poGeomField, return OGRMemLayer::CreateGeomField(poGeomField, bApproxOK); } -OGRErr OGRGeoJSONLayer::GetExtent(OGREnvelope *psExtent, int bForce) -{ - return GetExtent(0, psExtent, bForce); -} - -OGRErr OGRGeoJSONLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRGeoJSONLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (iGeomField != 0) { @@ -475,12 +470,12 @@ OGRErr OGRGeoJSONLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, } else { - return OGRMemLayer::GetExtentInternal(iGeomField, psExtent, bForce); + return OGRMemLayer::IGetExtent(iGeomField, psExtent, bForce); } } -OGRErr OGRGeoJSONLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, - int bForce) +OGRErr OGRGeoJSONLayer::IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, + bool bForce) { if (iGeomField != 0) @@ -496,7 +491,7 @@ OGRErr OGRGeoJSONLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, } else { - return OGRMemLayer::GetExtent3D(iGeomField, psExtent3D, bForce); + return OGRMemLayer::IGetExtent3D(iGeomField, psExtent3D, bForce); } } diff --git a/ogr/ogrsf_frmts/geojson/ogrgeojsonwritelayer.cpp b/ogr/ogrsf_frmts/geojson/ogrgeojsonwritelayer.cpp index 24f76cada838..ac078bc0b58a 100644 --- a/ogr/ogrsf_frmts/geojson/ogrgeojsonwritelayer.cpp +++ b/ogr/ogrsf_frmts/geojson/ogrgeojsonwritelayer.cpp @@ -479,10 +479,11 @@ int OGRGeoJSONWriteLayer::TestCapability(const char *pszCap) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRGeoJSONWriteLayer::GetExtent(OGREnvelope *psExtent, int) +OGRErr OGRGeoJSONWriteLayer::IGetExtent(int /*iGeomField*/, + OGREnvelope *psExtent, bool) { if (sEnvelopeLayer.IsInit()) { diff --git a/ogr/ogrsf_frmts/gml/ogr_gml.h b/ogr/ogrsf_frmts/gml/ogr_gml.h index 6a66b323cb56..8dcddcbb5bb3 100644 --- a/ogr/ogrsf_frmts/gml/ogr_gml.h +++ b/ogr/ogrsf_frmts/gml/ogr_gml.h @@ -68,13 +68,8 @@ class OGRGMLLayer final : public OGRLayer OGRFeature *GetNextFeature() override; GIntBig GetFeatureCount(int bForce = TRUE) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; OGRErr ICreateFeature(OGRFeature *poFeature) override; diff --git a/ogr/ogrsf_frmts/gml/ogrgmllayer.cpp b/ogr/ogrsf_frmts/gml/ogrgmllayer.cpp index c9108e9b4cbd..807f47432f04 100644 --- a/ogr/ogrsf_frmts/gml/ogrgmllayer.cpp +++ b/ogr/ogrsf_frmts/gml/ogrgmllayer.cpp @@ -603,10 +603,11 @@ GIntBig OGRGMLLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRGMLLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRGMLLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (GetGeomType() == wkbNone) @@ -627,7 +628,7 @@ OGRErr OGRGMLLayer::GetExtent(OGREnvelope *psExtent, int bForce) return OGRERR_NONE; } - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/gmt/ogr_gmt.h b/ogr/ogrsf_frmts/gmt/ogr_gmt.h index 85b16fb0d006..ef1a0685ba10 100644 --- a/ogr/ogrsf_frmts/gmt/ogr_gmt.h +++ b/ogr/ogrsf_frmts/gmt/ogr_gmt.h @@ -66,13 +66,8 @@ class OGRGmtLayer final : public OGRLayer, return poFeatureDefn; } - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; OGRErr ICreateFeature(OGRFeature *poFeature) override; diff --git a/ogr/ogrsf_frmts/gmt/ogrgmtlayer.cpp b/ogr/ogrsf_frmts/gmt/ogrgmtlayer.cpp index c1297d847380..61a7ade0afb1 100644 --- a/ogr/ogrsf_frmts/gmt/ogrgmtlayer.cpp +++ b/ogr/ogrsf_frmts/gmt/ogrgmtlayer.cpp @@ -958,7 +958,7 @@ OGRErr OGRGmtLayer::WriteGeometry(OGRGeometryH hGeom, bool bHaveAngle) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /* */ /* Fetch extent of the data currently stored in the dataset. */ /* The bForce flag has no effect on SHO files since that value */ @@ -967,7 +967,8 @@ OGRErr OGRGmtLayer::WriteGeometry(OGRGeometryH hGeom, bool bHaveAngle) /* Returns OGRERR_NONE/OGRRERR_FAILURE. */ /************************************************************************/ -OGRErr OGRGmtLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRGmtLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (bRegionComplete && sRegion.IsInit()) @@ -976,7 +977,7 @@ OGRErr OGRGmtLayer::GetExtent(OGREnvelope *psExtent, int bForce) return OGRERR_NONE; } - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/gpkg/ogr_geopackage.h b/ogr/ogrsf_frmts/gpkg/ogr_geopackage.h index aa86550dda18..8f47e7c8ff01 100644 --- a/ogr/ogrsf_frmts/gpkg/ogr_geopackage.h +++ b/ogr/ogrsf_frmts/gpkg/ogr_geopackage.h @@ -892,16 +892,12 @@ class OGRGeoPackageTableLayer final : public OGRGeoPackageLayer OGRErr CommitTransaction() override; OGRErr RollbackTransaction() override; GIntBig GetFeatureCount(int) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRGeoPackageLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; - virtual OGRErr GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, - int bForce) override; + OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, + bool bForce) override; OGRGeometryTypeCounter *GetGeometryTypes(int iGeomField, int nFlagsGGT, int &nEntryCountOut, GDALProgressFunc pfnProgress, @@ -1082,13 +1078,8 @@ class OGRGeoPackageSelectLayer final : public OGRGeoPackageLayer, virtual int TestCapability(const char *) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override - { - return GetExtent(0, psExtent, bForce); - } - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual OGRFeatureDefn *GetLayerDefn() override { @@ -1155,15 +1146,10 @@ class OGRGeoPackageSelectLayer final : public OGRGeoPackageLayer, return OGRGeoPackageLayer::TestCapability(pszCap); } - virtual OGRErr BaseGetExtent(OGREnvelope *psExtent, int bForce) override - { - return OGRGeoPackageLayer::GetExtent(psExtent, bForce); - } - virtual OGRErr BaseGetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override + bool bForce) override { - return OGRGeoPackageLayer::GetExtent(iGeomField, psExtent, bForce); + return OGRGeoPackageLayer::IGetExtent(iGeomField, psExtent, bForce); } bool diff --git a/ogr/ogrsf_frmts/gpkg/ogrgeopackageselectlayer.cpp b/ogr/ogrsf_frmts/gpkg/ogrgeopackageselectlayer.cpp index 8d2389171988..9000ab5a8118 100644 --- a/ogr/ogrsf_frmts/gpkg/ogrgeopackageselectlayer.cpp +++ b/ogr/ogrsf_frmts/gpkg/ogrgeopackageselectlayer.cpp @@ -142,11 +142,11 @@ int OGRGeoPackageSelectLayer::TestCapability(const char *pszCap) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRGeoPackageSelectLayer::GetExtent(int iGeomField, - OGREnvelope *psExtent, int bForce) +OGRErr OGRGeoPackageSelectLayer::IGetExtent(int iGeomField, + OGREnvelope *psExtent, bool bForce) { return poBehavior->GetExtent(iGeomField, psExtent, bForce); } diff --git a/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp b/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp index 05349c3ed1b6..327c9c0ee2b4 100644 --- a/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp +++ b/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp @@ -4244,10 +4244,11 @@ static bool GetExtentFromRTree(sqlite3 *hDB, const std::string &osRTreeName, } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRGeoPackageTableLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRGeoPackageTableLayer::IGetExtent(int /* iGeomField */, + OGREnvelope *psExtent, bool bForce) { if (!m_bFeatureDefnCompleted) GetLayerDefn(); @@ -4353,7 +4354,7 @@ void OGRGeoPackageTableLayer::RecomputeExtent() delete m_poExtent; m_poExtent = nullptr; OGREnvelope sExtent; - GetExtent(&sExtent, true); + CPL_IGNORE_RET_VAL(GetExtent(&sExtent, true)); } /************************************************************************/ @@ -9105,11 +9106,11 @@ static void OGR_GPKG_GeometryExtent3DAggregate_Finalize(sqlite3_context *) } /************************************************************************/ -/* GetExtent3D */ +/* IGetExtent3D */ /************************************************************************/ -OGRErr OGRGeoPackageTableLayer::GetExtent3D(int iGeomField, - OGREnvelope3D *psExtent3D, - int bForce) +OGRErr OGRGeoPackageTableLayer::IGetExtent3D(int iGeomField, + OGREnvelope3D *psExtent3D, + bool bForce) { OGRFeatureDefn *poDefn = GetLayerDefn(); @@ -9123,13 +9124,6 @@ OGRErr OGRGeoPackageTableLayer::GetExtent3D(int iGeomField, return OGRERR_FAILURE; } - const int nGeomFieldCount = poDefn->GetGeomFieldCount(); - if (iGeomField < 0 || iGeomField >= nGeomFieldCount) - { - CPLError(CE_Failure, CPLE_AppDefined, "Invalid value for iGeomField"); - return OGRERR_FAILURE; - } - if (m_nZFlag == 0 && m_soFilter.empty()) { // If the layer doesn't contain any 3D geometry and no filter is set, diff --git a/ogr/ogrsf_frmts/hana/ogr_hana.h b/ogr/ogrsf_frmts/hana/ogr_hana.h index 5d27da131bae..7a3f01698302 100644 --- a/ogr/ogrsf_frmts/hana/ogr_hana.h +++ b/ogr/ogrsf_frmts/hana/ogr_hana.h @@ -229,12 +229,7 @@ class OGRHanaLayer : public OGRLayer void ResetReading() override; - OGRErr GetExtent(OGREnvelope *extent, int force = TRUE) override - { - return GetExtent(0, extent, force); - } - - OGRErr GetExtent(int geomField, OGREnvelope *extent, int force) override; + OGRErr IGetExtent(int geomField, OGREnvelope *extent, bool force) override; GIntBig GetFeatureCount(int force) override; OGRFeature *GetNextFeature() override; const char *GetFIDColumn() override; @@ -309,12 +304,8 @@ class OGRHanaTableLayer final : public OGRHanaLayer void ResetReading() override; - OGRErr GetExtent(OGREnvelope *extent, int force = TRUE) override - { - return GetExtent(0, extent, force); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *extent, bool force) override; - OGRErr GetExtent(int geomField, OGREnvelope *extent, int force) override; GIntBig GetFeatureCount(int force) override; const char *GetName() override diff --git a/ogr/ogrsf_frmts/hana/ogrhanalayer.cpp b/ogr/ogrsf_frmts/hana/ogrhanalayer.cpp index 0cf71b669d2e..be5184e0c8dd 100644 --- a/ogr/ogrsf_frmts/hana/ogrhanalayer.cpp +++ b/ogr/ogrsf_frmts/hana/ogrhanalayer.cpp @@ -872,27 +872,11 @@ void OGRHanaLayer::ResetReading() } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRHanaLayer::GetExtent(int iGeomField, OGREnvelope *extent, int force) +OGRErr OGRHanaLayer::IGetExtent(int iGeomField, OGREnvelope *extent, bool force) { - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount() || - GetLayerDefn()->GetGeomFieldDefn(iGeomField)->GetType() == wkbNone) - { - extent->MinX = 0.0; - extent->MaxX = 0.0; - extent->MinY = 0.0; - extent->MaxY = 0.0; - - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return OGRERR_FAILURE; - } - try { if (!force) @@ -913,10 +897,7 @@ OGRErr OGRHanaLayer::GetExtent(int iGeomField, OGREnvelope *extent, int force) clmName.c_str(), ex.what()); } - if (iGeomField == 0) - return OGRLayer::GetExtent(extent, force); - else - return OGRLayer::GetExtent(iGeomField, extent, force); + return OGRLayer::IGetExtent(iGeomField, extent, force); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/hana/ogrhanatablelayer.cpp b/ogr/ogrsf_frmts/hana/ogrhanatablelayer.cpp index 24d040a539c5..9a15cd1186a9 100644 --- a/ogr/ogrsf_frmts/hana/ogrhanatablelayer.cpp +++ b/ogr/ogrsf_frmts/hana/ogrhanatablelayer.cpp @@ -1073,18 +1073,18 @@ OGRErr OGRHanaTableLayer::GetGeometryWkb(OGRFeature *feature, int fieldIndex, } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRHanaTableLayer::GetExtent(int geomField, OGREnvelope *extent, - int force) +OGRErr OGRHanaTableLayer::IGetExtent(int geomField, OGREnvelope *extent, + bool force) { if (geomField >= 0 && geomField < GetLayerDefn()->GetGeomFieldCount()) { FlushPendingBatches(false); } - return OGRHanaLayer::GetExtent(geomField, extent, force); + return OGRHanaLayer::IGetExtent(geomField, extent, force); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/idb/ogr_idb.h b/ogr/ogrsf_frmts/idb/ogr_idb.h index b7501736e79b..b24b5cec2500 100644 --- a/ogr/ogrsf_frmts/idb/ogr_idb.h +++ b/ogr/ogrsf_frmts/idb/ogr_idb.h @@ -137,13 +137,8 @@ class OGRIDBSelectLayer final : public OGRIDBLayer virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual int TestCapability(const char *) override; }; diff --git a/ogr/ogrsf_frmts/idb/ogridbselectlayer.cpp b/ogr/ogrsf_frmts/idb/ogridbselectlayer.cpp index d7faf8222d60..a59e8105050f 100644 --- a/ogr/ogrsf_frmts/idb/ogridbselectlayer.cpp +++ b/ogr/ogrsf_frmts/idb/ogridbselectlayer.cpp @@ -130,13 +130,13 @@ int OGRIDBSelectLayer::TestCapability(const char *pszCap) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /* */ /* Since SELECT layers currently cannot ever have geometry, we */ -/* can optimize the GetExtent() method! */ +/* can optimize the IGetExtent() method! */ /************************************************************************/ -OGRErr OGRIDBSelectLayer::GetExtent(OGREnvelope *, int) +OGRErr OGRIDBSelectLayer::IGetExtent(int, OGREnvelope *, bool) { return OGRERR_FAILURE; diff --git a/ogr/ogrsf_frmts/idrisi/ogr_idrisi.h b/ogr/ogrsf_frmts/idrisi/ogr_idrisi.h index 95440fe01f2c..07fc2cd23dae 100644 --- a/ogr/ogrsf_frmts/idrisi/ogr_idrisi.h +++ b/ogr/ogrsf_frmts/idrisi/ogr_idrisi.h @@ -63,13 +63,8 @@ class OGRIdrisiLayer final : public OGRLayer, virtual int TestCapability(const char *) override; void SetExtent(double dfMinX, double dfMinY, double dfMaxX, double dfMaxY); - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; }; diff --git a/ogr/ogrsf_frmts/idrisi/ogridrisilayer.cpp b/ogr/ogrsf_frmts/idrisi/ogridrisilayer.cpp index 4f1a0cd22184..9750760a972b 100644 --- a/ogr/ogrsf_frmts/idrisi/ogridrisilayer.cpp +++ b/ogr/ogrsf_frmts/idrisi/ogridrisilayer.cpp @@ -564,13 +564,14 @@ void OGRIdrisiLayer::SetExtent(double dfMinXIn, double dfMinYIn, } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRIdrisiLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRIdrisiLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (!bExtentValid) - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); psExtent->MinX = dfMinX; psExtent->MinY = dfMinY; diff --git a/ogr/ogrsf_frmts/libkml/ogr_libkml.h b/ogr/ogrsf_frmts/libkml/ogr_libkml.h index 48265111122e..e1bc1d31f4d7 100644 --- a/ogr/ogrsf_frmts/libkml/ogr_libkml.h +++ b/ogr/ogrsf_frmts/libkml/ogr_libkml.h @@ -106,13 +106,8 @@ class OGRLIBKMLLayer final : public OGRLayer, OGRErr DeleteFeature(GIntBig nFID) override; GIntBig GetFeatureCount(int bForce = TRUE) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; // const char *GetInfo( const char * ); diff --git a/ogr/ogrsf_frmts/libkml/ogrlibkmllayer.cpp b/ogr/ogrsf_frmts/libkml/ogrlibkmllayer.cpp index 49b73dda2223..57c8ed59097b 100644 --- a/ogr/ogrsf_frmts/libkml/ogrlibkmllayer.cpp +++ b/ogr/ogrsf_frmts/libkml/ogrlibkmllayer.cpp @@ -814,7 +814,7 @@ GIntBig OGRLIBKMLLayer::GetFeatureCount(int bForce) } /****************************************************************************** - GetExtent() + IGetExtent() Args: psExtent pointer to the Envelope to store the result in bForce no effect as of now @@ -823,7 +823,8 @@ GIntBig OGRLIBKMLLayer::GetFeatureCount(int bForce) ******************************************************************************/ -OGRErr OGRLIBKMLLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRLIBKMLLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { Bbox oKmlBbox; @@ -838,7 +839,7 @@ OGRErr OGRLIBKMLLayer::GetExtent(OGREnvelope *psExtent, int bForce) return OGRERR_NONE; } - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /****************************************************************************** diff --git a/ogr/ogrsf_frmts/miramon/ogrmiramon.h b/ogr/ogrsf_frmts/miramon/ogrmiramon.h index 4ee498506784..6f0da3a40405 100644 --- a/ogr/ogrsf_frmts/miramon/ogrmiramon.h +++ b/ogr/ogrsf_frmts/miramon/ogrmiramon.h @@ -83,16 +83,11 @@ class OGRMiraMonLayer final OGRErr TranslateFieldsToMM(); OGRErr TranslateFieldsValuesToMM(OGRFeature *poFeature); - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; OGRFeatureDefn *GetLayerDefn() override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } - OGRErr ICreateFeature(OGRFeature *poFeature) override; virtual OGRErr CreateField(const OGRFieldDefn *poField, diff --git a/ogr/ogrsf_frmts/miramon/ogrmiramonlayer.cpp b/ogr/ogrsf_frmts/miramon/ogrmiramonlayer.cpp index f72d3bb83235..eb495f7aa083 100644 --- a/ogr/ogrsf_frmts/miramon/ogrmiramonlayer.cpp +++ b/ogr/ogrsf_frmts/miramon/ogrmiramonlayer.cpp @@ -2722,14 +2722,15 @@ OGRFeatureDefn *OGRMiraMonLayer::GetLayerDefn() } /****************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /* */ /* Fetch extent of the data currently stored in the dataset. */ /* The bForce flag has no effect on SHO files since that value */ /* is always in the header. */ /****************************************************************************/ -OGRErr OGRMiraMonLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRMiraMonLayer::IGetExtent(int /* iGeomField*/, OGREnvelope *psExtent, + bool bForce) { if (phMiraMonLayer) diff --git a/ogr/ogrsf_frmts/mitab/mitab.h b/ogr/ogrsf_frmts/mitab/mitab.h index 2a6806b855d9..860195c40037 100644 --- a/ogr/ogrsf_frmts/mitab/mitab.h +++ b/ogr/ogrsf_frmts/mitab/mitab.h @@ -115,13 +115,8 @@ class IMapInfoFile CPL_NON_FINAL : public OGRLayer virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; virtual OGRErr ICreateFeature(OGRFeature *poFeature) override; virtual int TestCapability(const char *pszCap) override = 0; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override = 0; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override = 0; GDALDataset *GetDataset() override { @@ -289,13 +284,8 @@ class TABFile final : public IMapInfoFile virtual void ResetReading() override; virtual int TestCapability(const char *pszCap) override; virtual GIntBig GetFeatureCount(int bForce) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; /* Implement OGRLayer's SetFeature() for random write, only with TABFile */ virtual OGRErr ISetFeature(OGRFeature *) override; @@ -467,13 +457,8 @@ class TABView final : public IMapInfoFile virtual void ResetReading() override; virtual int TestCapability(const char *pszCap) override; virtual GIntBig GetFeatureCount(int bForce) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; /////////////// // Read access specific stuff @@ -617,13 +602,8 @@ class TABSeamless final : public IMapInfoFile virtual void ResetReading() override; virtual int TestCapability(const char *pszCap) override; virtual GIntBig GetFeatureCount(int bForce) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; /////////////// // Read access specific stuff @@ -816,13 +796,8 @@ class MIFFile final : public IMapInfoFile virtual int TestCapability(const char *pszCap) override; virtual GIntBig GetFeatureCount(int bForce) override; virtual void ResetReading() override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; /////////////// // Read access specific stuff diff --git a/ogr/ogrsf_frmts/mitab/mitab_miffile.cpp b/ogr/ogrsf_frmts/mitab/mitab_miffile.cpp index 2b2e41f1f0de..d4e1c48b9e68 100644 --- a/ogr/ogrsf_frmts/mitab/mitab_miffile.cpp +++ b/ogr/ogrsf_frmts/mitab/mitab_miffile.cpp @@ -2094,9 +2094,10 @@ int MIFFile::GetBounds(double &dXMin, double &dYMin, double &dXMax, * * Returns OGRERR_NONE/OGRRERR_FAILURE. **********************************************************************/ -OGRErr MIFFile::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr MIFFile::IGetExtent(int /* iGeomField */, OGREnvelope *psExtent, + bool bForce) { - if (bForce == TRUE) + if (bForce) PreParseFile(); if (m_bPreParsed && m_bExtentsSet) diff --git a/ogr/ogrsf_frmts/mitab/mitab_tabfile.cpp b/ogr/ogrsf_frmts/mitab/mitab_tabfile.cpp index af224c74d8a5..606ed9302264 100644 --- a/ogr/ogrsf_frmts/mitab/mitab_tabfile.cpp +++ b/ogr/ogrsf_frmts/mitab/mitab_tabfile.cpp @@ -2531,7 +2531,7 @@ int TABFile::GetBounds(double &dXMin, double &dYMin, double &dXMax, } /********************************************************************** - * TABFile::GetExtent() + * TABFile::IGetExtent() * * Fetch extent of the data currently stored in the dataset. * @@ -2540,7 +2540,8 @@ int TABFile::GetBounds(double &dXMin, double &dYMin, double &dXMax, * * Returns OGRERR_NONE/OGRRERR_FAILURE. **********************************************************************/ -OGRErr TABFile::GetExtent(OGREnvelope *psExtent, CPL_UNUSED int bForce) +OGRErr TABFile::IGetExtent(int /*iGeomField*/, OGREnvelope *psExtent, + bool /* bForce */) { TABMAPHeaderBlock *poHeader = nullptr; diff --git a/ogr/ogrsf_frmts/mitab/mitab_tabseamless.cpp b/ogr/ogrsf_frmts/mitab/mitab_tabseamless.cpp index 60b22b2be81d..984f5249592a 100644 --- a/ogr/ogrsf_frmts/mitab/mitab_tabseamless.cpp +++ b/ogr/ogrsf_frmts/mitab/mitab_tabseamless.cpp @@ -669,7 +669,7 @@ int TABSeamless::GetBounds(double &dXMin, double &dYMin, double &dXMax, } /********************************************************************** - * TABSeamless::GetExtent() + * TABSeamless::IGetExtent() * * Fetch extent of the data currently stored in the dataset. * @@ -678,7 +678,8 @@ int TABSeamless::GetBounds(double &dXMin, double &dYMin, double &dXMax, * * Returns OGRERR_NONE/OGRRERR_FAILURE. **********************************************************************/ -OGRErr TABSeamless::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr TABSeamless::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (m_poIndexTable == nullptr) { @@ -688,7 +689,7 @@ OGRErr TABSeamless::GetExtent(OGREnvelope *psExtent, int bForce) return OGRERR_FAILURE; } - return m_poIndexTable->GetExtent(psExtent, bForce); + return m_poIndexTable->GetExtent(iGeomField, psExtent, bForce); } /********************************************************************** diff --git a/ogr/ogrsf_frmts/mitab/mitab_tabview.cpp b/ogr/ogrsf_frmts/mitab/mitab_tabview.cpp index 779b0ae8c989..16278d7d2b57 100644 --- a/ogr/ogrsf_frmts/mitab/mitab_tabview.cpp +++ b/ogr/ogrsf_frmts/mitab/mitab_tabview.cpp @@ -1009,7 +1009,7 @@ int TABView::GetBounds(double &dXMin, double &dYMin, double &dXMax, } /********************************************************************** - * TABView::GetExtent() + * TABView::IGetExtent() * * Fetch extent of the data currently stored in the dataset. * @@ -1018,7 +1018,7 @@ int TABView::GetBounds(double &dXMin, double &dYMin, double &dXMax, * * Returns OGRERR_NONE/OGRRERR_FAILURE. **********************************************************************/ -OGRErr TABView::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr TABView::IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce) { if (m_nMainTableIndex == -1) { @@ -1028,7 +1028,8 @@ OGRErr TABView::GetExtent(OGREnvelope *psExtent, int bForce) return OGRERR_FAILURE; } - return m_papoTABFiles[m_nMainTableIndex]->GetExtent(psExtent, bForce); + return m_papoTABFiles[m_nMainTableIndex]->GetExtent(iGeomField, psExtent, + bForce); } /********************************************************************** diff --git a/ogr/ogrsf_frmts/mssqlspatial/ogr_mssqlspatial.h b/ogr/ogrsf_frmts/mssqlspatial/ogr_mssqlspatial.h index bf1a4adc2a6a..558ae50f031c 100644 --- a/ogr/ogrsf_frmts/mssqlspatial/ogr_mssqlspatial.h +++ b/ogr/ogrsf_frmts/mssqlspatial/ogr_mssqlspatial.h @@ -441,13 +441,8 @@ class OGRMSSQLSpatialTableLayer final : public OGRMSSQLSpatialLayer OGRErr CreateSpatialIndex(); void DropSpatialIndex(); - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override - { - return GetExtent(0, psExtent, bForce); - } - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual GIntBig GetFeatureCount(int) override; @@ -552,14 +547,6 @@ class OGRMSSQLSpatialSelectLayer final : public OGRMSSQLSpatialLayer virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } - virtual int TestCapability(const char *) override; }; diff --git a/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialselectlayer.cpp b/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialselectlayer.cpp index 30e95cc53efc..f564964cfe83 100644 --- a/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialselectlayer.cpp +++ b/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialselectlayer.cpp @@ -180,19 +180,6 @@ int OGRMSSQLSpatialSelectLayer::TestCapability(const char *pszCap) return OGRMSSQLSpatialLayer::TestCapability(pszCap); } -/************************************************************************/ -/* GetExtent() */ -/* */ -/* Since SELECT layers currently cannot ever have geometry, we */ -/* can optimize the GetExtent() method! */ -/************************************************************************/ - -OGRErr OGRMSSQLSpatialSelectLayer::GetExtent(OGREnvelope *, int) - -{ - return OGRERR_FAILURE; -} - /************************************************************************/ /* GetFeatureCount() */ /* */ diff --git a/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialtablelayer.cpp b/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialtablelayer.cpp index b6d5e381d8b0..3e07345aaa3f 100644 --- a/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialtablelayer.cpp +++ b/ogr/ogrsf_frmts/mssqlspatial/ogrmssqlspatialtablelayer.cpp @@ -682,29 +682,17 @@ OGRFeature *OGRMSSQLSpatialTableLayer::GetFeature(GIntBig nFeatureId) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /* */ /* For Geometry or Geography types we can use an optimized */ -/* statement in other cases we use standard OGRLayer::GetExtent() */ +/* statement in other cases we use standard OGRLayer::IGetExtent() */ /************************************************************************/ -OGRErr OGRMSSQLSpatialTableLayer::GetExtent(int iGeomField, - OGREnvelope *psExtent, int bForce) +OGRErr OGRMSSQLSpatialTableLayer::IGetExtent(int iGeomField, + OGREnvelope *psExtent, bool bForce) { GetLayerDefn(); - // Make sure we have a geometry field: - if (iGeomField < 0 || iGeomField >= poFeatureDefn->GetGeomFieldCount() || - poFeatureDefn->GetGeomFieldDefn(iGeomField)->GetType() == wkbNone) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return OGRERR_FAILURE; - } - // If we have a geometry or geography type: if (nGeomColumnType == MSSQLCOLTYPE_GEOGRAPHY || nGeomColumnType == MSSQLCOLTYPE_GEOMETRY) @@ -798,10 +786,7 @@ OGRErr OGRMSSQLSpatialTableLayer::GetExtent(int iGeomField, } // Fall back to generic implementation (loading all features) - if (iGeomField == 0) - return OGRLayer::GetExtent(psExtent, bForce); - else - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/mvt/ogrmvtdataset.cpp b/ogr/ogrsf_frmts/mvt/ogrmvtdataset.cpp index 809f923406e0..37990de09590 100644 --- a/ogr/ogrsf_frmts/mvt/ogrmvtdataset.cpp +++ b/ogr/ogrsf_frmts/mvt/ogrmvtdataset.cpp @@ -250,13 +250,8 @@ class OGRMVTDirectoryLayer final : public OGRMVTLayerBase virtual void ResetReading() override; virtual GIntBig GetFeatureCount(int bForce) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual void SetSpatialFilter(OGRGeometry *) override; @@ -1818,17 +1813,18 @@ int OGRMVTDirectoryLayer::TestCapability(const char *pszCap) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRMVTDirectoryLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRMVTDirectoryLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (m_sExtent.IsInit()) { *psExtent = m_sExtent; return OGRERR_NONE; } - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/mysql/ogr_mysql.h b/ogr/ogrsf_frmts/mysql/ogr_mysql.h index a9d8c75b0aee..559f8c213953 100644 --- a/ogr/ogrsf_frmts/mysql/ogr_mysql.h +++ b/ogr/ogrsf_frmts/mysql/ogr_mysql.h @@ -198,13 +198,9 @@ class OGRMySQLTableLayer final : public OGRMySQLLayer } virtual int TestCapability(const char *) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; }; /************************************************************************/ diff --git a/ogr/ogrsf_frmts/mysql/ogrmysqltablelayer.cpp b/ogr/ogrsf_frmts/mysql/ogrmysqltablelayer.cpp index 7c7975b49d91..1732708eb37f 100644 --- a/ogr/ogrsf_frmts/mysql/ogrmysqltablelayer.cpp +++ b/ogr/ogrsf_frmts/mysql/ogrmysqltablelayer.cpp @@ -1236,15 +1236,15 @@ GIntBig OGRMySQLTableLayer::GetFeatureCount(CPL_UNUSED int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /* */ /* Retrieve the MBR of the MySQL table. This should be made more */ /* in the future when MySQL adds support for a single MBR query */ /* like PostgreSQL. */ /************************************************************************/ -OGRErr OGRMySQLTableLayer::GetExtent(OGREnvelope *psExtent, - CPL_UNUSED int bForce) +OGRErr OGRMySQLTableLayer::IGetExtent(int /*iGeomField */, + OGREnvelope *psExtent, bool /* bForce */) { if (GetLayerDefn()->GetGeomType() == wkbNone) { diff --git a/ogr/ogrsf_frmts/nas/ogr_nas.h b/ogr/ogrsf_frmts/nas/ogr_nas.h index 6943c882e271..213805d379de 100644 --- a/ogr/ogrsf_frmts/nas/ogr_nas.h +++ b/ogr/ogrsf_frmts/nas/ogr_nas.h @@ -44,13 +44,8 @@ class OGRNASLayer final : public OGRLayer OGRFeature *GetNextFeature() override; GIntBig GetFeatureCount(int bForce = TRUE) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; OGRFeatureDefn *GetLayerDefn() override { diff --git a/ogr/ogrsf_frmts/nas/ogrnaslayer.cpp b/ogr/ogrsf_frmts/nas/ogrnaslayer.cpp index f3aa931f10d5..6131364a548e 100644 --- a/ogr/ogrsf_frmts/nas/ogrnaslayer.cpp +++ b/ogr/ogrsf_frmts/nas/ogrnaslayer.cpp @@ -299,10 +299,11 @@ GIntBig OGRNASLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRNASLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRNASLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { double dfXMin = 0.0; @@ -321,7 +322,7 @@ OGRErr OGRNASLayer::GetExtent(OGREnvelope *psExtent, int bForce) return OGRERR_NONE; } - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/ngw/ogr_ngw.h b/ogr/ogrsf_frmts/ngw/ogr_ngw.h index ea0ace4a9420..ed32a8f8c5b4 100644 --- a/ogr/ogrsf_frmts/ngw/ogr_ngw.h +++ b/ogr/ogrsf_frmts/ngw/ogr_ngw.h @@ -200,9 +200,8 @@ class OGRNGWLayer final : public OGRLayer virtual OGRErr SetNextByIndex(GIntBig nIndex) override; virtual OGRFeature *GetFeature(GIntBig nFID) override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual OGRFeatureDefn *GetLayerDefn() override; virtual int TestCapability(const char *) override; diff --git a/ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp b/ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp index a9d1558b8ea0..bb8080288a7c 100644 --- a/ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp +++ b/ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp @@ -1063,9 +1063,10 @@ GIntBig OGRNGWLayer::GetFeatureCount(int bForce) } /* - * GetExtent() + * IGetExtent() */ -OGRErr OGRNGWLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRNGWLayer::IGetExtent(int /* iGeomField */, OGREnvelope *psExtent, + bool bForce) { if (!stExtent.IsInit() || CPL_TO_BOOL(bForce)) { @@ -1081,14 +1082,6 @@ OGRErr OGRNGWLayer::GetExtent(OGREnvelope *psExtent, int bForce) return OGRERR_NONE; } -/* - * GetExtent() - */ -OGRErr OGRNGWLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) -{ - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); -} - /* * FetchPermissions() */ diff --git a/ogr/ogrsf_frmts/oapif/ogroapifdriver.cpp b/ogr/ogrsf_frmts/oapif/ogroapifdriver.cpp index 76623a3e441f..405b79c679b1 100644 --- a/ogr/ogrsf_frmts/oapif/ogroapifdriver.cpp +++ b/ogr/ogrsf_frmts/oapif/ogroapifdriver.cpp @@ -211,12 +211,8 @@ class OGROAPIFLayer final : public OGRLayer OGRFeature *GetFeature(GIntBig) override; int TestCapability(const char *) override; GIntBig GetFeatureCount(int bForce = FALSE) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; void SetSpatialFilter(OGRGeometry *poGeom) override; @@ -2440,10 +2436,11 @@ GIntBig OGROAPIFLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGROAPIFLayer::GetExtent(OGREnvelope *psEnvelope, int bForce) +OGRErr OGROAPIFLayer::IGetExtent(int iGeomField, OGREnvelope *psEnvelope, + bool bForce) { if (m_oOriginalExtent.IsInit()) { @@ -2452,7 +2449,7 @@ OGRErr OGROAPIFLayer::GetExtent(OGREnvelope *psEnvelope, int bForce) *psEnvelope = m_oExtent; return OGRERR_NONE; } - return OGRLayer::GetExtent(psEnvelope, bForce); + return OGRLayer::IGetExtent(iGeomField, psEnvelope, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/oci/ogr_oci.h b/ogr/ogrsf_frmts/oci/ogr_oci.h index 6472949d2fce..e5162b97dc8e 100644 --- a/ogr/ogrsf_frmts/oci/ogr_oci.h +++ b/ogr/ogrsf_frmts/oci/ogr_oci.h @@ -511,13 +511,8 @@ class OGROCITableLayer final : public OGROCIWritableLayer virtual OGRErr ICreateFeature(OGRFeature *poFeature) override; virtual OGRErr DeleteFeature(GIntBig nFID) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual int TestCapability(const char *) override; diff --git a/ogr/ogrsf_frmts/oci/ogrocitablelayer.cpp b/ogr/ogrsf_frmts/oci/ogrocitablelayer.cpp index cd87bf3f16b4..fd6dfa5df5e7 100644 --- a/ogr/ogrsf_frmts/oci/ogrocitablelayer.cpp +++ b/ogr/ogrsf_frmts/oci/ogrocitablelayer.cpp @@ -1362,10 +1362,11 @@ OGRErr OGROCITableLayer::UnboundCreateFeature(OGRFeature *poFeature) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGROCITableLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGROCITableLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { CPLAssert(nullptr != psExtent); @@ -1443,7 +1444,7 @@ OGRErr OGROCITableLayer::GetExtent(OGREnvelope *psExtent, int bForce) /* -------------------------------------------------------------------- */ if (err != OGRERR_NONE) { - err = OGRLayer::GetExtent(psExtent, bForce); + err = OGRLayer::IGetExtent(iGeomField, psExtent, bForce); CPLDebug("OCI", "Failing to query extent of %s using default GetExtent", osTableName.c_str()); } diff --git a/ogr/ogrsf_frmts/odbc/ogr_odbc.h b/ogr/ogrsf_frmts/odbc/ogr_odbc.h index e4bb01c7335e..9c9e6cd4a4f1 100644 --- a/ogr/ogrsf_frmts/odbc/ogr_odbc.h +++ b/ogr/ogrsf_frmts/odbc/ogr_odbc.h @@ -153,13 +153,8 @@ class OGRODBCSelectLayer final : public OGRODBCLayer virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual int TestCapability(const char *) override; }; diff --git a/ogr/ogrsf_frmts/odbc/ogrodbcselectlayer.cpp b/ogr/ogrsf_frmts/odbc/ogrodbcselectlayer.cpp index 2ee55f3c845d..360ffa0bb661 100644 --- a/ogr/ogrsf_frmts/odbc/ogrodbcselectlayer.cpp +++ b/ogr/ogrsf_frmts/odbc/ogrodbcselectlayer.cpp @@ -129,13 +129,13 @@ int OGRODBCSelectLayer::TestCapability(const char *pszCap) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /* */ /* Since SELECT layers currently cannot ever have geometry, we */ -/* can optimize the GetExtent() method! */ +/* can optimize the IGetExtent() method! */ /************************************************************************/ -OGRErr OGRODBCSelectLayer::GetExtent(OGREnvelope *, int) +OGRErr OGRODBCSelectLayer::IGetExtent(int, OGREnvelope *, bool) { return OGRERR_FAILURE; diff --git a/ogr/ogrsf_frmts/ogrsf_frmts.dox b/ogr/ogrsf_frmts/ogrsf_frmts.dox index d39476a4e545..786d4ca4b191 100644 --- a/ogr/ogrsf_frmts/ogrsf_frmts.dox +++ b/ogr/ogrsf_frmts/ogrsf_frmts.dox @@ -861,211 +861,6 @@ by the OGRSFDriverManager. */ -/** - - \fn OGRErr OGRLayer::GetExtent( OGREnvelope *psExtent, int bForce = TRUE ); - - \brief Fetch the extent of this layer. - - Returns the extent (MBR) of the data in the layer. If bForce is FALSE, - and it would be expensive to establish the extent then OGRERR_FAILURE - will be returned indicating that the extent isn't know. If bForce is - TRUE then some implementations will actually scan the entire layer once - to compute the MBR of all the features in the layer. - - Depending on the drivers, the returned extent may or may not take the - spatial filter into account. So it is safer to call GetExtent() without - setting a spatial filter. - - Layers without any geometry may return OGRERR_FAILURE just indicating that - no meaningful extents could be collected. - - Note that some implementations of this method may alter the read cursor - of the layer. - - This method is the same as the C function OGR_L_GetExtent(). - - @param psExtent the structure in which the extent value will be returned. - @param bForce Flag indicating whether the extent should be computed even - if it is expensive. - - @return OGRERR_NONE on success, OGRERR_FAILURE if extent not known. - -*/ - - -/** - - \fn OGRErr OGR_L_GetExtent( OGRLayerH hLayer, OGREnvelope *psExtent, int bForce); - - \brief Fetch the extent of this layer. - - Returns the extent (MBR) of the data in the layer. If bForce is FALSE, - and it would be expensive to establish the extent then OGRERR_FAILURE - will be returned indicating that the extent isn't know. If bForce is - TRUE then some implementations will actually scan the entire layer once - to compute the MBR of all the features in the layer. - - Depending on the drivers, the returned extent may or may not take the - spatial filter into account. So it is safer to call OGR_L_GetExtent() without - setting a spatial filter. - - Layers without any geometry may return OGRERR_FAILURE just indicating that - no meaningful extents could be collected. - - Note that some implementations of this method may alter the read cursor - of the layer. - - This function is the same as the C++ method OGRLayer::GetExtent(). - - @param hLayer handle to the layer from which to get extent. - @param psExtent the structure in which the extent value will be returned. - @param bForce Flag indicating whether the extent should be computed even - if it is expensive. - - @return OGRERR_NONE on success, OGRERR_FAILURE if extent not known. - -*/ - -/** - - \fn OGRErr OGRLayer::GetExtent( int iGeomField,OGREnvelope *psExtent, int bForce = TRUE ); - - \brief Fetch the extent of this layer, on the specified geometry field. - - Returns the extent (MBR) of the data in the layer. If bForce is FALSE, - and it would be expensive to establish the extent then OGRERR_FAILURE - will be returned indicating that the extent isn't know. If bForce is - TRUE then some implementations will actually scan the entire layer once - to compute the MBR of all the features in the layer. - - Depending on the drivers, the returned extent may or may not take the - spatial filter into account. So it is safer to call GetExtent() without - setting a spatial filter. - - Layers without any geometry may return OGRERR_FAILURE just indicating that - no meaningful extents could be collected. - - Note that some implementations of this method may alter the read cursor - of the layer. - - Note to driver implementer: if you implement GetExtent(int,OGREnvelope*,int), - you must also implement GetExtent(OGREnvelope*, int) to make it call - GetExtent(0,OGREnvelope*,int). - - This method is the same as the C function OGR_L_GetExtentEx(). - - @param iGeomField the index of the geometry field on which to compute the extent. - @param psExtent the structure in which the extent value will be returned. - @param bForce Flag indicating whether the extent should be computed even - if it is expensive. - - @return OGRERR_NONE on success, OGRERR_FAILURE if extent not known. - -*/ - - -/** - - \fn OGRErr OGR_L_GetExtentEx( OGRLayerH hLayer, int iGeomField, OGREnvelope *psExtent, int bForce); - - \brief Fetch the extent of this layer, on the specified geometry field. - - Returns the extent (MBR) of the data in the layer. If bForce is FALSE, - and it would be expensive to establish the extent then OGRERR_FAILURE - will be returned indicating that the extent isn't know. If bForce is - TRUE then some implementations will actually scan the entire layer once - to compute the MBR of all the features in the layer. - - Depending on the drivers, the returned extent may or may not take the - spatial filter into account. So it is safer to call OGR_L_GetExtent() without - setting a spatial filter. - - Layers without any geometry may return OGRERR_FAILURE just indicating that - no meaningful extents could be collected. - - Note that some implementations of this method may alter the read cursor - of the layer. - - This function is the same as the C++ method OGRLayer::GetExtent(). - - @param hLayer handle to the layer from which to get extent. - @param iGeomField the index of the geometry field on which to compute the extent. - @param psExtent the structure in which the extent value will be returned. - @param bForce Flag indicating whether the extent should be computed even - if it is expensive. - - @return OGRERR_NONE on success, OGRERR_FAILURE if extent not known. - -*/ - -/** - \fn OGRErr OGRLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, int bForce = TRUE); - - \brief Fetch the 3D extent of this layer, on the specified geometry field. - - Returns the 3D extent (MBR) of the data in the layer. If bForce is FALSE, - and it would be expensive to establish the extent then OGRERR_FAILURE - will be returned indicating that the extent isn't know. If bForce is - TRUE then some implementations will actually scan the entire layer once - to compute the MBR of all the features in the layer. - - (Contrarty to GetExtent() 2D), the returned extent will always take into - account the attribute and spatial filters that may be installed. - - Layers without any geometry may return OGRERR_FAILURE just indicating that - no meaningful extents could be collected. - - For layers that have no 3D geometries, the psExtent3D->MinZ and psExtent3D->MaxZ - fields will be respectively set to +Infinity and -Infinity. - - Note that some implementations of this method may alter the read cursor - of the layer. - - This function is the same as the C function OGR_L_GetExtent3D(). - - @param iGeomField 0-based index of the geometry field to consider. - @param psExtent3D the computed 3D extent of the layer. - @param bForce if TRUE, the extent will be computed even if all the - layer features have to be fetched. - @return OGRERR_NONE on success or an error code in case of failure. - @since GDAL 3.9 -*/ - -/** - \fn OGRErr OGR_L_GetExtent3D( OGRLayerH hLayer, int iGeomField, OGREnvelope3D *psExtent3D, int bForce); - - \brief Fetch the 3D extent of this layer, on the specified geometry field. - - Returns the 3D extent (MBR) of the data in the layer. If bForce is FALSE, - and it would be expensive to establish the extent then OGRERR_FAILURE - will be returned indicating that the extent isn't know. If bForce is - TRUE then some implementations will actually scan the entire layer once - to compute the MBR of all the features in the layer. - - (Contrarty to GetExtent() 2D), the returned extent will always take into - account the attribute and spatial filters that may be installed. - - Layers without any geometry may return OGRERR_FAILURE just indicating that - no meaningful extents could be collected. - - For layers that have no 3D geometries, the psExtent3D->MinZ and psExtent3D->MaxZ - fields will be respectively set to +Infinity and -Infinity. - - Note that some implementations of this method may alter the read cursor - of the layer. - - This function is the same as the C++ method OGRLayer::GetExtent3D(). - - @param hLayer the layer to consider. - @param iGeomField 0-based index of the geometry field to consider. - @param psExtent3D the computed 3D extent of the layer. - @param bForce if TRUE, the extent will be computed even if all the - layer features have to be fetched. - @return OGRERR_NONE on success or an error code in case of failure. - @since GDAL 3.9 -*/ - /** \fn void OGRLayer::SetSpatialFilter( OGRGeometry * poFilter ); diff --git a/ogr/ogrsf_frmts/ogrsf_frmts.h b/ogr/ogrsf_frmts/ogrsf_frmts.h index 0d774075baa4..8f37018a28f9 100644 --- a/ogr/ogrsf_frmts/ogrsf_frmts.h +++ b/ogr/ogrsf_frmts/ogrsf_frmts.h @@ -100,10 +100,14 @@ class CPL_DLL OGRLayer : public GDALMajorObject ValidateGeometryFieldIndexForSetSpatialFilter(int iGeomField, const OGRGeometry *poGeomIn, bool bIsSelectLayer = false); - - OGRErr GetExtentInternal(int iGeomField, OGREnvelope *psExtent, int bForce); //! @endcond + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) CPL_WARN_UNUSED_RESULT; + + virtual OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, + bool bForce) CPL_WARN_UNUSED_RESULT; + 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; @@ -246,13 +250,14 @@ class CPL_DLL OGRLayer : public GDALMajorObject const OGRSpatialReference *poSRS); virtual GIntBig GetFeatureCount(int bForce = TRUE); - virtual OGRErr GetExtent(OGREnvelope *psExtent, - int bForce = TRUE) CPL_WARN_UNUSED_RESULT; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) CPL_WARN_UNUSED_RESULT; - virtual OGRErr GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, - int bForce = TRUE) CPL_WARN_UNUSED_RESULT; + OGRErr GetExtent(OGREnvelope *psExtent, + bool bForce = true) CPL_WARN_UNUSED_RESULT; + OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce = true) CPL_WARN_UNUSED_RESULT; + + OGRErr GetExtent3D(int iGeomField, OGREnvelope3D *psExtent, + bool bForce = true) CPL_WARN_UNUSED_RESULT; virtual int TestCapability(const char *) = 0; diff --git a/ogr/ogrsf_frmts/openfilegdb/ogr_openfilegdb.h b/ogr/ogrsf_frmts/openfilegdb/ogr_openfilegdb.h index 90c17878d2fd..b608bbcca086 100644 --- a/ogr/ogrsf_frmts/openfilegdb/ogr_openfilegdb.h +++ b/ogr/ogrsf_frmts/openfilegdb/ogr_openfilegdb.h @@ -265,16 +265,11 @@ class OGROpenFileGDBLayer final : public OGRLayer virtual OGRErr SetNextByIndex(GIntBig nIndex) override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } - - OGRErr GetExtent3D(int iGeomField, OGREnvelope3D *psExtent, - int bForce) override; + OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent, + bool bForce) override; virtual OGRFeatureDefn *GetLayerDefn() override; diff --git a/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdbdatasource.cpp b/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdbdatasource.cpp index 5e9a43ca0ccf..29e1b45b928f 100644 --- a/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdbdatasource.cpp +++ b/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdbdatasource.cpp @@ -1369,15 +1369,16 @@ class OGROpenFileGDBSimpleSQLLayer final : public OGRLayer return poBaseLayer->GetFIDColumn(); } - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override { - return poBaseLayer->GetExtent(psExtent, bForce); + return poBaseLayer->GetExtent(iGeomField, psExtent, bForce); } - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override + virtual OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent, + bool bForce) override { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); + return poBaseLayer->GetExtent3D(iGeomField, psExtent, bForce); } virtual GIntBig GetFeatureCount(int bForce) override; diff --git a/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp b/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp index d6c56213b44e..be5d837a2548 100644 --- a/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp +++ b/ogr/ogrsf_frmts/openfilegdb/ogropenfilegdblayer.cpp @@ -2038,10 +2038,11 @@ OGRErr OGROpenFileGDBLayer::SetNextByIndex(GIntBig nIndex) } /***********************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /***********************************************************************/ -OGRErr OGROpenFileGDBLayer::GetExtent(OGREnvelope *psExtent, int /* bForce */) +OGRErr OGROpenFileGDBLayer::IGetExtent(int /* iGeomField */, + OGREnvelope *psExtent, bool /* bForce */) { if (!BuildLayerDefinition()) return OGRERR_FAILURE; @@ -2064,11 +2065,11 @@ OGRErr OGROpenFileGDBLayer::GetExtent(OGREnvelope *psExtent, int /* bForce */) } /***********************************************************************/ -/* GetExtent3D() */ +/* IGetExtent3D() */ /***********************************************************************/ -OGRErr OGROpenFileGDBLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent, - int bForce) +OGRErr OGROpenFileGDBLayer::IGetExtent3D(int iGeomField, + OGREnvelope3D *psExtent, bool bForce) { if (!BuildLayerDefinition()) return OGRERR_FAILURE; @@ -2093,7 +2094,7 @@ OGRErr OGROpenFileGDBLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent, { if (OGR_GT_HasZ(m_eGeomType)) { - return OGRLayer::GetExtent3D(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent3D(iGeomField, psExtent, bForce); } psExtent->MinZ = std::numeric_limits::infinity(); psExtent->MaxZ = -std::numeric_limits::infinity(); @@ -2102,7 +2103,7 @@ OGRErr OGROpenFileGDBLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent, } } - return OGRLayer::GetExtent3D(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent3D(iGeomField, psExtent, bForce); } /***********************************************************************/ diff --git a/ogr/ogrsf_frmts/osm/ogr_osm.h b/ogr/ogrsf_frmts/osm/ogr_osm.h index b5084ad14435..4fbc082c75d0 100644 --- a/ogr/ogrsf_frmts/osm/ogr_osm.h +++ b/ogr/ogrsf_frmts/osm/ogr_osm.h @@ -151,13 +151,8 @@ class OGROSMLayer final : public OGRLayer virtual OGRErr SetAttributeFilter(const char *pszAttrQuery) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; const OGREnvelope *GetSpatialFilterEnvelope(); diff --git a/ogr/ogrsf_frmts/osm/ogrosmlayer.cpp b/ogr/ogrsf_frmts/osm/ogrosmlayer.cpp index c9d35582c275..b329bc938321 100644 --- a/ogr/ogrsf_frmts/osm/ogrosmlayer.cpp +++ b/ogr/ogrsf_frmts/osm/ogrosmlayer.cpp @@ -372,15 +372,15 @@ bool OGROSMLayer::AddFeature(std::unique_ptr poFeature, } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGROSMLayer::GetExtent(OGREnvelope *psExtent, int /* bForce */) +OGRErr OGROSMLayer::IGetExtent(int /* iGeomField */, OGREnvelope *psExtent, + bool /* bForce */) { if (m_poDS->GetExtent(psExtent) == OGRERR_NONE) return OGRERR_NONE; - /* return OGRLayer::GetExtent(psExtent, bForce);*/ return OGRERR_FAILURE; } diff --git a/ogr/ogrsf_frmts/parquet/ogr_parquet.h b/ogr/ogrsf_frmts/parquet/ogr_parquet.h index 1c1f86ea6eed..c5eeb6b88eda 100644 --- a/ogr/ogrsf_frmts/parquet/ogr_parquet.h +++ b/ogr/ogrsf_frmts/parquet/ogr_parquet.h @@ -254,9 +254,8 @@ class OGRParquetDatasetLayer final : public OGRParquetLayerBase OGRFeature *GetNextFeature() override; GIntBig GetFeatureCount(int bForce) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; void SetSpatialFilter(OGRGeometry *poGeom) override { diff --git a/ogr/ogrsf_frmts/parquet/ogrparquetdatasetlayer.cpp b/ogr/ogrsf_frmts/parquet/ogrparquetdatasetlayer.cpp index 75b7beae007c..6dbc0093e250 100644 --- a/ogr/ogrsf_frmts/parquet/ogrparquetdatasetlayer.cpp +++ b/ogr/ogrsf_frmts/parquet/ogrparquetdatasetlayer.cpp @@ -1058,15 +1058,6 @@ GIntBig OGRParquetDatasetLayer::GetFeatureCount(int bForce) return OGRLayer::GetFeatureCount(bForce); } -/************************************************************************/ -/* GetExtent() */ -/************************************************************************/ - -OGRErr OGRParquetDatasetLayer::GetExtent(OGREnvelope *psExtent, int bForce) -{ - return GetExtent(0, psExtent, bForce); -} - /************************************************************************/ /* FastGetExtent() */ /************************************************************************/ @@ -1085,22 +1076,12 @@ bool OGRParquetDatasetLayer::FastGetExtent(int iGeomField, } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRParquetDatasetLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRParquetDatasetLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { - if (iGeomField < 0 || iGeomField >= m_poFeatureDefn->GetGeomFieldCount()) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return OGRERR_FAILURE; - } - if (FastGetExtent(iGeomField, psExtent)) { return OGRERR_NONE; @@ -1161,7 +1142,7 @@ OGRErr OGRParquetDatasetLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, } } - return OGRParquetLayerBase::GetExtent(iGeomField, psExtent, bForce); + return OGRParquetLayerBase::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/pg/ogr_pg.h b/ogr/ogrsf_frmts/pg/ogr_pg.h index 2e756164f5e9..4871dc81d163 100644 --- a/ogr/ogrsf_frmts/pg/ogr_pg.h +++ b/ogr/ogrsf_frmts/pg/ogr_pg.h @@ -236,16 +236,11 @@ class OGRPGLayer CPL_NON_FINAL : public OGRLayer return poFeatureDefn; } - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override - { - return GetExtent(0, psExtent, bForce); - } - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override; + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; - OGRErr GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, - int bForce) override; + OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, + bool bForce) override; virtual OGRErr StartTransaction() override; virtual OGRErr CommitTransaction() override; @@ -406,13 +401,8 @@ class OGRPGTableLayer final : public OGRPGLayer virtual int TestCapability(const char *) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override - { - return GetExtent(0, psExtent, bForce); - } - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override; + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; const char *GetTableName() { diff --git a/ogr/ogrsf_frmts/pg/ogrpglayer.cpp b/ogr/ogrsf_frmts/pg/ogrpglayer.cpp index 05f4685fd16d..96a4e25d605f 100644 --- a/ogr/ogrsf_frmts/pg/ogrpglayer.cpp +++ b/ogr/ogrsf_frmts/pg/ogrpglayer.cpp @@ -1884,28 +1884,17 @@ const char *OGRPGLayer::GetFIDColumn() } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /* */ /* For PostGIS use internal Extend(geometry) function */ /* in other cases we use standard OGRLayer::GetExtent() */ /************************************************************************/ -OGRErr OGRPGLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) +OGRErr OGRPGLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { CPLString osCommand; - 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 OGRERR_FAILURE; - } - OGRPGGeomFieldDefn *poGeomFieldDefn = poFeatureDefn->GetGeomFieldDefn(iGeomField); @@ -1934,14 +1923,12 @@ OGRErr OGRPGLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) OGRERR_NONE) return OGRERR_NONE; } - if (iGeomField == 0) - return OGRLayer::GetExtent(psExtent, bForce); - else - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); + + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } -OGRErr OGRPGLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, - int bForce) +OGRErr OGRPGLayer::IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, + bool bForce) { auto poLayerDefn = GetLayerDefn(); @@ -1958,18 +1945,6 @@ OGRErr OGRPGLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, CPLString osCommand; - if (iGeomField < 0 || iGeomField >= poLayerDefn->GetGeomFieldCount() || - CPLAssertNotNull(poLayerDefn->GetGeomFieldDefn(iGeomField)) - ->GetType() == wkbNone) - { - if (iGeomField != 0) - { - CPLError(CE_Failure, CPLE_AppDefined, - "Invalid geometry field index : %d", iGeomField); - } - return OGRERR_FAILURE; - } - OGRPGGeomFieldDefn *poGeomFieldDefn = poLayerDefn->GetGeomFieldDefn(iGeomField); @@ -1998,7 +1973,7 @@ OGRErr OGRPGLayer::GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, return OGRERR_NONE; } - return OGRLayer::GetExtent3D(iGeomField, psExtent3D, bForce); + return OGRLayer::IGetExtent3D(iGeomField, psExtent3D, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/pg/ogrpgtablelayer.cpp b/ogr/ogrsf_frmts/pg/ogrpgtablelayer.cpp index f98e9134069f..e1e1c2e1012c 100644 --- a/ogr/ogrsf_frmts/pg/ogrpgtablelayer.cpp +++ b/ogr/ogrsf_frmts/pg/ogrpgtablelayer.cpp @@ -3681,28 +3681,17 @@ void OGRPGTableLayer::SetOverrideColumnTypes(const char *pszOverrideColumnTypes) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /* */ /* For PostGIS use internal ST_EstimatedExtent(geometry) function */ /* if bForce == 0 */ /************************************************************************/ -OGRErr OGRPGTableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRPGTableLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { CPLString osCommand; - 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 OGRERR_FAILURE; - } - if (bDeferredCreation && RunDeferredCreationIfNecessary() != OGRERR_NONE) return OGRERR_FAILURE; poDS->EndCopy(); @@ -3743,7 +3732,7 @@ OGRErr OGRPGTableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, "Unable to get estimated extent by PostGIS. Trying real extent."); } - return OGRPGLayer::GetExtent(iGeomField, psExtent, bForce); + return OGRPGLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/pgeo/ogr_pgeo.h b/ogr/ogrsf_frmts/pgeo/ogr_pgeo.h index 451fa8d68083..60555e9920ff 100644 --- a/ogr/ogrsf_frmts/pgeo/ogr_pgeo.h +++ b/ogr/ogrsf_frmts/pgeo/ogr_pgeo.h @@ -117,13 +117,8 @@ class OGRPGeoTableLayer final : public OGRPGeoLayer virtual int TestCapability(const char *) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; const std::string &GetXMLDefinition() { diff --git a/ogr/ogrsf_frmts/pgeo/ogrpgeotablelayer.cpp b/ogr/ogrsf_frmts/pgeo/ogrpgeotablelayer.cpp index 6feea0de33fd..709cc2c8de00 100644 --- a/ogr/ogrsf_frmts/pgeo/ogrpgeotablelayer.cpp +++ b/ogr/ogrsf_frmts/pgeo/ogrpgeotablelayer.cpp @@ -407,11 +407,11 @@ GIntBig OGRPGeoTableLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRPGeoTableLayer::GetExtent(OGREnvelope *psExtent, - CPL_UNUSED int bForce) +OGRErr OGRPGeoTableLayer::IGetExtent(int /* iGeomField */, + OGREnvelope *psExtent, bool /* bForce */) { if (pszGeomColumn == nullptr) { diff --git a/ogr/ogrsf_frmts/plscenes/ogr_plscenes.h b/ogr/ogrsf_frmts/plscenes/ogr_plscenes.h index 837dfd4063b5..12cc871b6bde 100644 --- a/ogr/ogrsf_frmts/plscenes/ogr_plscenes.h +++ b/ogr/ogrsf_frmts/plscenes/ogr_plscenes.h @@ -169,13 +169,8 @@ class OGRPLScenesDataV1Layer final : public OGRLayer virtual OGRErr SetAttributeFilter(const char *) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; }; #endif /* ndef OGR_PLSCENES_H_INCLUDED */ diff --git a/ogr/ogrsf_frmts/plscenes/ogrplscenesdatav1layer.cpp b/ogr/ogrsf_frmts/plscenes/ogrplscenesdatav1layer.cpp index ddf6df8d4312..1f3130c43e63 100644 --- a/ogr/ogrsf_frmts/plscenes/ogrplscenesdatav1layer.cpp +++ b/ogr/ogrsf_frmts/plscenes/ogrplscenesdatav1layer.cpp @@ -1337,15 +1337,16 @@ GIntBig OGRPLScenesDataV1Layer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRPLScenesDataV1Layer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRPLScenesDataV1Layer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (m_poFilterGeom != nullptr) { m_bInFeatureCountOrGetExtent = true; - OGRErr eErr = OGRLayer::GetExtentInternal(0, psExtent, bForce); + OGRErr eErr = OGRLayer::IGetExtent(iGeomField, psExtent, bForce); m_bInFeatureCountOrGetExtent = false; return eErr; } diff --git a/ogr/ogrsf_frmts/pmtiles/ogr_pmtiles.h b/ogr/ogrsf_frmts/pmtiles/ogr_pmtiles.h index 9b08d4276c02..03a45c4ab4e3 100644 --- a/ogr/ogrsf_frmts/pmtiles/ogr_pmtiles.h +++ b/ogr/ogrsf_frmts/pmtiles/ogr_pmtiles.h @@ -257,12 +257,8 @@ class OGRPMTilesVectorLayer final int TestCapability(const char *) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; void SetSpatialFilter(OGRGeometry *) override; diff --git a/ogr/ogrsf_frmts/pmtiles/ogrpmtilesvectorlayer.cpp b/ogr/ogrsf_frmts/pmtiles/ogrpmtilesvectorlayer.cpp index 438fe86bb1da..8e329501f241 100644 --- a/ogr/ogrsf_frmts/pmtiles/ogrpmtilesvectorlayer.cpp +++ b/ogr/ogrsf_frmts/pmtiles/ogrpmtilesvectorlayer.cpp @@ -489,10 +489,11 @@ int OGRPMTilesVectorLayer::TestCapability(const char *pszCap) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRPMTilesVectorLayer::GetExtent(OGREnvelope *psExtent, int) +OGRErr OGRPMTilesVectorLayer::IGetExtent(int /* iGeomField */, + OGREnvelope *psExtent, bool) { *psExtent = m_sExtent; return OGRERR_NONE; diff --git a/ogr/ogrsf_frmts/s57/ogr_s57.h b/ogr/ogrsf_frmts/s57/ogr_s57.h index 8787546c0289..295304ee148c 100644 --- a/ogr/ogrsf_frmts/s57/ogr_s57.h +++ b/ogr/ogrsf_frmts/s57/ogr_s57.h @@ -48,13 +48,8 @@ class OGRS57Layer final : public OGRLayer virtual OGRFeature *GetFeature(GIntBig nFeatureId) override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; OGRFeatureDefn *GetLayerDefn() override { diff --git a/ogr/ogrsf_frmts/s57/ogrs57layer.cpp b/ogr/ogrsf_frmts/s57/ogrs57layer.cpp index ddff94c7ab05..752089036c06 100644 --- a/ogr/ogrsf_frmts/s57/ogrs57layer.cpp +++ b/ogr/ogrsf_frmts/s57/ogrs57layer.cpp @@ -204,10 +204,11 @@ int OGRS57Layer::TestCapability(const char *pszCap) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRS57Layer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRS57Layer::IGetExtent(int /*iGeomField*/, OGREnvelope *psExtent, + bool bForce) { if (GetGeomType() == wkbNone) diff --git a/ogr/ogrsf_frmts/selafin/ogr_selafin.h b/ogr/ogrsf_frmts/selafin/ogr_selafin.h index da4a6482dbf1..b8fe2a9ad7de 100644 --- a/ogr/ogrsf_frmts/selafin/ogr_selafin.h +++ b/ogr/ogrsf_frmts/selafin/ogr_selafin.h @@ -108,13 +108,8 @@ class OGRSelafinLayer final : public OGRLayer int TestCapability(const char *pszCap) override; GIntBig GetFeatureCount(int bForce = TRUE) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; OGRErr ISetFeature(OGRFeature *poFeature) override; OGRErr ICreateFeature(OGRFeature *poFeature) override; diff --git a/ogr/ogrsf_frmts/selafin/ogrselafinlayer.cpp b/ogr/ogrsf_frmts/selafin/ogrselafinlayer.cpp index 0e1e30bb1689..ea992e73d5d3 100644 --- a/ogr/ogrsf_frmts/selafin/ogrselafinlayer.cpp +++ b/ogr/ogrsf_frmts/selafin/ogrselafinlayer.cpp @@ -270,9 +270,10 @@ GIntBig OGRSelafinLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRSelafinLayer::GetExtent(OGREnvelope *psExtent, CPL_UNUSED int bForce) +OGRErr OGRSelafinLayer::IGetExtent(int /* iGeomField*/, OGREnvelope *psExtent, + bool /* bForce*/) { // CPLDebug("Selafin","GetExtent(%i)",bForce); if (poHeader->nPoints == 0) diff --git a/ogr/ogrsf_frmts/shape/ogrshape.h b/ogr/ogrsf_frmts/shape/ogrshape.h index a929e7514d70..c4773f999826 100644 --- a/ogr/ogrsf_frmts/shape/ogrshape.h +++ b/ogr/ogrsf_frmts/shape/ogrshape.h @@ -250,15 +250,11 @@ class OGRShapeLayer final : public OGRAbstractProxiedLayer } GIntBig GetFeatureCount(int) override; - OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; + OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } - - OGRErr GetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, - int bForce) override; + OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, + bool bForce) override; OGRErr CreateField(const OGRFieldDefn *poField, int bApproxOK = TRUE) override; diff --git a/ogr/ogrsf_frmts/shape/ogrshapelayer.cpp b/ogr/ogrsf_frmts/shape/ogrshapelayer.cpp index 17a5868c60be..fbcd0340b952 100644 --- a/ogr/ogrsf_frmts/shape/ogrshapelayer.cpp +++ b/ogr/ogrsf_frmts/shape/ogrshapelayer.cpp @@ -1656,7 +1656,7 @@ GIntBig OGRShapeLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /* */ /* Fetch extent of the data currently stored in the dataset. */ /* The bForce flag has no effect on SHP files since that value */ @@ -1665,7 +1665,8 @@ GIntBig OGRShapeLayer::GetFeatureCount(int bForce) /* Returns OGRERR_NONE/OGRRERR_FAILURE. */ /************************************************************************/ -OGRErr OGRShapeLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRShapeLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (!TouchLayer()) @@ -1696,7 +1697,12 @@ OGRErr OGRShapeLayer::GetExtent(OGREnvelope *psExtent, int bForce) OGRGeometry *poFilterGeom = m_poFilterGeom; m_poFilterGeom = nullptr; - const OGRErr eErr = OGRLayer::GetExtent(psExtent, bForce); + psExtent->MinX = 0; + psExtent->MinY = 0; + psExtent->MaxX = 0; + psExtent->MaxY = 0; + + const OGRErr eErr = OGRLayer::IGetExtent(iGeomField, psExtent, bForce); m_poAttrQuery = poAttrQuery; m_poFilterGeom = poFilterGeom; @@ -1706,10 +1712,11 @@ OGRErr OGRShapeLayer::GetExtent(OGREnvelope *psExtent, int bForce) return OGRERR_NONE; } -OGRErr OGRShapeLayer::GetExtent3D(int, OGREnvelope3D *psExtent3D, int bForce) +OGRErr OGRShapeLayer::IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D, + bool bForce) { if (m_poFilterGeom || m_poAttrQuery) - return OGRLayer::GetExtent3D(0, psExtent3D, bForce); + return OGRLayer::IGetExtent3D(iGeomField, psExtent3D, bForce); if (!TouchLayer()) return OGRERR_FAILURE; @@ -1750,7 +1757,8 @@ OGRErr OGRShapeLayer::GetExtent3D(int, OGREnvelope3D *psExtent3D, int bForce) OGRGeometry *poFilterGeom = m_poFilterGeom; m_poFilterGeom = nullptr; - const OGRErr eErr = OGRLayer::GetExtent3D(0, psExtent3D, bForce); + const OGRErr eErr = + OGRLayer::IGetExtent3D(iGeomField, psExtent3D, bForce); m_poAttrQuery = poAttrQuery; m_poFilterGeom = poFilterGeom; diff --git a/ogr/ogrsf_frmts/sqlite/ogr_sqlite.h b/ogr/ogrsf_frmts/sqlite/ogr_sqlite.h index d4621fbe7994..767e199b1691 100644 --- a/ogr/ogrsf_frmts/sqlite/ogr_sqlite.h +++ b/ogr/ogrsf_frmts/sqlite/ogr_sqlite.h @@ -357,9 +357,9 @@ class OGRSQLiteTableLayer final : public OGRSQLiteLayer virtual const char *GetName() override; virtual GIntBig GetFeatureCount(int) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override; + + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual OGRFeatureDefn *GetLayerDefn() override; @@ -562,13 +562,8 @@ class OGRSQLiteSelectLayer CPL_NON_FINAL : public OGRSQLiteLayer, virtual int TestCapability(const char *) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override - { - return GetExtent(0, psExtent, bForce); - } - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual OGRFeatureDefn *GetLayerDefn() override { @@ -635,15 +630,10 @@ class OGRSQLiteSelectLayer CPL_NON_FINAL : public OGRSQLiteLayer, return OGRSQLiteLayer::TestCapability(pszCap); } - virtual OGRErr BaseGetExtent(OGREnvelope *psExtent, int bForce) override - { - return OGRSQLiteLayer::GetExtent(psExtent, bForce); - } - virtual OGRErr BaseGetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override + bool bForce) override { - return OGRSQLiteLayer::GetExtent(iGeomField, psExtent, bForce); + return OGRSQLiteLayer::IGetExtent(iGeomField, psExtent, bForce); } bool diff --git a/ogr/ogrsf_frmts/sqlite/ogrsqlitebase.h b/ogr/ogrsf_frmts/sqlite/ogrsqlitebase.h index bf9642721456..e3e5b2eebf57 100644 --- a/ogr/ogrsf_frmts/sqlite/ogrsqlitebase.h +++ b/ogr/ogrsf_frmts/sqlite/ogrsqlitebase.h @@ -285,9 +285,8 @@ class IOGRSQLiteSelectLayer virtual OGRErr BaseSetAttributeFilter(const char *pszQuery) = 0; virtual GIntBig BaseGetFeatureCount(int bForce) = 0; virtual int BaseTestCapability(const char *) = 0; - virtual OGRErr BaseGetExtent(OGREnvelope *psExtent, int bForce) = 0; virtual OGRErr BaseGetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) = 0; + bool bForce) = 0; virtual bool ValidateGeometryFieldIndexForSetSpatialFilter( int iGeomField, const OGRGeometry *poGeomIn, bool bIsSelectLayer) = 0; }; @@ -326,7 +325,7 @@ class OGRSQLiteSelectLayerCommonBehaviour void SetSpatialFilter(int iGeomField, OGRGeometry *); OGRErr SetAttributeFilter(const char *); int TestCapability(const char *); - OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce); + 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 6aff267f4e17..4da8a52ed42b 100644 --- a/ogr/ogrsf_frmts/sqlite/ogrsqliteselectlayer.cpp +++ b/ogr/ogrsf_frmts/sqlite/ogrsqliteselectlayer.cpp @@ -647,15 +647,15 @@ int OGRSQLiteSelectLayerCommonBehaviour::TestCapability(const char *pszCap) /* GetExtent() */ /************************************************************************/ -OGRErr OGRSQLiteSelectLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRSQLiteSelectLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { return m_poBehavior->GetExtent(iGeomField, psExtent, bForce); } OGRErr OGRSQLiteSelectLayerCommonBehaviour::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) + bool bForce) { if (iGeomField < 0 || iGeomField >= m_poLayer->GetLayerDefn()->GetGeomFieldCount() || @@ -712,11 +712,7 @@ OGRErr OGRSQLiteSelectLayerCommonBehaviour::GetExtent(int iGeomField, } } - OGRErr eErr; - if (iGeomField == 0) - eErr = m_poLayer->BaseGetExtent(psExtent, bForce); - else - eErr = m_poLayer->BaseGetExtent(iGeomField, psExtent, bForce); + OGRErr eErr = m_poLayer->BaseGetExtent(iGeomField, psExtent, bForce); if (iGeomField == 0 && eErr == OGRERR_NONE && m_poDS->GetUpdate() == false) m_poDS->SetEnvelopeForSQL(m_osSQLBase, *psExtent); return eErr; diff --git a/ogr/ogrsf_frmts/sqlite/ogrsqlitetablelayer.cpp b/ogr/ogrsf_frmts/sqlite/ogrsqlitetablelayer.cpp index bc4dd42ae3e4..68fd0cd4d3a3 100644 --- a/ogr/ogrsf_frmts/sqlite/ogrsqlitetablelayer.cpp +++ b/ogr/ogrsf_frmts/sqlite/ogrsqlitetablelayer.cpp @@ -1287,35 +1287,15 @@ GIntBig OGRSQLiteTableLayer::GetFeatureCount(int bForce) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRSQLiteTableLayer::GetExtent(OGREnvelope *psExtent, int bForce) -{ - return GetExtent(0, psExtent, bForce); -} - -OGRErr OGRSQLiteTableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) +OGRErr OGRSQLiteTableLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (HasLayerDefnError()) return OGRERR_FAILURE; - /* -------------------------------------------------------------------- */ - /* If this layer has a none geometry type, then we can */ - /* reasonably assume there are not extents available. */ - /* -------------------------------------------------------------------- */ - 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 OGRERR_FAILURE; - } - OGRSQLiteGeomFieldDefn *poGeomFieldDefn = m_poFeatureDefn->myGetGeomFieldDefn(iGeomField); if (poGeomFieldDefn->m_bCachedExtentIsValid) @@ -1347,7 +1327,7 @@ OGRErr OGRSQLiteTableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, if (sqlite3_get_table(m_poDS->GetDB(), pszSQL, &papszResult, &nRowCount, &nColCount, &pszErrMsg) != SQLITE_OK) - return OGRSQLiteLayer::GetExtent(psExtent, bForce); + return OGRSQLiteLayer::IGetExtent(iGeomField, psExtent, bForce); OGRErr eErr = OGRERR_FAILURE; @@ -1376,11 +1356,7 @@ OGRErr OGRSQLiteTableLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, return eErr; } - OGRErr eErr; - if (iGeomField == 0) - eErr = OGRSQLiteLayer::GetExtent(psExtent, bForce); - else - eErr = OGRSQLiteLayer::GetExtent(iGeomField, psExtent, bForce); + OGRErr eErr = OGRSQLiteLayer::IGetExtent(iGeomField, psExtent, bForce); if (eErr == OGRERR_NONE && m_poFilterGeom == nullptr && m_osQuery.empty()) { poGeomFieldDefn->m_bCachedExtentIsValid = true; diff --git a/ogr/ogrsf_frmts/sxf/ogr_sxf.h b/ogr/ogrsf_frmts/sxf/ogr_sxf.h index 1edfa834a3ea..a3b5dbaa02cc 100644 --- a/ogr/ogrsf_frmts/sxf/ogr_sxf.h +++ b/ogr/ogrsf_frmts/sxf/ogr_sxf.h @@ -80,13 +80,8 @@ class OGRSXFLayer final : public OGRLayer virtual int TestCapability(const char *) override; virtual GIntBig GetFeatureCount(int bForce = TRUE) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual OGRSpatialReference *GetSpatialRef() override; virtual const char *GetFIDColumn() override; diff --git a/ogr/ogrsf_frmts/sxf/ogrsxflayer.cpp b/ogr/ogrsf_frmts/sxf/ogrsxflayer.cpp index a76c38a1cf33..a23185da3d55 100644 --- a/ogr/ogrsf_frmts/sxf/ogrsxflayer.cpp +++ b/ogr/ogrsf_frmts/sxf/ogrsxflayer.cpp @@ -303,14 +303,15 @@ OGRSpatialReference *OGRSXFLayer::GetSpatialRef() } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRSXFLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRSXFLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (bForce) { - return OGRLayer::GetExtent(psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } else { diff --git a/ogr/ogrsf_frmts/vrt/ogr_vrt.h b/ogr/ogrsf_frmts/vrt/ogr_vrt.h index fbeb44394a6a..636168adb036 100644 --- a/ogr/ogrsf_frmts/vrt/ogr_vrt.h +++ b/ogr/ogrsf_frmts/vrt/ogr_vrt.h @@ -164,9 +164,8 @@ class OGRVRTLayer final : public OGRLayer virtual int TestCapability(const char *) override; - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce = TRUE) override; + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce = TRUE) override; virtual void SetSpatialFilter(OGRGeometry *poGeomIn) override; virtual void SetSpatialFilter(int iGeomField, diff --git a/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp b/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp index af258e0943ea..41f76e74bb3d 100644 --- a/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp +++ b/ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp @@ -2149,19 +2149,12 @@ int OGRVRTLayer::TestCapability(const char *pszCap) } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRVRTLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRVRTLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { - return GetExtent(0, psExtent, bForce); -} - -OGRErr OGRVRTLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) -{ - if (iGeomField < 0 || iGeomField >= GetLayerDefn()->GetGeomFieldCount()) - return OGRERR_FAILURE; - if (static_cast(iGeomField) >= apoGeomFieldProps.size()) return OGRERR_FAILURE; @@ -2198,7 +2191,7 @@ OGRErr OGRVRTLayer::GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) return eErr; } - return OGRLayer::GetExtentInternal(iGeomField, psExtent, bForce); + return OGRLayer::IGetExtent(iGeomField, psExtent, bForce); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/wfs/ogr_wfs.h b/ogr/ogrsf_frmts/wfs/ogr_wfs.h index de9c4060d491..92174b012c51 100644 --- a/ogr/ogrsf_frmts/wfs/ogr_wfs.h +++ b/ogr/ogrsf_frmts/wfs/ogr_wfs.h @@ -158,13 +158,8 @@ class OGRWFSLayer final : public OGRLayer void SetExtents(double dfMinX, double dfMinY, double dfMaxX, double dfMaxY); void SetWGS84Extents(double dfMinX, double dfMinY, double dfMaxX, double dfMaxY); - virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override; - - virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, - int bForce) override - { - return OGRLayer::GetExtent(iGeomField, psExtent, bForce); - } + virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) override; virtual OGRErr ICreateFeature(OGRFeature *poFeature) override; virtual OGRErr ISetFeature(OGRFeature *poFeature) override; diff --git a/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp b/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp index 2770fbdfe166..6b8467ba69d3 100644 --- a/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp +++ b/ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp @@ -1754,7 +1754,7 @@ GIntBig OGRWFSLayer::GetFeatureCount(int bForce) if (CanRunGetFeatureCountAndGetExtentTogether()) { OGREnvelope sDummy; - GetExtent(&sDummy); + CPL_IGNORE_RET_VAL(GetExtent(&sDummy)); } if (nFeatures < 0) @@ -1790,10 +1790,11 @@ void OGRWFSLayer::SetWGS84Extents(double dfMinXIn, double dfMinYIn, } /************************************************************************/ -/* GetExtent() */ +/* IGetExtent() */ /************************************************************************/ -OGRErr OGRWFSLayer::GetExtent(OGREnvelope *psExtent, int bForce) +OGRErr OGRWFSLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent, + bool bForce) { if (m_oExtents.IsInit()) { @@ -1814,7 +1815,7 @@ OGRErr OGRWFSLayer::GetExtent(OGREnvelope *psExtent, int bForce) } if (TestCapability(OLCFastGetExtent)) - return poBaseLayer->GetExtent(psExtent, bForce); + return poBaseLayer->GetExtent(iGeomField, psExtent, bForce); /* In some cases, we can evaluate the result of GetFeatureCount() */ /* and GetExtent() with the same data */ @@ -1824,7 +1825,7 @@ OGRErr OGRWFSLayer::GetExtent(OGREnvelope *psExtent, int bForce) nFeatures = 0; } - OGRErr eErr = OGRLayer::GetExtent(psExtent, bForce); + OGRErr eErr = OGRLayer::IGetExtent(iGeomField, psExtent, bForce); if (bCountFeaturesInGetNextFeature) { From 75c03826feb5825bca982b1c188559dea34fd271 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 6 Feb 2025 20:13:44 +0100 Subject: [PATCH 2/2] RFC 107: make OGRLayer::SetSpatialFilter[Rect]() non-virtual and add virtual ISetSpatialFilter() --- MIGRATION_GUIDE.TXT | 6 + apps/ogr2ogr_lib.cpp | 22 +- autotest/ogr/ogr_geojson.py | 3 +- autotest/ogr/ogr_oapif.py | 121 +++--- autotest/ogr/ogr_sql_sqlite.py | 4 +- autotest/ogr/ogr_vrt.py | 4 +- frmts/eeda/eedadataset.cpp | 15 +- frmts/mbtiles/mbtilesdataset.cpp | 129 +++---- frmts/ogcapi/gdalogcapidataset.cpp | 92 ++--- gcore/gdalpythondriverloader.cpp | 20 +- gnm/gnm.h | 11 +- gnm/gnmlayer.cpp | 23 +- ogr/ogrsf_frmts/adbc/ogr_adbc.h | 8 +- ogr/ogrsf_frmts/adbc/ogradbclayer.cpp | 9 +- ogr/ogrsf_frmts/amigocloud/ogr_amigocloud.h | 8 +- .../amigocloud/ogramigocloudtablelayer.cpp | 17 +- ogr/ogrsf_frmts/arrow_common/ogr_arrow.h | 8 +- .../arrow_common/ograrrowlayer.hpp | 10 +- ogr/ogrsf_frmts/carto/ogr_carto.h | 7 +- ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp | 17 +- ogr/ogrsf_frmts/csw/ogrcswdataset.cpp | 22 +- ogr/ogrsf_frmts/dgn/ogr_dgn.h | 8 +- ogr/ogrsf_frmts/dgn/ogrdgnlayer.cpp | 7 +- ogr/ogrsf_frmts/elastic/ogr_elastic.h | 11 +- .../elastic/ogrelasticaggregationlayer.cpp | 15 +- ogr/ogrsf_frmts/elastic/ogrelasticlayer.cpp | 23 +- ogr/ogrsf_frmts/filegdb/FGdbLayer.cpp | 6 +- ogr/ogrsf_frmts/filegdb/ogr_fgdb.h | 8 +- ogr/ogrsf_frmts/generic/ogr_gensql.cpp | 11 +- ogr/ogrsf_frmts/generic/ogr_gensql.h | 8 +- ogr/ogrsf_frmts/generic/ogreditablelayer.cpp | 53 +-- ogr/ogrsf_frmts/generic/ogreditablelayer.h | 9 +- ogr/ogrsf_frmts/generic/ogrlayer.cpp | 349 ++++++++++++++++-- ogr/ogrsf_frmts/generic/ogrlayerdecorator.cpp | 32 +- ogr/ogrsf_frmts/generic/ogrlayerdecorator.h | 9 +- ogr/ogrsf_frmts/generic/ogrlayerpool.cpp | 20 +- ogr/ogrsf_frmts/generic/ogrlayerpool.h | 4 +- ogr/ogrsf_frmts/generic/ogrmutexedlayer.cpp | 27 +- ogr/ogrsf_frmts/generic/ogrmutexedlayer.h | 9 +- ogr/ogrsf_frmts/generic/ogrunionlayer.cpp | 26 +- ogr/ogrsf_frmts/generic/ogrunionlayer.h | 4 +- ogr/ogrsf_frmts/generic/ogrwarpedlayer.cpp | 54 +-- ogr/ogrsf_frmts/generic/ogrwarpedlayer.h | 9 +- ogr/ogrsf_frmts/gpkg/ogr_geopackage.h | 16 +- .../gpkg/ogrgeopackageselectlayer.cpp | 8 +- .../gpkg/ogrgeopackagetablelayer.cpp | 6 +- ogr/ogrsf_frmts/hana/ogr_hana.h | 8 +- ogr/ogrsf_frmts/hana/ogrhanalayer.cpp | 16 +- ogr/ogrsf_frmts/mitab/mitab.h | 8 +- ogr/ogrsf_frmts/mitab/mitab_tabseamless.cpp | 5 +- .../mongodbv3/ogrmongodbv3driver.cpp | 27 +- ogr/ogrsf_frmts/mvt/ogrmvtdataset.cpp | 17 +- ogr/ogrsf_frmts/mysql/ogr_mysql.h | 8 +- ogr/ogrsf_frmts/mysql/ogrmysqltablelayer.cpp | 16 +- ogr/ogrsf_frmts/ngw/ogr_ngw.h | 4 +- ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp | 14 +- ogr/ogrsf_frmts/ntf/ntf.h | 14 - ogr/ogrsf_frmts/ntf/ntf_raster.cpp | 17 - .../ntf/ogrntffeatureclasslayer.cpp | 17 - ogr/ogrsf_frmts/oapif/ogroapifdriver.cpp | 13 +- ogr/ogrsf_frmts/oci/ogr_oci.h | 17 +- ogr/ogrsf_frmts/oci/ogrocitablelayer.cpp | 7 +- ogr/ogrsf_frmts/ogdi/ogrogdi.h | 10 +- ogr/ogrsf_frmts/ogdi/ogrogdilayer.cpp | 16 +- ogr/ogrsf_frmts/ogrsf_frmts.dox | 282 -------------- ogr/ogrsf_frmts/ogrsf_frmts.h | 20 +- ogr/ogrsf_frmts/openfilegdb/ogr_openfilegdb.h | 8 +- .../openfilegdb/ogropenfilegdblayer.cpp | 13 +- ogr/ogrsf_frmts/parquet/ogr_parquet.h | 8 +- .../parquet/ogrparquetdatasetlayer.cpp | 10 +- ogr/ogrsf_frmts/pg/ogr_pg.h | 16 +- ogr/ogrsf_frmts/pg/ogrpgresultlayer.cpp | 17 +- ogr/ogrsf_frmts/pg/ogrpgtablelayer.cpp | 17 +- ogr/ogrsf_frmts/plscenes/ogr_plscenes.h | 8 +- .../plscenes/ogrplscenesdatav1layer.cpp | 7 +- ogr/ogrsf_frmts/pmtiles/ogr_pmtiles.h | 8 +- .../pmtiles/ogrpmtilesvectorlayer.cpp | 8 +- ogr/ogrsf_frmts/shape/ogrshape.h | 7 +- ogr/ogrsf_frmts/shape/ogrshapelayer.cpp | 7 +- ogr/ogrsf_frmts/sqlite/ogr_sqlite.h | 22 +- ogr/ogrsf_frmts/sqlite/ogrsqlitebase.h | 4 +- .../sqlite/ogrsqliteselectlayer.cpp | 22 +- .../sqlite/ogrsqlitetablelayer.cpp | 29 +- ogr/ogrsf_frmts/sqlite/ogrsqliteviewlayer.cpp | 5 +- ogr/ogrsf_frmts/vrt/ogr_vrt.h | 5 +- ogr/ogrsf_frmts/vrt/ogrvrtlayer.cpp | 26 +- ogr/ogrsf_frmts/wfs/ogr_wfs.h | 16 +- ogr/ogrsf_frmts/wfs/ogrwfsjoinlayer.cpp | 8 +- ogr/ogrsf_frmts/wfs/ogrwfslayer.cpp | 7 +- 89 files changed, 844 insertions(+), 1258 deletions(-) diff --git a/MIGRATION_GUIDE.TXT b/MIGRATION_GUIDE.TXT index 4773e97f7e24..99e83702c436 100644 --- a/MIGRATION_GUIDE.TXT +++ b/MIGRATION_GUIDE.TXT @@ -14,6 +14,12 @@ MIGRATION GUIDE FROM GDAL 3.10 to GDAL 3.11 bool bForce) protected virtual method. The public 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 now return + OGRErr instead of void, `and accept a ``const OGRGeometry*``). Drivers may implement + the new ISetSpatialFilter(int iGeomField, const OGRGeometry*) protected virtual method. + The public 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 8287d1e6d2ef..710fa74f0395 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 c88b04b84894..707063ab9493 100644 --- a/frmts/ogcapi/gdalogcapidataset.cpp +++ b/frmts/ogcapi/gdalogcapidataset.cpp @@ -300,12 +300,8 @@ class OGCAPITiledLayer 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; 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 3b095c521cd0..202c5856c3e4 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayerpool.cpp +++ b/ogr/ogrsf_frmts/generic/ogrlayerpool.cpp @@ -242,25 +242,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 8ed14c0511af..5a24693a42aa 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayerpool.h +++ b/ogr/ogrsf_frmts/generic/ogrlayerpool.h @@ -113,8 +113,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..e4d110949d22 100644 --- a/ogr/ogrsf_frmts/mysql/ogr_mysql.h +++ b/ogr/ogrsf_frmts/mysql/ogr_mysql.h @@ -172,12 +172,8 @@ 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 ed32a8f8c5b4..1ce7c259fc6c 100644 --- a/ogr/ogrsf_frmts/ngw/ogr_ngw.h +++ b/ogr/ogrsf_frmts/ngw/ogr_ngw.h @@ -225,8 +225,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 bb8080288a7c..8d8d287911f3 100644 --- a/ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp +++ b/ogr/ogrsf_frmts/ngw/ogrngwlayer.cpp @@ -1781,11 +1781,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) { @@ -1830,14 +1830,8 @@ void OGRNGWLayer::SetSpatialFilter(OGRGeometry *poGeom) } 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; } /************************************************************************/