Skip to content

Commit ba62fe0

Browse files
committed
handle varied crs gef when generating GeoJSON geometry
1 parent af52f3e commit ba62fe0

4 files changed

Lines changed: 54 additions & 13 deletions

File tree

pygeometa/schemas/ogcapi_records/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
from pygeometa.core import get_charstring
5252
from pygeometa.helpers import generate_datetime, json_dumps
5353
from pygeometa.schemas.base import BaseOutputSchema
54-
from pygeometa.schemas.util import generate_geometry
54+
from pygeometa.schemas.util import generate_geojson_geometry
5555

5656
THISDIR = os.path.dirname(os.path.realpath(__file__))
5757

@@ -87,7 +87,7 @@ def write(self, mcf: dict, stringify: str = True) -> Union[dict, str]:
8787
self.lang1 = mcf['metadata'].get('language')
8888
self.lang2 = mcf['metadata'].get('language_alternate')
8989

90-
geometry = generate_geometry(
90+
geometry = generate_geojson_geometry(
9191
mcf['identification']['extents']['spatial'])
9292

9393
title = get_charstring(mcf['identification'].get('title'),

pygeometa/schemas/stac/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
from pygeometa.core import get_charstring
5050
from pygeometa.helpers import json_dumps
5151
from pygeometa.schemas.base import BaseOutputSchema
52-
from pygeometa.schemas.util import generate_geometry
52+
from pygeometa.schemas.util import generate_geojson_geometry
5353

5454
THISDIR = os.path.dirname(os.path.realpath(__file__))
5555

@@ -82,7 +82,7 @@ def write(self, mcf: dict, stringify: str = True) -> Union[dict, str]:
8282
lang1 = mcf['metadata'].get('language')
8383
lang2 = mcf['metadata'].get('language_alternate')
8484

85-
geometry = generate_geometry(
85+
geometry = generate_geojson_geometry(
8686
mcf['identification']['extents']['spatial'])
8787

8888
bbox = mcf['identification']['extents']['spatial'][0]['bbox']

pygeometa/schemas/util.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
LOGGER = logging.getLogger(__name__)
4949

5050

51-
def generate_geometry(spatial: list) -> dict:
51+
def generate_geojson_geometry(spatial: list) -> dict:
5252
"""
5353
Helper function to generate GeoJSON geometry from an
5454
MCF spatial extent
@@ -60,10 +60,15 @@ def generate_geometry(spatial: list) -> dict:
6060

6161
geometry = None
6262

63-
if len(spatial) == 1:
64-
LOGGER.debug('spatial extent is a default bbox')
63+
crs_list = [s.get('crs') for s in spatial]
64+
65+
if len(crs_list) == len(spatial):
66+
single_crs = len(set(crs_list)) == 1
67+
68+
if not single_crs:
69+
LOGGER.debug('spatial extent has multiple CRS; using first bbox')
6570
try:
66-
minx, miny, maxx, maxy = (spatial[0]['bbox'])
71+
minx, miny, maxx, maxy = spatial[0]['bbox']
6772
geometry = {
6873
'type': 'Polygon',
6974
'coordinates': [[
@@ -76,8 +81,8 @@ def generate_geometry(spatial: list) -> dict:
7681
}
7782
except TypeError:
7883
geometry = None
79-
elif len(spatial) > 1:
80-
LOGGER.debug('spatial extent is a multiple bbox')
84+
else:
85+
LOGGER.debug('spatial extent is a multiple bbox with same CRS')
8186
bboxes = []
8287
for s in spatial:
8388
try:
@@ -96,8 +101,5 @@ def generate_geometry(spatial: list) -> dict:
96101
'type': 'MultiPolygon',
97102
'coordinates': bboxes
98103
}
99-
else:
100-
LOGGER.debug('Invalid spatial extent')
101-
geometry = None
102104

103105
return geometry

tests/run_tests.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
from pygeometa.schemas.iso19139 import ISO19139OutputSchema
6666
from pygeometa.schemas.ogcapi_records import OGCAPIRecordOutputSchema
6767
from pygeometa.schemas.schema_org import _get_box_from_coords
68+
from pygeometa.schemas.util import generate_geojson_geometry
6869

6970
from sample_schema import SampleOutputSchema
7071

@@ -569,6 +570,44 @@ def test_generate_datetime(self):
569570
self.assertEqual(len(generate_datetime(None)), 20)
570571
self.assertEqual(len(generate_datetime('None')), 20)
571572

573+
def test_get_geojson_geometry(self):
574+
"""Test pygeometa.schemas.util.get_geojson_geometry"""
575+
576+
spatials = [{
577+
'def': [{
578+
'bbox': [164.1, -53.8, 180, -27.8],
579+
'crs': 4326
580+
}, {
581+
'bbox': [-180, -53.8, -174.1, -27.8],
582+
'crs': 4326
583+
}],
584+
'type': 'MultiPolygon'
585+
}, {
586+
'def': [{
587+
'bbox': [-152, 42, -52, 84],
588+
'crs': 4326
589+
}, {
590+
'bbox': [-180, -53.8, -174.1, -27.8],
591+
'crs': 4269
592+
}],
593+
'type': 'Polygon'
594+
}, {
595+
'def': [{
596+
'bbox': [-180, 28.896, 180, 90],
597+
'crs': 4326
598+
}, {
599+
'bbox': [-2500.000, -2500.000, 8847500.000, 8047500.000],
600+
'proj4': '+proj=stere +lat_0=90 +lon_0=-100 +k=0.93301243 +x_0=4245000 +y_0=5295000 +R=6371229 +units=m +no_defs', # noqa
601+
}],
602+
'type': 'Polygon'
603+
}]
604+
605+
for spatial in spatials:
606+
geometry = generate_geojson_geometry(spatial['def'])
607+
print(json.dumps(geometry, indent=4))
608+
self.assertEqual(geometry['type'], spatial['type'],
609+
f"Expected geometry type {spatial['type']}")
610+
572611

573612
def get_abspath(filepath):
574613
"""helper function absolute file access"""

0 commit comments

Comments
 (0)