From e9fc22e72c37df35e4271b9e12d89ca1ec7f6cfe Mon Sep 17 00:00:00 2001 From: Just van den Broecke Date: Tue, 21 May 2019 17:34:54 +0200 Subject: [PATCH] Issue #127 ogrpaging for all OGR source types (#128) * #127 Paging for ALL OGR Drivers, tested: GPKG, Shapefile, SQLite, GeoJSON * #127 Paging for ALL OGR Drivers, tested: GPKG, Shapefile, SQLite, GeoJSON fix SQLite Test * #127 Paging for ALL OGR Drivers require GDAL greater or eq 2.2 * geopython/pygeoapi#112 geopython/pygeoapi#127 close OGR ResultSet when layer from ExecuteSQL created * geopython/pygeoapi#112 geopython/pygeoapi#127 grr flake8 fix --- pygeoapi-config.yml | 41 ++++++ pygeoapi/provider/ogr.py | 182 +++++++++++++++++++------ requirements-dev.txt | 2 +- tests/data/dutch_addresses_4326.sqlite | Bin 0 -> 241664 bytes tests/test_ogr_gpkg_provider.py | 88 +++++++++++- tests/test_ogr_shapefile_provider.py | 88 +++++++++++- tests/test_ogr_sqlite_provider.py | 156 +++++++++++++++++++++ 7 files changed, 512 insertions(+), 45 deletions(-) create mode 100644 tests/data/dutch_addresses_4326.sqlite create mode 100644 tests/test_ogr_sqlite_provider.py diff --git a/pygeoapi-config.yml b/pygeoapi-config.yml index a2be7fc..3cf6770 100644 --- a/pygeoapi-config.yml +++ b/pygeoapi-config.yml @@ -273,6 +273,47 @@ datasets: id_field: gml_id layer: rdinfo:stations + ogr_addresses_sqlite: + # Gotcha: don't use the name 'ogc_fid' as id-field in your SQLite tables: + # OGR will not show this field within GeoJSON properties dict. + title: Dutch addresses (subset Otterlo). OGR SQLite Driver + description: Dutch addresses subset. + keywords: + - Netherlands + - addresses + - INSPIRE + crs: + - CRS84 + links: + - type: text/html + rel: canonical + title: information + href: http://www.nationaalgeoregister.nl/geonetwork/srv/dut/catalog.search#/metadata/4074b3c3-ca85-45ad-bc0d-b5fca8540z0b + hreflang: nl-NL + extents: + spatial: + bbox: [50.7539, 7.21097, 53.4658, 3.37087] + temporal: + begin: None + end: now # or empty + provider: + name: OGR + data: + source_type: SQLite + source: tests/data/dutch_addresses_4326.sqlite + source_srs: EPSG:4326 + target_srs: EPSG:4326 + source_capabilities: + paging: True + + gdal_ogr_options: + EMPTY_AS_NULL: NO + GDAL_CACHEMAX: 64 + CPL_DEBUG: NO + + id_field: id + layer: ogrgeojson + processes: hello-world: processor: diff --git a/pygeoapi/provider/ogr.py b/pygeoapi/provider/ogr.py index 2ca5b5b..a455398 100644 --- a/pygeoapi/provider/ogr.py +++ b/pygeoapi/provider/ogr.py @@ -40,14 +40,25 @@ LOGGER = logging.getLogger(__name__) class OGRProvider(BaseProvider): - """OGR Provider""" + """ + OGR Provider. Uses GDAL/OGR Python-bindings to access OGR + Vector sources. References: + https://pcjericks.github.io/py-gdalogr-cookbook/ + https://www.gdal.org/ogr_formats.html (per-driver specifics). + + In theory any OGR source type (Driver) could be used, although + some Source Types are Driver-specific handling. This is handled + in Source Helper classes, instantiated per Source-Type. + + The following Source Types have been tested to work: + GeoPackage (GPKG), SQLite, GeoJSON, ESRI Shapefile, WFS v2. + """ # To deal with some OGR Source-Driver specifics. SOURCE_HELPERS = { - 'WFS': 'pygeoapi.provider.ogr.WFSHelper', - 'ESRI Shapefile': 'pygeoapi.provider.ogr.ShapefileHelper', 'ESRIJSON': 'pygeoapi.provider.ogr.ESRIJSONHelper', - 'GPKG': 'pygeoapi.provider.ogr.GPKGHelper' + 'WFS': 'pygeoapi.provider.ogr.WFSHelper', + '*': 'pygeoapi.provider.ogr.CommonSourceHelper' } def __init__(self, provider_def): @@ -152,10 +163,16 @@ class OGRProvider(BaseProvider): self._load_source_helper(self.data_def['source_type']) - # Init + # Layer name is required + self.layer_name = provider_def.get('layer', None) + if not self.layer_name: + msg = 'Need explicit \'layer\' attr in provider config' + LOGGER.error(msg) + raise Exception(msg) + + # Init driver and Source connection self.driver = None self.conn = None - self.layer_name = provider_def.get('layer', None) def _open(self): source_type = self.data_def['source_type'] @@ -176,6 +193,7 @@ class OGRProvider(BaseProvider): self.source_helper.disable_paging() def _close(self): + self.source_helper.close() self.conn = None LOGGER.debug('closed self.conn') @@ -185,18 +203,8 @@ class OGRProvider(BaseProvider): if not self.conn: self._open() - if not self.layer_name: - # E.g. Shapefiles may not have explicitly named Layers - layer = self.conn.GetLayer(0) - else: - layer = self.conn.GetLayerByName(self.layer_name) - - if not layer: - msg = 'Cannot get Layer {} from OGR Source'.format(self.layer_name) - LOGGER.error(msg) - raise Exception(msg) - - return layer + # Delegate getting Layer to SourceHelper + return self.source_helper.get_layer() def get_fields(self): """ @@ -265,6 +273,8 @@ class OGRProvider(BaseProvider): # layer.SetSpatialFilterRect( # float(minx), float(miny), float(maxx), float(maxy)) + + # Make response based on resulttype specified if resulttype == 'hits': LOGGER.debug('hits only specified') result = self._response_feature_hits(layer) @@ -319,14 +329,12 @@ class OGRProvider(BaseProvider): :returns: Source Helper object """ - + helper_type = source_type if source_type not in OGRProvider.SOURCE_HELPERS.keys(): - msg = 'No Helper found for OGR Source type: {}'.format(source_type) - LOGGER.exception(msg) - raise InvalidHelperError(msg) + helper_type = '*' # Create object from full package.class name string. - source_helper_class = OGRProvider.SOURCE_HELPERS[source_type] + source_helper_class = OGRProvider.SOURCE_HELPERS[helper_type] packagename, classname = source_helper_class.rsplit('.', 1) module = importlib.import_module(packagename) @@ -340,7 +348,11 @@ class OGRProvider(BaseProvider): geom.Transform(self.transform_out) json_feature = ogr_feature.ExportToJson(as_object=True) - json_feature['id'] = json_feature['properties'].pop(self.id_field) + try: + json_feature['id'] = json_feature['properties'].pop(self.id_field) + except Exception: + json_feature['id'] = ogr_feature.GetFID() + return json_feature def _response_feature_collection(self, layer, limit): @@ -397,9 +409,15 @@ class InvalidHelperError(Exception): class SourceHelper: + """ + Helper classes for OGR-specific Source Types (Drivers). + For some actions Driver-specific settings or processing is + required. This is delegated to the OGR SourceHelper classes. + """ + def __init__(self, provider): """ - Initialize object + Initialize object with related OGRProvider object. :param provider: provider instance @@ -407,6 +425,31 @@ class SourceHelper: """ self.provider = provider + def close(self): + """ + OGR Driver-specific handling of closing dataset. + Default is no specific handling. + + """ + + pass + + def get_layer(self): + """ + Default action to get a Layer object from opened OGR Driver. + :return: + """ + + layer = self.provider.conn.GetLayerByName(self.provider.layer_name) + + if not layer: + msg = 'Cannot get Layer {} from OGR Source'.\ + format(self.provider.layer_name) + LOGGER.error(msg) + raise Exception(msg) + + return layer + def enable_paging(self, startindex=-1, limit=-1): """ Enable paged access to dataset (OGR Driver-specific) @@ -423,8 +466,11 @@ class SourceHelper: pass -class GPKGHelper(SourceHelper): - +class CommonSourceHelper(SourceHelper): + """ + SourceHelper for most common OGR Source types: + Shapefile, GeoPackage, SQLite, GeoJSON etc. + """ def __init__(self, provider): """ Initialize object @@ -433,22 +479,80 @@ class GPKGHelper(SourceHelper): :returns: pygeoapi.providers.ogr.SourceHelper """ - self.provider = provider SourceHelper.__init__(self, provider) + self.startindex = -1 + self.limit = -1 + self.result_set = None - -class ShapefileHelper(SourceHelper): - - def __init__(self, provider): + def close(self): """ - Initialize object + OGR Driver-specific handling of closing dataset. + If ExecuteSQL has been (successfully) called + must close ResultSet explicitly. + https://gis.stackexchange.com/questions/114112/ + explicitly-close-a-ogr-result-object-from-a-call-to-executesql - :param provider: provider instance - - :returns: pygeoapi.providers.ogr.SourceHelper """ - self.provider = provider - SourceHelper.__init__(self, provider) + + if not self.result_set: + return + + try: + self.provider.conn.ReleaseResultSet(self.result_set) + except Exception as err: + msg = 'ReleaseResultSet exception for Layer {}'.format( + self.provider.layer_name) + LOGGER.error(msg, err) + finally: + self.result_set = None + + def enable_paging(self, startindex=-1, limit=-1): + """ + Enable paged access to dataset (OGR Driver-specific) + using OGR SQL https://www.gdal.org/ogr_sql.html + e.g. SELECT * FROM poly LIMIT 10 OFFSET 30 + + """ + self.startindex = startindex + self.limit = limit + + def disable_paging(self): + """ + Disable paged access to dataset (OGR Driver-specific) + """ + + pass + + def get_layer(self): + """ + Gets OGR Layer from opened OGR dataset. + When startindex defined 1 or greater will invoke + OGR SQL SELECT with LIMIT and OFFSET and return + as Layer as ResultSet from ExecuteSQL on dataset. + :return: OGR layer object + """ + if self.startindex <= 0: + return SourceHelper.get_layer(self) + + self.close() + + sql = "SELECT * FROM {ds_name} LIMIT {limit} OFFSET {offset}".format( + ds_name=self.provider.layer_name, + limit=self.limit, + offset=self.startindex) + self.result_set = self.provider.conn.ExecuteSQL(sql) + + # Reset since needs to be set each time explicitly + self.startindex = -1 + self.limit = -1 + + if not self.result_set: + msg = 'Cannot get Layer {} via ExecuteSQL'.format( + self.provider.layer_name) + LOGGER.error(msg) + raise Exception(msg) + + return self.result_set class ESRIJSONHelper(SourceHelper): @@ -461,7 +565,6 @@ class ESRIJSONHelper(SourceHelper): :returns: pygeoapi.providers.ogr.SourceHelper """ - self.provider = provider SourceHelper.__init__(self, provider) def enable_paging(self, startindex=-1, limit=-1): @@ -501,7 +604,6 @@ class WFSHelper(SourceHelper): :returns: pygeoapi.providers.ogr.SourceHelper """ - self.provider = provider SourceHelper.__init__(self, provider) def enable_paging(self, startindex=-1, limit=-1): diff --git a/requirements-dev.txt b/requirements-dev.txt index 5362e39..6cf629e 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -15,4 +15,4 @@ pytest-env pyOpenSSL==17.5.0 ndg-httpsclient==0.4.4 pyasn1==0.4.2 -GDAL>=2.1 +GDAL>=2.2 diff --git a/tests/data/dutch_addresses_4326.sqlite b/tests/data/dutch_addresses_4326.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..a2a93402b680695806e7b6258bf6b27a32a4bbeb GIT binary patch literal 241664 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

