From 6a08b05681b2ecdb9a6f8530c55783bce99a42d0 Mon Sep 17 00:00:00 2001 From: doublebyte Date: Thu, 25 Jun 2026 11:51:45 +0100 Subject: [PATCH 1/8] - catchup with changes in maps api --- pygeoapi/provider/mapscript_.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/pygeoapi/provider/mapscript_.py b/pygeoapi/provider/mapscript_.py index 46634d92d..f8d7511e3 100644 --- a/pygeoapi/provider/mapscript_.py +++ b/pygeoapi/provider/mapscript_.py @@ -37,6 +37,8 @@ ProviderQueryError) from pygeoapi.util import str2bool +from pygeoapi.crs import get_crs_curie + LOGGER = logging.getLogger(__name__) IMAGE_FORMATS = { @@ -45,6 +47,7 @@ 'jpeg': 'AGG/JPEG' } +DEFAULT_WMS_CRS = 'CRS:84' class MapScriptProvider(BaseProvider): """MapScript map provider (https://mapserver.org/mapscript)""" @@ -122,7 +125,7 @@ def __init__(self, provider_def): LOGGER.warning(err) raise ProviderConnectionError('Cannot connect to map service') - def query(self, style=None, bbox=[], width=500, height=300, crs='CRS84', + def query(self, style=None, bbox=[], width=500, height=300, crs=DEFAULT_WMS_CRS, datetime_=None, format_='png', transparent=True, **kwargs): """ Generate map @@ -146,14 +149,26 @@ def query(self, style=None, bbox=[], width=500, height=300, crs='CRS84', raise ProviderQueryError('Bad image format') LOGGER.debug('Setting output map CRS') + try: - if crs not in ['CRS84', 4326]: + + wms_crs = get_crs_curie(crs) + + LOGGER.debug(f'Mapscript will use: {wms_crs}') + + if wms_crs not in ['CRS:84', 'EPSG:4326']: LOGGER.debug('Reprojecting coordinates') - prj_dst_text = self._epsg2projstring(int(crs.split("/")[-1])) + epsg_code_str = wms_crs.split(":")[-1].strip() + epsg_code = int(epsg_code_str) + LOGGER.debug(f'Extracted EPSG Code: {epsg_code}') + prj_dst_text = self._epsg2projstring(epsg_code) + #prj_dst_text = self._epsg2projstring(int(crs.split("/")[-1])) + LOGGER.debug('checkpoint1') prj_src = mapscript.projectionObj(self._layer.getProjection()) + LOGGER.debug('checkpoint2') prj_dst = mapscript.projectionObj(prj_dst_text) - + LOGGER.debug('checkpoint3') rect = mapscript.rectObj(*bbox) _ = rect.project(prj_src, prj_dst) @@ -201,7 +216,7 @@ def query(self, style=None, bbox=[], width=500, height=300, crs='CRS84', return img.getBytes() - def _epsg2projstring(self, epsg_code): + def _epsg2projstring(self, epsg_code: int): """ Helper function to derive a proj string from an EPSG code @@ -209,6 +224,12 @@ def _epsg2projstring(self, epsg_code): :returns: `str` of PROJ string/syntax """ + try: + epsg_code = int(epsg_code) + except (ValueError, TypeError) as e: + raise ValueError(f"Invalid EPSG code: {epsg_code}") from e + + LOGGER.debug(f'_epsg2projstring: {epsg_code}') prj = osr.SpatialReference() prj.ImportFromEPSG(epsg_code) From 209d1b3eaa350aec4346bf737b50bce527fef3fb Mon Sep 17 00:00:00 2001 From: doublebyte Date: Thu, 25 Jun 2026 12:12:44 +0100 Subject: [PATCH 2/8] - Catchup with changes on function names --- pygeoapi/provider/mapscript_.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pygeoapi/provider/mapscript_.py b/pygeoapi/provider/mapscript_.py index f8d7511e3..2266cfa93 100644 --- a/pygeoapi/provider/mapscript_.py +++ b/pygeoapi/provider/mapscript_.py @@ -37,7 +37,7 @@ ProviderQueryError) from pygeoapi.util import str2bool -from pygeoapi.crs import get_crs_curie +from pygeoapi.crs import get_curie LOGGER = logging.getLogger(__name__) @@ -152,7 +152,7 @@ def query(self, style=None, bbox=[], width=500, height=300, crs=DEFAULT_WMS_CRS, try: - wms_crs = get_crs_curie(crs) + wms_crs = get_curie(crs) LOGGER.debug(f'Mapscript will use: {wms_crs}') From 547c9d4aa6a2e5a0de45c434fa805eb2b18f09d5 Mon Sep 17 00:00:00 2001 From: doublebyte Date: Thu, 25 Jun 2026 17:26:56 +0100 Subject: [PATCH 3/8] - removed reprojection of bbox, since that is now handled at the base class. --- pygeoapi/provider/mapscript_.py | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/pygeoapi/provider/mapscript_.py b/pygeoapi/provider/mapscript_.py index 2266cfa93..60d497620 100644 --- a/pygeoapi/provider/mapscript_.py +++ b/pygeoapi/provider/mapscript_.py @@ -156,28 +156,15 @@ def query(self, style=None, bbox=[], width=500, height=300, crs=DEFAULT_WMS_CRS, LOGGER.debug(f'Mapscript will use: {wms_crs}') + # The bbox is already reprojected on the base class + map_bbox = bbox + if wms_crs not in ['CRS:84', 'EPSG:4326']: - LOGGER.debug('Reprojecting coordinates') epsg_code_str = wms_crs.split(":")[-1].strip() epsg_code = int(epsg_code_str) - LOGGER.debug(f'Extracted EPSG Code: {epsg_code}') - prj_dst_text = self._epsg2projstring(epsg_code) - #prj_dst_text = self._epsg2projstring(int(crs.split("/")[-1])) - - LOGGER.debug('checkpoint1') - prj_src = mapscript.projectionObj(self._layer.getProjection()) - LOGGER.debug('checkpoint2') - prj_dst = mapscript.projectionObj(prj_dst_text) - LOGGER.debug('checkpoint3') - rect = mapscript.rectObj(*bbox) - _ = rect.project(prj_src, prj_dst) - - map_bbox = [rect.minx, rect.miny, rect.maxx, rect.maxy] - map_crs = prj_dst_text + map_crs = self._epsg2projstring(epsg_code) self._map.units = mapscript.MS_METERS - else: - map_bbox = bbox map_crs = self._epsg2projstring(4326) self._map.units = mapscript.MS_DD From f8224fa698b67d7a1c8db53c072f408b9d99d877 Mon Sep 17 00:00:00 2001 From: doublebyte Date: Thu, 25 Jun 2026 17:30:54 +0100 Subject: [PATCH 4/8] - fixed flake8 --- pygeoapi/provider/mapscript_.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pygeoapi/provider/mapscript_.py b/pygeoapi/provider/mapscript_.py index 60d497620..a52f25f98 100644 --- a/pygeoapi/provider/mapscript_.py +++ b/pygeoapi/provider/mapscript_.py @@ -49,6 +49,7 @@ DEFAULT_WMS_CRS = 'CRS:84' + class MapScriptProvider(BaseProvider): """MapScript map provider (https://mapserver.org/mapscript)""" @@ -125,8 +126,9 @@ def __init__(self, provider_def): LOGGER.warning(err) raise ProviderConnectionError('Cannot connect to map service') - def query(self, style=None, bbox=[], width=500, height=300, crs=DEFAULT_WMS_CRS, - datetime_=None, format_='png', transparent=True, **kwargs): + def query(self, style=None, bbox=[], width=500, height=300, + crs=DEFAULT_WMS_CRS, datetime_=None, format_='png', + transparent=True, **kwargs): """ Generate map @@ -215,7 +217,7 @@ def _epsg2projstring(self, epsg_code: int): epsg_code = int(epsg_code) except (ValueError, TypeError) as e: raise ValueError(f"Invalid EPSG code: {epsg_code}") from e - + LOGGER.debug(f'_epsg2projstring: {epsg_code}') prj = osr.SpatialReference() From 4710fc7a5d37d9cd75ae984b184ca518d0b4f5f9 Mon Sep 17 00:00:00 2001 From: doublebyte Date: Thu, 25 Jun 2026 17:42:11 +0100 Subject: [PATCH 5/8] - updated copyright notice --- pygeoapi/provider/mapscript_.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pygeoapi/provider/mapscript_.py b/pygeoapi/provider/mapscript_.py index a52f25f98..30c37f670 100644 --- a/pygeoapi/provider/mapscript_.py +++ b/pygeoapi/provider/mapscript_.py @@ -2,6 +2,7 @@ # # Authors: Tom Kralidis # +# Copyright (c) 2026 Joana Simoes # Copyright (c) 2022 Tom Kralidis # # Permission is hereby granted, free of charge, to any person From 3b4fca0da7446dc42681f3b2e707d22d8784f372 Mon Sep 17 00:00:00 2001 From: doublebyte Date: Thu, 25 Jun 2026 17:50:34 +0100 Subject: [PATCH 6/8] - simplified code --- pygeoapi/provider/mapscript_.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/pygeoapi/provider/mapscript_.py b/pygeoapi/provider/mapscript_.py index 30c37f670..e1612da40 100644 --- a/pygeoapi/provider/mapscript_.py +++ b/pygeoapi/provider/mapscript_.py @@ -155,16 +155,13 @@ def query(self, style=None, bbox=[], width=500, height=300, try: - wms_crs = get_curie(crs) + curie = get_curie(crs) - LOGGER.debug(f'Mapscript will use: {wms_crs}') + LOGGER.debug(f'Mapscript will use: {curie}') # The bbox is already reprojected on the base class - map_bbox = bbox - - if wms_crs not in ['CRS:84', 'EPSG:4326']: - epsg_code_str = wms_crs.split(":")[-1].strip() - epsg_code = int(epsg_code_str) + if curie not in ['CRS:84', 'EPSG:4326']: + epsg_code = int(curie.split(":")[-1].strip()) map_crs = self._epsg2projstring(epsg_code) self._map.units = mapscript.MS_METERS else: @@ -191,7 +188,7 @@ def query(self, style=None, bbox=[], width=500, height=300, fmt.transparent = mapscript.MS_OFF self._map.setOutputFormat(fmt) - self._map.setExtent(*map_bbox) + self._map.setExtent(*bbox) self._map.setSize(width, height) self._map.setProjection(map_crs) From 4a141d27b6fac4dcc374786ac78eaae67c04bdb2 Mon Sep 17 00:00:00 2001 From: doublebyte Date: Thu, 25 Jun 2026 19:14:41 +0100 Subject: [PATCH 7/8] - update variable name to follow up convention --- pygeoapi/provider/mapscript_.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pygeoapi/provider/mapscript_.py b/pygeoapi/provider/mapscript_.py index e1612da40..c9aeff7ca 100644 --- a/pygeoapi/provider/mapscript_.py +++ b/pygeoapi/provider/mapscript_.py @@ -213,7 +213,7 @@ def _epsg2projstring(self, epsg_code: int): """ try: epsg_code = int(epsg_code) - except (ValueError, TypeError) as e: + except (ValueError, TypeError) as err: raise ValueError(f"Invalid EPSG code: {epsg_code}") from e LOGGER.debug(f'_epsg2projstring: {epsg_code}') From ef724f92bcdd8c4c3bfcfcaf539ab496f3e7633f Mon Sep 17 00:00:00 2001 From: doublebyte Date: Thu, 25 Jun 2026 19:38:15 +0100 Subject: [PATCH 8/8] - updated missed variable name --- pygeoapi/provider/mapscript_.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pygeoapi/provider/mapscript_.py b/pygeoapi/provider/mapscript_.py index c9aeff7ca..e46d8b11d 100644 --- a/pygeoapi/provider/mapscript_.py +++ b/pygeoapi/provider/mapscript_.py @@ -214,7 +214,7 @@ def _epsg2projstring(self, epsg_code: int): try: epsg_code = int(epsg_code) except (ValueError, TypeError) as err: - raise ValueError(f"Invalid EPSG code: {epsg_code}") from e + raise ValueError(f"Invalid EPSG code: {epsg_code}") from err LOGGER.debug(f'_epsg2projstring: {epsg_code}')