diff --git a/docs/source/publishing/ogcapi-maps.rst b/docs/source/publishing/ogcapi-maps.rst index a6b2aca1f..352616967 100644 --- a/docs/source/publishing/ogcapi-maps.rst +++ b/docs/source/publishing/ogcapi-maps.rst @@ -123,6 +123,9 @@ required. An optional style name can be defined via `options.style`. - `4326` - `3857` + If `crs` is not provided, the server will default `4326`. If `crs-bbox` and `bbox` are not provided, + the server will default to the crs and bounding box defined in the configuration of the spatial extent. + Data visualization examples --------------------------- diff --git a/pygeoapi/api/maps.py b/pygeoapi/api/maps.py index c22991799..553c84bd4 100644 --- a/pygeoapi/api/maps.py +++ b/pygeoapi/api/maps.py @@ -114,11 +114,19 @@ def get_collection_map(api: API, request: APIRequest, query_args['format_'] = request.params.get('f', 'png') query_args['style'] = style - query_args['crs'] = CRS_CODES[request.params.get( - 'crs', collection_def.get('crs', DEFAULT_CRS))] - query_args['bbox_crs'] = CRS_CODES[request.params.get( - 'bbox-crs', collection_def.get('crs', DEFAULT_CRS))] - query_args['transparent'] = request.params.get('transparent', True) + + query_args['crs'] = CRS_CODES.get(request.params.get( + 'crs', DEFAULT_CRS)) + query_args['bbox_crs'] = CRS_CODES.get(request.params.get( + 'bbox-crs', + api.config['resources'][dataset]['extents']['spatial'].get( + 'crs', DEFAULT_CRS)) + ) + + if query_args['crs'] is None: + query_args['crs'] = DEFAULT_CRS + if query_args['bbox_crs'] is None: + query_args['bbox_crs'] = DEFAULT_CRS try: query_args['width'] = int(request.params.get('width', 500)) @@ -135,7 +143,8 @@ def get_collection_map(api: API, request: APIRequest, LOGGER.debug('Processing bbox parameter') try: - bbox = request.params.get('bbox').split(',') + bbox = request.params.get( + 'bbox').split(',') if len(bbox) != 4: exception = { 'code': 'InvalidParameterValue', @@ -145,6 +154,7 @@ def get_collection_map(api: API, request: APIRequest, LOGGER.error(exception) return headers, HTTPStatus.BAD_REQUEST, to_json( exception, api.pretty_print) + except AttributeError: bbox = api.config['resources'][dataset]['extents']['spatial']['bbox'] # noqa try: @@ -163,7 +173,6 @@ def get_collection_map(api: API, request: APIRequest, if query_args['bbox_crs'] != query_args['crs']: LOGGER.debug(f'Reprojecting bbox CRS: {query_args["crs"]}') bbox = transform_bbox(bbox, query_args['bbox_crs'], query_args['crs']) - query_args['bbox'] = bbox LOGGER.debug('Processing datetime parameter') diff --git a/pygeoapi/crs.py b/pygeoapi/crs.py index 188414fa1..fc5764490 100644 --- a/pygeoapi/crs.py +++ b/pygeoapi/crs.py @@ -296,8 +296,19 @@ def transform_bbox(bbox: list, from_crs: Union[str, pyproj.CRS], from_crs_obj = get_crs(from_crs) to_crs_obj = get_crs(to_crs) + transform_func = pyproj.Transformer.from_crs( - from_crs_obj, to_crs_obj).transform + from_crs_obj, to_crs_obj, always_xy=True).transform + + # Clip values to max and min lat of WebMercator, + # to avoid infinte pole distortion + if to_crs_obj.to_epsg() == 3857: + bbox = [ + bbox[0], + max(-85.0511, bbox[1]), + bbox[2], + min(85.0511, bbox[3]) + ] n_dims = len(bbox) // 2 return list(transform_func(*bbox[:n_dims]) + transform_func( diff --git a/pygeoapi/provider/wms_facade.py b/pygeoapi/provider/wms_facade.py index 467c12aba..9cc9c4135 100644 --- a/pygeoapi/provider/wms_facade.py +++ b/pygeoapi/provider/wms_facade.py @@ -67,7 +67,7 @@ def __init__(self, provider_def): def query(self, style=None, bbox=[-180, -90, 180, 90], width=500, height=300, crs=DEFAULT_CRS, datetime_=None, transparent=True, - bbox_crs=DEFAULT_CRS, format_='png', **kwargs): + format_='png', **kwargs): """ Generate map @@ -88,7 +88,7 @@ def query(self, style=None, bbox=[-180, -90, 180, 90], width=500, version = self.options.get('version', '1.3.0') - if version == '1.3.0' and CRS_CODES.get(bbox_crs) == 'EPSG:4326': + if version == '1.3.0' and CRS_CODES.get(crs) == 'EPSG:4326': bbox = [bbox[1], bbox[0], bbox[3], bbox[2]] bbox2 = ','.join(map(str, bbox)) diff --git a/pygeoapi/templates/collections/collection.html b/pygeoapi/templates/collections/collection.html index 4a3b0f7f5..4bb77cf03 100644 --- a/pygeoapi/templates/collections/collection.html +++ b/pygeoapi/templates/collections/collection.html @@ -154,18 +154,46 @@