@@ -141,29 +141,35 @@ def get_tiles(self, layer='default', tileset=None,
141
141
LOGGER .warning (f'Tile { z } /{ x } /{ y } not found' )
142
142
return ProviderTileNotFoundError
143
143
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
+
145
147
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
+ )
149
152
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
+ )
152
160
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 ()
165
169
)
166
170
171
+ mvt_query = select (func .ST_AsMVT (mvtrow , layer ))
172
+
167
173
with Session (self ._engine ) as session :
168
174
result = session .execute (mvt_query ).scalar ()
169
175
0 commit comments