Skip to content

Commit c813098

Browse files
committed
Speed up query logic
1 parent fdd80df commit c813098

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

pygeoapi/provider/mvt_postgresql.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -141,29 +141,35 @@ def get_tiles(self, layer='default', tileset=None,
141141
LOGGER.warning(f'Tile {z}/{x}/{y} not found')
142142
return ProviderTileNotFoundError
143143

144-
geom_column = func.ST_CurveToLine(getattr(self.table_model, self.geom))
144+
storage_srid = get_crs_from_uri(self.storage_crs).to_string()
145+
out_srid = get_crs_from_uri(tileset_schema.crs).to_string()
146+
145147
tile_envelope = func.ST_TileEnvelope(z, x, y)
146-
if tileset_schema.crs != self.storage_crs:
147-
target_srid = get_crs_from_uri(tileset_schema.crs).to_string()
148-
LOGGER.debug(f'Transforming geometry to {target_srid}')
148+
envelope = (
149+
select(tile_envelope.label('bounds'))
150+
.cte('envelope')
151+
)
149152

150-
geom_column = func.ST_Transform(geom_column, target_srid)
151-
tile_envelope = func.ST_Transform(tile_envelope, target_srid)
153+
geom_column = getattr(self.table_model, self.geom)
154+
mvtgeom = (
155+
func.ST_AsMVTGeom(
156+
func.ST_Transform(geom_column, out_srid),
157+
func.ST_Transform(envelope.c.bounds, out_srid))
158+
.label('mvtgeom')
159+
)
152160

153-
mvt_columns = [
154-
*self.get_fields(),
155-
func.ST_AsMVTGeom(geom_column, tile_envelope)
156-
]
157-
mvt_query = select(
158-
func.ST_AsMVT(
159-
select(*mvt_columns)
160-
.select_from(self.table_model)
161-
.cte('mvt')
162-
.table_valued(),
163-
layer
164-
)
161+
geom_filter = geom_column.intersects(
162+
func.ST_Transform(tile_envelope, storage_srid))
163+
mvtrow = (
164+
select(*self.get_fields(), mvtgeom)
165+
.filter(geom_filter)
166+
.select_from(self.table_model)
167+
.cte('mvtrow')
168+
.table_valued()
165169
)
166170

171+
mvt_query = select(func.ST_AsMVT(mvtrow, layer))
172+
167173
with Session(self._engine) as session:
168174
result = session.execute(mvt_query).scalar()
169175

0 commit comments

Comments
 (0)