1212from pydantic import BaseModel , root_validator
1313from pygeofilter .ast import AstType
1414
15+ from tifeatures .dbmodel import GeometryColumn
1516from tifeatures .dbmodel import Table as DBTable
1617from tifeatures .errors import (
1718 InvalidDatetime ,
1819 InvalidDatetimeColumnName ,
19- InvalidGeometryColumnName ,
2020 InvalidPropertyName ,
2121 MissingDatetimeColumn ,
22- MissingGeometryColumn ,
2322)
2423from tifeatures .filter .evaluate import to_filter
2524from tifeatures .filter .filters import bbox_to_wkt
@@ -121,6 +120,36 @@ def _select_count(self):
121120 def _from (self ):
122121 return clauses .From (self .id )
123122
123+ def _geom (
124+ self ,
125+ geometry_column : Optional [GeometryColumn ],
126+ bbox_only : Optional [bool ],
127+ simplify : Optional [float ],
128+ ):
129+ if geometry_column is None :
130+ return pg_funcs .cast (None , "json" )
131+
132+ g = logic .V (geometry_column .name )
133+
134+ if bbox_only :
135+ g = logic .Func ("ST_Envelope" , g )
136+ elif simplify :
137+ g = logic .Func (
138+ "ST_SnapToGrid" ,
139+ logic .Func ("ST_Simplify" , g , simplify ),
140+ simplify ,
141+ )
142+
143+ if geometry_column .srid == 4326 :
144+ g = logic .Func ("ST_AsGeoJson" , g )
145+ else :
146+ g = logic .Func (
147+ "ST_Transform" ,
148+ logic .Func ("ST_AsGeoJson" , g ),
149+ 4326 ,
150+ )
151+ return g
152+
124153 def _where (
125154 self ,
126155 ids : Optional [List [str ]] = None ,
@@ -304,14 +333,12 @@ async def query(
304333 dt : str = None ,
305334 limit : Optional [int ] = None ,
306335 offset : Optional [int ] = None ,
336+ bbox_only : Optional [bool ] = None ,
337+ simplify : Optional [float ] = None ,
307338 ) -> Tuple [FeatureCollection , int ]:
308339 """Build and run Pg query."""
309- if not self .geometry_columns :
310- raise MissingGeometryColumn ("Must have geometry column for geojson output." )
311340
312341 geometry_column = self .geometry_column (geom )
313- if not geometry_column :
314- raise InvalidGeometryColumnName (f"Invalid Geometry Column: { geom } ." )
315342
316343 sql_query = """
317344 WITH
@@ -327,13 +354,8 @@ async def query(
327354 json_build_object(
328355 'type', 'Feature',
329356 'id', :id_column,
330- 'geometry', ST_AsGeoJSON(
331- CASE
332- WHEN :srid = 4326 THEN :geometry_column
333- ELSE ST_Transform(:geometry_column, 4326)
334- END
335- )::json,
336- 'properties', to_jsonb( features.* ) - :geom_columns
357+ 'geometry', :geometry_q,
358+ 'properties', to_jsonb( features.* ) - :geom_columns::text[]
337359 )
338360 ),
339361 'total_count', total_count.count
@@ -365,10 +387,14 @@ async def query(
365387 dt = dt ,
366388 ),
367389 id_column = logic .V (self .id_column ),
368- srid = geometry_column .srid ,
369- geometry_column = logic .V (geometry_column .name ),
370- geom_columns = geometry_column .name ,
390+ geometry_q = self ._geom (
391+ geometry_column = geometry_column ,
392+ bbox_only = bbox_only ,
393+ simplify = simplify ,
394+ ),
395+ geom_columns = [g .name for g in self .geometry_columns ],
371396 )
397+ print (q , p )
372398 async with pool .acquire () as conn :
373399 items = await conn .fetchval (q , * p )
374400
0 commit comments