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..8eddf9e2b 100644 --- a/pygeoapi/provider/base_edr.py +++ b/pygeoapi/provider/base_edr.py @@ -105,6 +105,57 @@ 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. + 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. + """ + 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: + return list(out_params.values()) + else: + return out_params + def query(self, **kwargs): """ Extract data from collection collection diff --git a/pygeoapi/provider/xarray_.py b/pygeoapi/provider/xarray_.py index 36353243a..619e07127 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,9 @@ 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) 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'