Skip to content

Commit 8d5606e

Browse files
committed
- return 204 for tiles that are within the tile matrix set limits
1 parent 7168828 commit 8d5606e

File tree

5 files changed

+51
-2
lines changed

5 files changed

+51
-2
lines changed

pygeoapi/api/tiles.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ def get_collection_tiles_data(
247247
if content is None:
248248
msg = 'identifier not found'
249249
return api.get_exception(
250-
HTTPStatus.NOT_FOUND, headers, format_, 'NotFound', msg)
250+
HTTPStatus.NO_CONTENT, headers, format_, 'NocContent', msg)
251251
else:
252252
return headers, HTTPStatus.OK, content
253253

@@ -444,7 +444,6 @@ def tilematrixset(api: API,
444444

445445
return headers, HTTPStatus.OK, to_json(tms, api.pretty_print)
446446

447-
448447
def get_oas_30(cfg: dict, locale: str) -> tuple[list[dict[str, str]], dict[str, dict]]: # noqa
449448
"""
450449
Get OpenAPI fragments

pygeoapi/provider/base_mvt.py

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

pygeoapi/provider/mvt_elastic.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ def get_tiles(self, layer=None, tileset=None,
179179
resp = session.get(f'{base_url}/{layer}/{z}/{y}/{x}{url_query}', json=data) # noqa
180180

181181
if resp.status_code == 404:
182+
if (self.is_in_limits(self.get_tilematrixset(tileset), z, x, y)): # noqa
183+
return None
182184
raise ProviderTileNotFoundError
183185

184186
resp.raise_for_status()

pygeoapi/provider/mvt_proxy.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ def get_tiles(self, layer=None, tileset=None,
175175
resp = session.get(f'{base_url}/{layer}/{z}/{y}/{x}{url_query}') # noqa
176176

177177
if resp.status_code == 404:
178+
if (self.is_in_limits(self.get_tilematrixset(tileset), z, x, y)): # noqa
179+
return None
178180
raise ProviderTileNotFoundError
179181

180182
resp.raise_for_status()

pygeoapi/provider/mvt_tippecanoe.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,8 @@ def get_tiles_from_url(self, layer=None, tileset=None,
188188
resp = session.get(f'{base_url}/{layer}/{z}/{y}/{x}{extension}') # noqa
189189

190190
if resp.status_code == 404:
191+
if (self.is_in_limits(self.get_tilematrixset(tileset), z, x, y)): # noqa
192+
return None
191193
raise ProviderTileNotFoundError
192194

193195
resp.raise_for_status()
@@ -218,6 +220,8 @@ def get_tiles_from_disk(self, layer=None, tileset=None,
218220
with open(service_url_path, mode='rb') as tile:
219221
return tile.read()
220222
except FileNotFoundError as err:
223+
if (self.is_in_limits(self.get_tilematrixset(tileset), z, x, y)): # noqa
224+
return None
221225
raise ProviderTileNotFoundError(err)
222226

223227
def get_tiles(self, layer=None, tileset=None,

0 commit comments

Comments
 (0)