1111
1212# Extract coords from bbox string like
1313# BOX(2644230.6300308 1246806.79350726,2644465.86084414 1246867.82022007)
14- BBOX_RE = re .compile (r'^BOX\((-?\d+(\.\d+)?) (-?\d+(\.\d+)?),(-?\d+(\.\d+)?) (-?\d+(\.\d+)?)\)$' )
14+ BBOX_RE = re .compile (
15+ r"^BOX\((-?\d+(\.\d+)?) (-?\d+(\.\d+)?),(-?\d+(\.\d+)?) (-?\d+(\.\d+)?)\)$"
16+ )
1517
1618
1719class SearchGeomService :
@@ -33,11 +35,11 @@ def __init__(self, tenant, logger):
3335 self .resources = SearchResources (config , permissions )
3436
3537 self .db_engine = DatabaseEngine ()
36- self .dbs = {} # db connections with db_url as key
37- self .default_db_url = config .get (' db_url' )
38+ self .dbs = {} # db connections with db_url as key
39+ self .default_db_url = config .get (" db_url" )
3840
3941 def _get_db (self , cfg ):
40- db_url = cfg .get (' db_url' , self .default_db_url )
42+ db_url = cfg .get (" db_url" , self .default_db_url )
4143 if db_url not in self .dbs :
4244 self .dbs [db_url ] = self .db_engine .db_engine (db_url )
4345 return self .dbs [db_url ]
@@ -52,43 +54,46 @@ def query(self, identity, dataset, filterexpr):
5254 solr_facets = self .resources .solr_facets (identity )
5355 resource_cfg = solr_facets .get (dataset )
5456
55- if resource_cfg is not None and len (resource_cfg ) == 1 and filterexpr is not None :
57+ if (
58+ resource_cfg is not None
59+ and len (resource_cfg ) == 1
60+ and filterexpr is not None
61+ ):
5662 # Column for feature ID. If unset, field from filterexpr is used
57- self .primary_key = resource_cfg [0 ].get (' search_id_col' )
63+ self .primary_key = resource_cfg [0 ].get (" search_id_col" )
5864 # parse and validate input filter
5965 filterexpr = self ._parse_filter (filterexpr )
6066 if filterexpr [0 ] is None :
6167 return {
62- ' error' : "Invalid filter expression: " + filterexpr [1 ],
63- ' error_code' : 400
68+ " error" : "Invalid filter expression: " + filterexpr [1 ],
69+ " error_code" : 400 ,
6470 }
65- facet_column = resource_cfg [0 ].get (' facet_column' )
71+ facet_column = resource_cfg [0 ].get (" facet_column" )
6672 # Append dataset where clause for search view
6773 if facet_column :
6874 sql = " AND " .join ([filterexpr [0 ], '"%s"=:vs' % facet_column ])
6975 filterexpr [1 ]["vs" ] = dataset
7076 filterexpr = (sql , filterexpr [1 ])
7177
7278 feature_collection = self ._index (filterexpr , resource_cfg [0 ])
73- return {' feature_collection' : feature_collection }
79+ return {" feature_collection" : feature_collection }
7480 else :
75- return {' error' : "Dataset not found or permission error" }
81+ return {" error" : "Dataset not found or permission error" }
7682
7783 def _index (self , filterexpr , cfg ):
7884 """Find features by filter query.
7985
8086 :param (sql, params) filterexpr: A filter expression as a tuple (sql_expr, bind_params)
8187 """
8288 db = self ._get_db (cfg )
83- table_name = cfg .get (' table_name' , ' search_v' )
84- geometry_column = cfg .get (' geometry_column' , ' geom' )
89+ table_name = cfg .get (" table_name" , " search_v" )
90+ geometry_column = cfg .get (" geometry_column" , " geom" )
8591
8692 # build query SQL
8793
8894 # select id
89- columns = ', ' .join (['"%s"' % self .primary_key ])
90- quoted_table = '.' .join (
91- map (lambda s : '"%s"' % s , table_name .split ('.' )))
95+ columns = ", " .join (['"%s"' % self .primary_key ])
96+ quoted_table = "." .join (map (lambda s : '"%s"' % s , table_name .split ("." )))
9297
9398 where_clauses = []
9499 params = {}
@@ -97,18 +102,23 @@ def _index(self, filterexpr, cfg):
97102 where_clauses .append (filterexpr [0 ])
98103 params .update (filterexpr [1 ])
99104
100- where_clause = "WHERE " + " AND " .join (
101- where_clauses ) if where_clauses else ""
105+ where_clause = "WHERE " + " AND " .join (where_clauses ) if where_clauses else ""
102106
103- sql = sql_text ("""
107+ sql = sql_text (
108+ """
104109 SELECT {columns},
105110 ST_AsGeoJSON(ST_CurveToLine("{geom}")) AS json_geom,
106111 ST_Srid("{geom}") AS srid,
107112 ST_Extent("{geom}") OVER () AS bbox_
108113 FROM {table}
109114 {where_clause}
110- """ .format (columns = columns , geom = geometry_column ,
111- table = quoted_table , where_clause = where_clause ))
115+ """ .format (
116+ columns = columns ,
117+ geom = geometry_column ,
118+ table = quoted_table ,
119+ where_clause = where_clause ,
120+ )
121+ )
112122
113123 # connect to database and start transaction (for read-only access)
114124 conn = db .connect ()
@@ -123,32 +133,36 @@ def _index(self, filterexpr, cfg):
123133 for row in result :
124134 # NOTE: feature CRS removed by marshalling
125135 features .append (self ._feature_from_query (row ))
126- srid = row [' srid' ]
127- bbox = row [' bbox_' ]
136+ srid = row [" srid" ]
137+ bbox = row [" bbox_" ]
128138
129139 if bbox :
130140 m = BBOX_RE .match (bbox )
131141 # xmin, ymin, xmax, ymax
132- bbox = [float (m .group (1 )), float (m .group (3 )),
133- float (m .group (5 )), float (m .group (7 ))]
142+ bbox = [
143+ float (m .group (1 )),
144+ float (m .group (3 )),
145+ float (m .group (5 )),
146+ float (m .group (7 )),
147+ ]
134148
135149 # roll back transaction and close database connection
136150 trans .rollback ()
137151 conn .close ()
138152
139153 return {
140- ' type' : ' FeatureCollection' ,
141- ' crs' : {
142- ' type' : ' name' ,
143- ' properties' : {
154+ " type" : " FeatureCollection" ,
155+ " crs" : {
156+ " type" : " name" ,
157+ " properties" : {
144158 # NOTE: return CRS name as EPSG:xxxx and not as OGC URN
145159 # to work with QWC2 dataset search
146- ' name' : ' EPSG:%d' % srid
160+ " name" : " EPSG:%d" % srid
147161 # 'name': 'urn:ogc:def:crs:EPSG::%d' % srid
148- }
162+ },
149163 },
150- ' features' : features ,
151- ' bbox' : bbox
164+ " features" : features ,
165+ " bbox" : bbox ,
152166 }
153167
154168 def _parse_filter (self , filterstr ):
@@ -201,8 +215,8 @@ def _feature_from_query(self, row):
201215 pk = str (pk )
202216
203217 return {
204- ' type' : ' Feature' ,
205- 'id' : pk ,
206- ' geometry' : json .loads (row [' json_geom' ] or ' null' ),
207- ' properties' : {}
218+ " type" : " Feature" ,
219+ "id" : pk ,
220+ " geometry" : json .loads (row [" json_geom" ] or " null" ),
221+ " properties" : {},
208222 }
0 commit comments