CsTalTkQ*Z^^>1Pnst+P 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 literal 0 HcmV?d00001 diff --git a/tests/test_ogr_gpkg_provider.py b/tests/test_ogr_gpkg_provider.py index e26b710..c03191d 100644 --- a/tests/test_ogr_gpkg_provider.py +++ b/tests/test_ogr_gpkg_provider.py @@ -67,7 +67,8 @@ def config_gpkg_4326(): 'paging': True }, }, - 'id_field': 'id' + 'id_field': 'id', + 'layer': 'OGRGeoJSON' } @@ -86,7 +87,8 @@ def config_gpkg_28992(): 'paging': True }, }, - 'id_field': 'id' + 'id_field': 'id', + 'layer': 'OGRGeoJSON' } @@ -249,3 +251,85 @@ def test_query_with_limit_4326(config_gpkg_4326): assert properties is not None geometry = feature.get('geometry', None) assert geometry is not None + + +def test_query_with_startindex_28992(config_gpkg_28992): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_gpkg_28992) + feature_collection = p.query(startindex=20, limit=5, resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 5 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + assert feature['id'] == 'inspireadressen.1744969' + assert 'Egypte' in properties['straatnaam'] + geometry = feature.get('geometry', None) + assert geometry is not None + + +def test_query_with_startindex_4326(config_gpkg_4326): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_gpkg_4326) + feature_collection = p.query(startindex=20, limit=5, resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 5 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + assert feature['id'] == 'inspireadressen.1744969' + assert 'Egypte' in properties['straatnaam'] + geometry = feature.get('geometry', None) + assert geometry is not None + + +def test_query_bbox_with_startindex_28992(config_gpkg_28992): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_gpkg_28992) + feature_collection = p.query( + startindex=10, limit=5, + bbox=(5.742, 52.053, 5.773, 52.098), + resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 5 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + geometry = feature.get('geometry', None) + assert geometry is not None + assert properties['straatnaam'] == 'Buurtweg' + assert properties['huisnummer'] == '4' + + +def test_query_bbox_with_startindex_4326(config_gpkg_4326): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_gpkg_4326) + feature_collection = p.query( + startindex=1, limit=5, + bbox=(5.742, 52.053, 5.773, 52.098), + resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 5 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + geometry = feature.get('geometry', None) + assert geometry is not None + assert properties['straatnaam'] == 'Egypte' + assert properties['huisnummer'] == '6' diff --git a/tests/test_ogr_shapefile_provider.py b/tests/test_ogr_shapefile_provider.py index 50cb7af..90793e6 100644 --- a/tests/test_ogr_shapefile_provider.py +++ b/tests/test_ogr_shapefile_provider.py @@ -25,7 +25,8 @@ def config_shapefile_4326(): 'paging': True }, }, - 'id_field': 'id' + 'id_field': 'id', + 'layer': 'inspireadressen' } @@ -44,7 +45,8 @@ def config_shapefile_28992(): 'paging': True }, }, - 'id_field': 'id' + 'id_field': 'id', + 'layer': 'inspireadressen' } @@ -207,3 +209,85 @@ def test_query_with_limit_4326(config_shapefile_4326): assert properties is not None geometry = feature.get('geometry', None) assert geometry is not None + + +def test_query_with_startindex_28992(config_shapefile_28992): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_shapefile_28992) + feature_collection = p.query(startindex=20, limit=5, resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 5 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + assert feature['id'] == 'inspireadressen.1744969' + assert 'Egypte' in properties['straatnaam'] + geometry = feature.get('geometry', None) + assert geometry is not None + + +def test_query_with_startindex_4326(config_shapefile_4326): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_shapefile_4326) + feature_collection = p.query(startindex=20, limit=5, resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 5 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + assert feature['id'] == 'inspireadressen.1744969' + assert 'Egypte' in properties['straatnaam'] + geometry = feature.get('geometry', None) + assert geometry is not None + + +def test_query_bbox_with_startindex_28992(config_shapefile_28992): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_shapefile_28992) + feature_collection = p.query( + startindex=10, limit=5, + bbox=(5.742, 52.053, 5.773, 52.098), + resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 5 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + geometry = feature.get('geometry', None) + assert geometry is not None + assert properties['straatnaam'] == 'Buurtweg' + assert properties['huisnummer'] == '4' + + +def test_query_bbox_with_startindex_4326(config_shapefile_4326): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_shapefile_4326) + feature_collection = p.query( + startindex=1, limit=5, + bbox=(5.742, 52.053, 5.773, 52.098), + resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 5 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + geometry = feature.get('geometry', None) + assert geometry is not None + assert properties['straatnaam'] == 'Egypte' + assert properties['huisnummer'] == '6' diff --git a/tests/test_ogr_sqlite_provider.py b/tests/test_ogr_sqlite_provider.py new file mode 100644 index 0000000..00570b3 --- /dev/null +++ b/tests/test_ogr_sqlite_provider.py @@ -0,0 +1,156 @@ +# Needs to be run like: python3 -m pytest + +import logging + +import pytest + +from pygeoapi.provider.ogr import OGRProvider + +LOGGER = logging.getLogger(__name__) + + +# Testing with SQLite files with identical features +# (all 2481 addresses in Otterlo Netherlands). + +@pytest.fixture() +def config_sqlite_4326(): + return { + 'name': 'OGR', + 'data': { + 'source_type': 'SQLite', + 'source': + './tests/data/dutch_addresses_4326.sqlite', + 'source_srs': 'EPSG:4326', + 'target_srs': 'EPSG:4326', + 'source_capabilities': { + 'paging': True + }, + }, + 'id_field': 'id', + 'layer': 'ogrgeojson' + } + + +def test_get_fields_4326(config_sqlite_4326): + """Testing field types""" + p = OGRProvider(config_sqlite_4326) + results = p.get_fields() + assert results['straatnaam'] == 'string' + assert results['huisnummer'] == 'string' + + +def test_get_4326(config_sqlite_4326): + """Testing query for a specific object""" + p = OGRProvider(config_sqlite_4326) + result = p.get('inspireadressen.1747652') + assert result['id'] == 'inspireadressen.1747652' + assert 'Mosselsepad' in result['properties']['straatnaam'] + + +def test_query_hits_4326(config_sqlite_4326): + """Testing query on entire collection for hits""" + + p = OGRProvider(config_sqlite_4326) + feature_collection = p.query(resulttype='hits') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) is 0 + hits = feature_collection.get('numberMatched', None) + assert hits is not None + assert hits == 2481 + + +def test_query_bbox_hits_4326(config_sqlite_4326): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_sqlite_4326) + # feature_collection = p.query( + # bbox=[120000, 480000, 124000, 487000], resulttype='hits') + feature_collection = p.query( + bbox=[5.763409, 52.060197, 5.769256, 52.061976], resulttype='hits') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) is 0 + hits = feature_collection.get('numberMatched', None) + assert hits is not None + print('hits={}'.format(hits)) + assert hits is 1 + + +def test_query_bbox_4326(config_sqlite_4326): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_sqlite_4326) + # feature_collection = p.query( + # bbox=[180800, 452500, 181200, 452700], resulttype='results') + feature_collection = p.query( + bbox=(5.763409, 52.060197, 5.769256, 52.061976), resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 1 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + geometry = feature.get('geometry', None) + assert geometry is not None + assert properties['straatnaam'] == 'Planken Wambuisweg' + + +def test_query_with_limit_4326(config_sqlite_4326): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_sqlite_4326) + feature_collection = p.query(limit=5, resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 5 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + geometry = feature.get('geometry', None) + assert geometry is not None + + +def test_query_with_startindex_4326(config_sqlite_4326): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_sqlite_4326) + feature_collection = p.query(startindex=20, limit=5, resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 5 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + assert feature['id'] == 'inspireadressen.1744969' + assert 'Egypte' in properties['straatnaam'] + geometry = feature.get('geometry', None) + assert geometry is not None + + +def test_query_bbox_with_startindex_4326(config_sqlite_4326): + """Testing query for a valid JSON object with geometry""" + + p = OGRProvider(config_sqlite_4326) + feature_collection = p.query( + startindex=1, limit=50, + bbox=(5.742, 52.053, 5.773, 52.098), + resulttype='results') + assert feature_collection.get('type', None) == 'FeatureCollection' + features = feature_collection.get('features', None) + assert len(features) == 3 + hits = feature_collection.get('numberMatched', None) + assert hits is None + feature = features[0] + properties = feature.get('properties', None) + assert properties is not None + geometry = feature.get('geometry', None) + assert geometry is not None + assert properties['straatnaam'] == 'Egypte' + assert properties['huisnummer'] == '4'