Skip to content

Commit 97ba024

Browse files
committed
Updates to MVT postgres provider
- Fixed flake8 issues - Corrected tile indices in `ST_TileEnvelope` - Previous indices worked when tile URL was `/z/x/y`. Current ones work for `/z/y/x`, which is OGC-compliant - Used `ST_CurveToLine` when querying for features during tile generation to potentially speed up queries - Martin also uses it (https://maplibre.org/martin/sources-pg-functions.html#simple-function) - Used EWKT representation of `ST_MakeEnvelope(-180,-90,180,90,4326)` for WorldCRS84Quad tiles
1 parent a1fe9d5 commit 97ba024

File tree

1 file changed

+24
-41
lines changed

1 file changed

+24
-41
lines changed

pygeoapi/provider/mvt_postgres.py

Lines changed: 24 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# =================================================================
22
#
3-
# Authors:
3+
# Authors:
44
#
55
# Copyright (c)
66
#
@@ -28,35 +28,17 @@
2828
# =================================================================
2929

3030
import logging
31-
import requests
32-
from urllib.parse import urlparse
3331

3432
from pygeoapi.provider.base_mvt import BaseMVTProvider
3533
from pygeoapi.provider.postgresql import PostgreSQLProvider
36-
from pygeoapi.provider.base import (ProviderConnectionError,
37-
ProviderGenericError,
38-
ProviderInvalidQueryError)
39-
from pygeoapi.provider.tile import ProviderTileNotFoundError
34+
from pygeoapi.provider.base import ProviderConnectionError
4035
from pygeoapi.models.provider.base import (
4136
TileSetMetadata, TileMatrixSetEnum, LinkType)
42-
from pygeoapi.util import is_url, url_join
43-
from sqlalchemy.orm import Session, load_only
37+
from pygeoapi.util import url_join
4438

45-
from sqlalchemy.engine import URL
4639
from sqlalchemy.sql import text
47-
from sqlalchemy.exc import ConstraintColumnNotFoundError, \
48-
InvalidRequestError, OperationalError
49-
from sqlalchemy.ext.automap import automap_base
50-
from sqlalchemy.sql.expression import and_
51-
from pygeoapi.provider.base import BaseProvider, \
52-
ProviderConnectionError, ProviderInvalidDataError, ProviderQueryError, \
53-
ProviderItemNotFoundError
54-
40+
5541
from copy import deepcopy
56-
from datetime import datetime
57-
from decimal import Decimal
58-
import functools
59-
import logging
6042

6143
LOGGER = logging.getLogger(__name__)
6244

@@ -73,7 +55,7 @@ def __init__(self, provider_def):
7355
"""
7456

7557
super().__init__(provider_def)
76-
58+
7759
pg_def = deepcopy(provider_def)
7860
del pg_def["options"]["zoom"]
7961
self.postgres = PostgreSQLProvider(pg_def)
@@ -151,47 +133,48 @@ def get_tiles(self, layer=None, tileset=None,
151133
fields = ', '.join(['"' + f + '"' for f in fields_arr])
152134
if len(fields) != 0:
153135
fields = ',' + fields
154-
136+
155137
query = ''
156138
if tileset == TileMatrixSetEnum.WEBMERCATORQUAD.value.tileMatrixSet:
157139
query = text("""
158-
WITH
140+
WITH
159141
bounds AS (
160-
SELECT ST_TileEnvelope(:z, :y, :x) AS boundgeom
142+
SELECT ST_TileEnvelope(:z, :x, :y) AS boundgeom
161143
),
162144
mvtgeom AS (
163-
SELECT ST_AsMVTGeom(ST_Transform({geom}, 3857), bounds.boundgeom) AS geom {fields}
145+
SELECT ST_AsMVTGeom(ST_Transform(ST_CurveToLine({geom}), 3857), bounds.boundgeom) AS geom {fields}
164146
FROM "{table}", bounds
165147
WHERE ST_Intersects({geom}, ST_Transform(bounds.boundgeom, 4326))
166148
)
167149
SELECT ST_AsMVT(mvtgeom, 'default') FROM mvtgeom;
168-
""".format(geom=self.geom, table=self.table, fields=fields))
169-
150+
""".format(geom=self.geom, table=self.table, fields=fields)) # noqa
151+
170152
if tileset == TileMatrixSetEnum.WORLDCRS84QUAD.value.tileMatrixSet:
171153
query = text("""
172-
WITH
154+
WITH
173155
bounds AS (
174-
SELECT ST_TileEnvelope(:z, :y, :x, ST_MakeEnvelope(-180, -90, 180, 90, 4326)) AS boundgeom
156+
SELECT ST_TileEnvelope(:z, :x, :y,
157+
'SRID=4326;POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))'::geometry) AS boundgeom
175158
),
176159
mvtgeom AS (
177-
SELECT ST_AsMVTGeom({geom}, bounds.boundgeom) AS geom {fields}
160+
SELECT ST_AsMVTGeom(ST_CurveToLine({geom}), bounds.boundgeom) AS geom {fields}
178161
FROM "{table}", bounds
179162
WHERE ST_Intersects({geom}, bounds.boundgeom)
180163
)
181164
SELECT ST_AsMVT(mvtgeom, 'default') FROM mvtgeom;
182-
""".format(geom=self.geom, table=self.table, fields=fields))
165+
""".format(geom=self.geom, table=self.table, fields=fields)) # noqa
183166

184167
with self.postgres._engine.connect() as session:
185-
result = session.execute(query, {
186-
'z': z,
187-
'y': y,
168+
result = session.execute(query, {
169+
'z': z,
170+
'y': y,
188171
'x': x
189-
}).fetchone()
172+
}).fetchone()
173+
174+
if len(bytes(result[0])) == 0:
175+
return None
176+
return bytes(result[0])
190177

191-
if len(bytes(result[0])) == 0:
192-
return None
193-
return bytes(result[0])
194-
195178
def get_html_metadata(self, dataset, server_url, layer, tileset,
196179
title, description, keywords, **kwargs):
197180

0 commit comments

Comments
 (0)