From e487aa261210dfd2f6aec9b968f6a0e8f73a0c87 Mon Sep 17 00:00:00 2001 From: Benjamin Webb Date: Wed, 17 Jun 2026 13:45:43 -0600 Subject: [PATCH 1/5] Migrate get_parameters to base_edr --- pygeoapi/api/collection.py | 32 +--------------------- pygeoapi/provider/base_edr.py | 50 +++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 31 deletions(-) diff --git a/pygeoapi/api/collection.py b/pygeoapi/api/collection.py index cfcfcfc0f..3b1f24922 100644 --- a/pygeoapi/api/collection.py +++ b/pygeoapi/api/collection.py @@ -400,37 +400,7 @@ def gen_collection(api, request, dataset: str, # TODO: translate LOGGER.debug('Adding EDR links') data['data_queries'] = {} - parameters = p.get_fields() - if parameters: - data['parameter_names'] = {} - for key, value in parameters.items(): - p_label = value.get('title') - p_description = value.get('description') - data['parameter_names'][key] = { - 'id': key, - 'type': 'Parameter', - 'observedProperty': { - 'label': { - 'en': p_label - } - }, - 'unit': { - 'label': { - 'en': value['title'] - }, - 'symbol': { - 'value': value['x-ogc-unit'], - 'type': 'http://www.opengis.net/def/uom/UCUM/' - } - } - } - - if p_description is not None: - data['parameter_names'][key]['observedProperty'].update({ - 'description': { - 'en': p_description - } - }) + data['parameter_names'] = p.get_parameters() for qt in p.get_query_types(): data_query = { diff --git a/pygeoapi/provider/base_edr.py b/pygeoapi/provider/base_edr.py index 08c30df9b..bb07b8cfb 100644 --- a/pygeoapi/provider/base_edr.py +++ b/pygeoapi/provider/base_edr.py @@ -105,6 +105,56 @@ def get_query_types(self): return self.query_types + def get_parameters( + self, parameters: set | list = [], as_list=False + ) -> dict | list: + """ + Generate CoverageJSON parameters from provider field defintions + + :param parameters: List of the subset of parameters include. + :param as_list: bool to return as a list of parameter definitions. + + :returns: A dictionary or list containing the parameter definition. + """ + if not parameters: + parameters = set(self.fields.keys()) + + out_params = {} + for name in set(parameters): + conf_ = self.fields[name] + p_label = conf_.get('title') + out_params[name] = { + 'id': name, + 'type': 'Parameter', + 'name': p_label, + 'observedProperty': { + 'id': name, + 'label': {'en': p_label} + }, + 'unit': { + 'symbol': { + 'value': conf_['x-ogc-unit'], + 'type': 'http://www.opengis.net/def/uom/UCUM/' + } + } + } + + # Add description if available + p_description = conf_.get('description') + if p_description is not None: + out_params[name]['observedProperty'].update({ + 'description': { + 'en': p_description + } + }) + + if as_list: + # GeoJSON Parameters are a list + # https://github.com/opengeospatial/ogcapi-environmental-data-retrieval/issues/633 + return list(out_params.values()) + else: + return out_params + def query(self, **kwargs): """ Extract data from collection collection From b2855e73a48f9ba00e01f526e8f02c82b862eb42 Mon Sep 17 00:00:00 2001 From: Benjamin Webb Date: Sat, 20 Jun 2026 14:47:13 -0600 Subject: [PATCH 2/5] Use get_parameters in xarray --- pygeoapi/provider/xarray_.py | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/pygeoapi/provider/xarray_.py b/pygeoapi/provider/xarray_.py index 36353243a..cdde62954 100644 --- a/pygeoapi/provider/xarray_.py +++ b/pygeoapi/provider/xarray_.py @@ -44,6 +44,7 @@ ProviderConnectionError, ProviderNoDataError, ProviderQueryError) +from pygeoapi.provider.base_edr import BaseEDRProvider from pygeoapi.util import read_data LOGGER = logging.getLogger(__name__) @@ -378,24 +379,7 @@ def gen_covjson(self, metadata, data, fields): }) LOGGER.debug('Adding parameters') - for key, value in selected_fields.items(): - parameter = { - 'type': 'Parameter', - 'description': { - 'en': value['title'] - }, - 'unit': { - 'symbol': value['x-ogc-unit'] - }, - 'observedProperty': { - 'id': key, - 'label': { - 'en': value['title'] - } - } - } - - cj['parameters'][key] = parameter + cj['parameters'] = BaseEDRProvider.get_parameters(self, selected_fields) data = data.fillna(None) From 07c7a6f1fe48d8f0fc22e66ae167e958f2ea2aae Mon Sep 17 00:00:00 2001 From: Benjamin Webb Date: Sat, 20 Jun 2026 14:48:06 -0600 Subject: [PATCH 3/5] Fix tests --- tests/api/test_environmental_data_retrieval.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/api/test_environmental_data_retrieval.py b/tests/api/test_environmental_data_retrieval.py index 38ee4f852..e15e880eb 100644 --- a/tests/api/test_environmental_data_retrieval.py +++ b/tests/api/test_environmental_data_retrieval.py @@ -54,7 +54,6 @@ def test_describe_collection_edr(config, api_): assert sst['id'] == 'SST' assert sst['type'] == 'Parameter' assert sst['observedProperty']['label']['en'] == 'SEA SURFACE TEMPERATURE' - assert sst['unit']['label']['en'] == 'SEA SURFACE TEMPERATURE' assert sst['unit']['symbol']['value'] == 'Deg C' From 0e08d2ac9ecd3c0011bd22502186999770ac9f1f Mon Sep 17 00:00:00 2001 From: Benjamin Webb Date: Sat, 20 Jun 2026 14:56:21 -0600 Subject: [PATCH 4/5] Fix flake8 --- pygeoapi/provider/xarray_.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pygeoapi/provider/xarray_.py b/pygeoapi/provider/xarray_.py index cdde62954..619e07127 100644 --- a/pygeoapi/provider/xarray_.py +++ b/pygeoapi/provider/xarray_.py @@ -379,7 +379,9 @@ def gen_covjson(self, metadata, data, fields): }) LOGGER.debug('Adding parameters') - cj['parameters'] = BaseEDRProvider.get_parameters(self, selected_fields) + cj['parameters'] = BaseEDRProvider.get_parameters( + self, selected_fields + ) data = data.fillna(None) From 584708fafc5a8e8a35d5ca666e32ad76405ba784 Mon Sep 17 00:00:00 2001 From: Benjamin Webb Date: Sat, 20 Jun 2026 18:45:13 -0600 Subject: [PATCH 5/5] Migrate as_list annotation --- pygeoapi/provider/base_edr.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pygeoapi/provider/base_edr.py b/pygeoapi/provider/base_edr.py index bb07b8cfb..8eddf9e2b 100644 --- a/pygeoapi/provider/base_edr.py +++ b/pygeoapi/provider/base_edr.py @@ -113,6 +113,9 @@ def get_parameters( :param parameters: List of the subset of parameters include. :param as_list: bool to return as a list of parameter definitions. + GeoJSON parameters are returned as an array + https://github.com/opengeospatial/ogcapi-environmental-data-retrieval/issues/633 + :returns: A dictionary or list containing the parameter definition. """ @@ -149,8 +152,6 @@ def get_parameters( }) if as_list: - # GeoJSON Parameters are a list - # https://github.com/opengeospatial/ogcapi-environmental-data-retrieval/issues/633 return list(out_params.values()) else: return out_params