Skip to content

Commit abefa95

Browse files
committed
Update CRS conversion
1 parent 49d0d88 commit abefa95

File tree

1 file changed

+22
-28
lines changed

1 file changed

+22
-28
lines changed

pygeoapi/provider/mvt_postgresql.py

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,15 @@
4444
from pygeoapi.provider.base_mvt import BaseMVTProvider
4545
from pygeoapi.provider.postgresql import PostgreSQLProvider
4646
from pygeoapi.provider.base_tile import ProviderTileNotFoundError
47-
from pygeoapi.util import url_join
47+
from pygeoapi.util import url_join, get_crs_from_uri
4848

4949
LOGGER = logging.getLogger(__name__)
5050

5151
WEBMERCATORQUAD = TileMatrixSetEnum.WEBMERCATORQUAD.value
5252
WORLDCRS84QUAD = TileMatrixSetEnum.WORLDCRS84QUAD.value
5353

54-
CRS_CODES = {
55-
'http://www.opengis.net/def/crs/OGC/1.3/CRS84': 4326,
56-
'https://www.opengis.net/def/crs/OGC/0/CRS84': 4326,
57-
'http://www.opengis.net/def/crs/EPSG/0/3857': 3857
58-
}
5954

60-
61-
class MVTPostgreSQLProvider(BaseMVTProvider, PostgreSQLProvider):
55+
class MVTPostgreSQLProvider(PostgreSQLProvider, BaseMVTProvider):
6256
"""
6357
MVT PostgreSQL Provider
6458
Provider for serving tiles rendered on-the-fly from
@@ -82,11 +76,14 @@ def __init__(self, provider_def):
8276

8377
def get_fields(self):
8478
"""
85-
Get Postgrres fields
79+
Get Postgres columns
8680
87-
:returns: `dict` of item fields
81+
:returns: `list` of columns
8882
"""
89-
PostgreSQLProvider.get_fields(self)
83+
return [
84+
column for column in self.table_model.__table__.columns
85+
if column.name != self.geom
86+
]
9087

9188
def get_layer(self):
9289
"""
@@ -136,34 +133,30 @@ def get_tiles(self, layer='default', tileset=None,
136133
if format_ == 'mvt':
137134
format_ = self.format_type
138135

139-
geom_column = getattr(self.table_model, self.geom)
140-
tile_envelope = func.ST_TileEnvelope(z, x, y)
141136
[tileset_schema] = [
142137
schema for schema in self.get_tiling_schemes()
143138
if tileset == schema.tileMatrixSet
144139
]
145-
146140
if not self.is_in_limits(tileset_schema, z, x, y):
141+
LOGGER.warning(f'Tile {z}/{x}/{y} not found')
147142
return ProviderTileNotFoundError
148143

144+
geom_column = getattr(self.table_model, self.geom)
145+
tile_envelope = func.ST_TileEnvelope(z, x, y)
149146
if tileset_schema.crs != self.storage_crs:
150-
LOGGER.debug('Transforming geometry')
151-
tile_envelope = func.ST_Transform(
152-
tile_envelope, CRS_CODES[tileset_schema.crs]
153-
)
154-
geom_column = func.ST_Transform(
155-
geom_column, CRS_CODES[tileset_schema.crs]
156-
)
147+
target_srid = get_crs_from_uri(tileset_schema.crs).to_string()
148+
LOGGER.debug(f'Transforming geometry to {target_srid}')
157149

158-
all_columns = [
159-
c for c in self.table_model.__table__.columns if c.name != 'geom'
150+
tile_envelope = func.ST_Transform(tile_envelope, target_srid)
151+
geom_column = func.ST_Transform(geom_column, target_srid)
152+
153+
mvt_columns = [
154+
*self.get_fields(),
155+
func.ST_AsMVTGeom(geom_column, tile_envelope)
160156
]
161-
all_columns.append(
162-
func.ST_AsMVTGeom(geom_column, tile_envelope).label('mvt')
163-
)
164157
tile_query = select(
165158
func.ST_AsMVT(
166-
select(*all_columns)
159+
select(*mvt_columns)
167160
.select_from(self.table_model)
168161
.cte('tile')
169162
.table_valued(),
@@ -173,7 +166,8 @@ def get_tiles(self, layer='default', tileset=None,
173166

174167
with Session(self._engine) as session:
175168
result = session.execute(tile_query).scalar()
176-
return bytes(result) or None
169+
170+
return bytes(result) or None
177171

178172
def get_html_metadata(self, dataset, server_url, layer, tileset,
179173
title, description, keywords, **kwargs):

0 commit comments

Comments
 (0)