@@ -27,7 +27,7 @@ def csv_to_geojson(filename: str, geometry_field: str = "geom"):
2727 outfile ,
2828 filename ,
2929 "-sql" ,
30- f'SELECT *, CAST({ geometry_field } as geometry) FROM "{ filename_without_path } "' ,
30+ f'SELECT *, CAST({ geometry_field } as geometry) FROM "{ filename_without_path } "' , # noqa E501
3131 ],
3232 check = True ,
3333 )
@@ -101,28 +101,60 @@ def add_metadata_to_geojson(filename: str, geometry_field: str = "geom"):
101101 logger .info (f"added metadata to { filename } ." )
102102
103103
104- def create_group_geom (group_data ):
104+ def create_group_geom (group_data , shape = "bounding_box" ):
105+ """Create bounding box or convex hull of input task geometries."""
106+
105107 result_geom_collection = ogr .Geometry (ogr .wkbMultiPolygon )
106108 for result , data in group_data .items ():
107109 result_geom = ogr .CreateGeometryFromWkt (data ["wkt" ])
108110 result_geom_collection .AddGeometry (result_geom )
109111
110- group_geom = result_geom_collection .ConvexHull ()
112+ if shape == "convex_hull" :
113+ group_geom = result_geom_collection .ConvexHull ()
114+ elif shape == "bounding_box" :
115+ # Get Envelope
116+ lon_left , lon_right , lat_top , lat_bottom = result_geom_collection .GetEnvelope ()
117+
118+ # Create Geometry
119+ ring = ogr .Geometry (ogr .wkbLinearRing )
120+ ring .AddPoint (lon_left , lat_top )
121+ ring .AddPoint (lon_right , lat_top )
122+ ring .AddPoint (lon_right , lat_bottom )
123+ ring .AddPoint (lon_left , lat_bottom )
124+ ring .AddPoint (lon_left , lat_top )
125+ # TODO: Make sure to return 2D geom, currently 3D with z = 0.0
126+ group_geom = ogr .Geometry (ogr .wkbPolygon )
127+ group_geom .AddGeometry (ring )
128+
111129 return group_geom
112130
113131
114132def create_geojson_file_from_dict (final_groups_dict , outfile ):
115- # TODO: adapt input name
133+ """Take output from generate stats and create TM geometries.
134+
135+ In order to create a GeoJSON file with a coordinate precision of 7
136+ we take a small detour.
137+ First, we create a GeoJSONSeq file.
138+ This contains only the features.
139+ Then we add these features to the final GeoJSON file.
140+ The current shape of the output geometries is set to 'bounding_box'.
141+ """
116142
117- driver = ogr .GetDriverByName ("GeoJSON " )
143+ driver = ogr .GetDriverByName ("GeoJSONSeq " )
118144 # define spatial Reference
119145 srs = osr .SpatialReference ()
120146 srs .ImportFromEPSG (4326 )
147+ outfile_temp = outfile .replace (".geojson" , "_temp.geojson" )
148+
149+ if os .path .exists (outfile_temp ):
150+ driver .DeleteDataSource (outfile_temp )
151+
121152 if os .path .exists (outfile ):
122153 driver .DeleteDataSource (outfile )
123- dataSource = driver .CreateDataSource (outfile )
154+
155+ dataSource = driver .CreateDataSource (outfile_temp )
124156 # create layer
125- layer = dataSource .CreateLayer (outfile , srs , geom_type = ogr .wkbPolygon )
157+ layer = dataSource .CreateLayer (outfile_temp , srs , geom_type = ogr .wkbPolygon , )
126158
127159 # create fields
128160 field_id = ogr .FieldDefn ("group_id" , ogr .OFTInteger )
@@ -133,7 +165,8 @@ def create_geojson_file_from_dict(final_groups_dict, outfile):
133165 else :
134166 for group_id in final_groups_dict .keys ():
135167 group_data = final_groups_dict [group_id ]
136- group_geom = create_group_geom (group_data )
168+ # create the final group geometry
169+ group_geom = create_group_geom (group_data , "bounding_box" )
137170 final_groups_dict [group_id ]["group_geom" ] = group_geom
138171 # init feature
139172
@@ -163,21 +196,54 @@ def create_geojson_file_from_dict(final_groups_dict, outfile):
163196 print (group_geom )
164197 continue
165198
199+ # make sure to close layer and data source
166200 layer = None
167- logger .info ("created outfile: %s." % outfile )
201+ dataSource = None
202+
203+ # load the features from temp file
204+ feature_collection = []
205+ with open (outfile_temp , "r" ) as f :
206+ for cnt , line in enumerate (f ):
207+ feature_collection .append (json .loads (line ))
208+
209+ # create final geojson structure
210+ geojson_structure = {
211+ "type" : "FeatureCollection" ,
212+ "name" : outfile ,
213+ "crs" : {
214+ "type" : "name" ,
215+ "properties" : {"name" : "urn:ogc:def:crs:OGC:1.3:CRS84" },
216+ },
217+ "features" : feature_collection ,
218+ }
219+
220+ # save to geojson
221+ with open (outfile , "w" ) as json_file :
222+ json .dump (geojson_structure , json_file )
223+ logger .info ("created outfile: %s." % outfile )
224+
225+ # remove temp file
226+ if os .path .exists (outfile_temp ):
227+ driver .DeleteDataSource (outfile_temp )
168228
169229
170230def create_geojson_file (geometries , outfile ):
171231
172- driver = ogr .GetDriverByName ("GeoJSON " )
232+ driver = ogr .GetDriverByName ("GeoJSONSeq " )
173233 # define spatial Reference
174234 srs = osr .SpatialReference ()
175235 srs .ImportFromEPSG (4326 )
236+ outfile_temp = outfile .replace (".geojson" , "_temp.geojson" )
237+
238+ if os .path .exists (outfile_temp ):
239+ driver .DeleteDataSource (outfile_temp )
240+
176241 if os .path .exists (outfile ):
177242 driver .DeleteDataSource (outfile )
178- dataSource = driver .CreateDataSource (outfile )
243+
244+ dataSource = driver .CreateDataSource (outfile_temp )
179245 # create layer
180- layer = dataSource .CreateLayer (outfile , srs , geom_type = ogr .wkbPolygon )
246+ layer = dataSource .CreateLayer (outfile_temp , srs , geom_type = ogr .wkbPolygon , )
181247
182248 # create fields
183249 field_id = ogr .FieldDefn ("id" , ogr .OFTInteger )
@@ -198,5 +264,33 @@ def create_geojson_file(geometries, outfile):
198264 # add feature to layer
199265 layer .CreateFeature (feature )
200266
267+ # make sure to close layer and data source
201268 layer = None
269+ dataSource = None
270+
271+ # load the features from temp file
272+ feature_collection = []
273+ with open (outfile_temp , "r" ) as f :
274+ for cnt , line in enumerate (f ):
275+ feature_collection .append (json .loads (line ))
276+
277+ # create final geojson structure
278+ geojson_structure = {
279+ "type" : "FeatureCollection" ,
280+ "name" : outfile ,
281+ "crs" : {
282+ "type" : "name" ,
283+ "properties" : {"name" : "urn:ogc:def:crs:OGC:1.3:CRS84" },
284+ },
285+ "features" : feature_collection ,
286+ }
287+ # save to geojson
288+ with open (outfile , "w" ) as json_file :
289+ json .dump (geojson_structure , json_file )
290+ logger .info ("created outfile: %s." % outfile )
291+
292+ # remove temp file
293+ if os .path .exists (outfile_temp ):
294+ driver .DeleteDataSource (outfile_temp )
295+
202296 logger .info ("created outfile: %s." % outfile )
0 commit comments