From 70804d22fa07c68bf1dd2a9be24185e93528e7bf Mon Sep 17 00:00:00 2001 From: Mathieu Tachon <92298764+MTachon@users.noreply.github.com> Date: Wed, 15 Feb 2023 01:29:09 +0100 Subject: [PATCH] =?UTF-8?q?feat(OGRProvider):=20allow=20to=20use=20'geom?= =?UTF-8?q?=5Ffield'=20in=20the=20config=20for=20OGR=20pr=E2=80=A6=20(#114?= =?UTF-8?q?1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(OGRProvider): allow to use 'geom_field' in the config for OGR provider * docs: show an example of using OGR for publishing data from a PostGIS database * fix: does not check for empty geometry in this PR * docs: add back ESRIJSON source_type --- docs/source/data-publishing/ogcapi-features.rst | 14 ++++++++++++++ pygeoapi/provider/ogr.py | 10 +++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/source/data-publishing/ogcapi-features.rst b/docs/source/data-publishing/ogcapi-features.rst index 08b0c70..58e62af 100644 --- a/docs/source/data-publishing/ogcapi-features.rst +++ b/docs/source/data-publishing/ogcapi-features.rst @@ -195,6 +195,20 @@ The OGR provider requires a recent (3+) version of GDAL to be installed. id_field: BGS_ID layer: ESRIJSON +.. code-block:: yaml + + providers: + - type: feature + name: OGR + data: + source_type: PostgreSQL + source: "PG: host=127.0.0.1 dbname=test user=postgres password=postgres" + source_srs: EPSG:4326 + target_srs: EPSG:4326 # Can be used to transform/reproject the data + id_field: osm_id + layer: osm.hotosm_bdi_waterways # Value follows a 'my_schema.my_table' structure + geom_field: foo_geom + MongoDB diff --git a/pygeoapi/provider/ogr.py b/pygeoapi/provider/ogr.py index 0745625..25f692a 100644 --- a/pygeoapi/provider/ogr.py +++ b/pygeoapi/provider/ogr.py @@ -32,6 +32,7 @@ import functools import importlib +import json import logging import os from typing import Any @@ -171,6 +172,8 @@ class OGRProvider(BaseProvider): self._load_source_helper(self.data_def['source_type']) + self.geom_field = provider_def.get('geom_field') + # ID field is required self.id_field = provider_def.get('id_field') if not self.id_field: @@ -461,7 +464,10 @@ class OGRProvider(BaseProvider): raise gdalerr def _ogr_feature_to_json(self, ogr_feature, skip_geometry=False): - geom = ogr_feature.GetGeometryRef() + if self.geom_field is not None: + geom = ogr_feature.GetGeomFieldRef(self.geom_field) + else: + geom = ogr_feature.GetGeometryRef() if self.transform_out: # Optionally reproject the geometry geom.Transform(self.transform_out) @@ -469,6 +475,8 @@ class OGRProvider(BaseProvider): json_feature = ogr_feature.ExportToJson(as_object=True) if skip_geometry: json_feature['geometry'] = None + else: + json_feature['geometry'] = json.loads(geom.ExportToJson()) try: json_feature['id'] = json_feature['properties'].pop( self.id_field, json_feature['id']