Skip to content

Commit b037973

Browse files
committed
- moved function that checks the limits of the TMS to the base tile provider
- check limits of TMS in wmts provider
1 parent cd2d122 commit b037973

File tree

3 files changed

+67
-48
lines changed

3 files changed

+67
-48
lines changed

pygeoapi/provider/base_mvt.py

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -249,45 +249,3 @@ def get_tms_links(self):
249249
]
250250
}
251251
return links
252-
253-
def get_tilematrixset(self, tileMatrixSetId):
254-
"""
255-
Get tilematrixset
256-
257-
:param tileMatrixSetId: tilematrixsetid str
258-
259-
:returns: tilematrixset enum object
260-
"""
261-
262-
enums = [e.value for e in TileMatrixSetEnum]
263-
enum = None
264-
265-
try:
266-
for e in enums:
267-
if tileMatrixSetId == e.tileMatrixSet:
268-
enum = e
269-
if not enum:
270-
raise ValueError('could not find this tilematrixset')
271-
return enum
272-
273-
except ValueError as err:
274-
LOGGER.error(err)
275-
276-
def is_in_limits(self, tilematrixset, z, x, y):
277-
"""
278-
Is within the limits of the tilematrixset
279-
280-
:param z: tilematrix
281-
:param x: x
282-
:param y: y
283-
284-
:returns: wether this tile is within the tile matrix
285-
set limits (Boolean)
286-
"""
287-
288-
try:
289-
if int(x) < tilematrixset.tileMatrices[int(z)]['matrixWidth'] and int(y) < tilematrixset.tileMatrices[int(z)]['matrixHeight']: # noqa
290-
return True
291-
return False
292-
except ValueError as err:
293-
LOGGER.error(err)

pygeoapi/provider/tile.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
import logging
3333
from http import HTTPStatus
3434

35+
from pygeoapi.models.provider.base import (
36+
TileMatrixSetEnum)
37+
3538
from pygeoapi.provider.base import (
3639
ProviderGenericError, ProviderItemNotFoundError)
3740

@@ -123,6 +126,48 @@ def get_metadata(self):
123126

124127
raise NotImplementedError()
125128

129+
def is_in_limits(self, tilematrixset, z, x, y):
130+
"""
131+
Is within the limits of the tilematrixset
132+
133+
:param z: tilematrix
134+
:param x: x
135+
:param y: y
136+
137+
:returns: wether this tile is within the tile matrix
138+
set limits (Boolean)
139+
"""
140+
141+
try:
142+
if int(x) < tilematrixset.tileMatrices[int(z)]['matrixWidth'] and int(y) < tilematrixset.tileMatrices[int(z)]['matrixHeight']: # noqa
143+
return True
144+
return False
145+
except ValueError as err:
146+
LOGGER.error(err)
147+
148+
def get_tilematrixset(self, tileMatrixSetId):
149+
"""
150+
Get tilematrixset
151+
152+
:param tileMatrixSetId: tilematrixsetid str
153+
154+
:returns: tilematrixset enum object
155+
"""
156+
157+
enums = [e.value for e in TileMatrixSetEnum]
158+
enum = None
159+
160+
try:
161+
for e in enums:
162+
if tileMatrixSetId == e.tileMatrixSet:
163+
enum = e
164+
if not enum:
165+
raise ValueError('could not find this tilematrixset')
166+
return enum
167+
168+
except ValueError as err:
169+
LOGGER.error(err)
170+
126171

127172
class ProviderTileQueryError(ProviderGenericError):
128173
"""provider tile query error"""

pygeoapi/provider/wmts_facade.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@
3737

3838
from pygeoapi.provider.tile import (ProviderTileNotFoundError,
3939
BaseTileProvider)
40-
from pygeoapi.provider.base import ProviderConnectionError
40+
from pygeoapi.provider.base import (ProviderConnectionError,
41+
ProviderInvalidQueryError,
42+
ProviderGenericError)
4143
from pygeoapi.models.provider.base import (
4244
TileMatrixSetEnum, TilesMetadataFormat, TileSetMetadata, LinkType)
4345
from pygeoapi.util import is_url, url_join
@@ -169,13 +171,27 @@ def get_tiles(self, layer=None, tileset=None,
169171

170172
LOGGER.debug(f'WMTS 1.0.0 request url: {request_url}')
171173

172-
with requests.Session() as session:
173-
resp = session.get(request_url)
174+
try:
175+
with requests.Session() as session:
176+
resp = session.get(request_url)
174177

175-
if resp.status_code == 400:
176-
raise ProviderTileNotFoundError
178+
if resp.status_code == 400:
179+
180+
tms = self.get_tilematrixset(tileset)
181+
182+
if (self.is_in_limits(tms, z, x, y)):
183+
return None
184+
raise ProviderTileNotFoundError
185+
186+
resp.raise_for_status()
187+
return resp.content
188+
189+
except requests.exceptions.RequestException as e:
190+
LOGGER.debug(e)
191+
if resp.status_code < 500:
192+
raise ProviderInvalidQueryError # Client is sending an invalid request # noqa
193+
raise ProviderGenericError # Server error
177194

178-
return resp.content
179195
else:
180196
msg = f'Wrong data path configuration: {self.data}'
181197
LOGGER.error(msg)

0 commit comments

Comments
 (0)