66from mapswipe_workers .definitions import DATA_PATH
77from mapswipe_workers .definitions import logger
88from mapswipe_workers .base .base_project import BaseProject
9- from mapswipe_workers .project_types .build_area .build_area_group \
10- import BuildAreaGroup
11- from mapswipe_workers .project_types .build_area \
12- import grouping_functions
9+ from mapswipe_workers .project_types .build_area .build_area_group import BuildAreaGroup
10+ from mapswipe_workers .utils import tile_grouping_functions as grouping_functions
1311from mapswipe_workers .definitions import CustomError
1412
13+
1514class BuildAreaProject (BaseProject ):
1615 """
1716 The subclass for an import of the type Footprint
@@ -24,80 +23,79 @@ def __init__(self, project_draft):
2423 super ().__init__ (project_draft )
2524
2625 # set group size
27- self .groupSize = project_draft [' groupSize' ]
28- self .geometry = project_draft [' geometry' ]
29- self .zoomLevel = int (project_draft .get (' zoomLevel' , 18 ))
30- self .tileServer = self .get_tile_server (project_draft [' tileServer' ])
26+ self .groupSize = project_draft [" groupSize" ]
27+ self .geometry = project_draft [" geometry" ]
28+ self .zoomLevel = int (project_draft .get (" zoomLevel" , 18 ))
29+ self .tileServer = self .get_tile_server (project_draft [" tileServer" ])
3130
3231 def validate_geometries (self ):
3332 raw_input_file = (
34- f'{ DATA_PATH } /input_geometries/'
35- f'raw_input_{ self .projectId } .geojson'
36- )
33+ f"{ DATA_PATH } /input_geometries/" f"raw_input_{ self .projectId } .geojson"
34+ )
3735 # check if a 'data' folder exists and create one if not
38- if not os .path .isdir (' {}/input_geometries' .format (DATA_PATH )):
39- os .mkdir (' {}/input_geometries' .format (DATA_PATH ))
36+ if not os .path .isdir (" {}/input_geometries" .format (DATA_PATH )):
37+ os .mkdir (" {}/input_geometries" .format (DATA_PATH ))
4038
4139 # write string to geom file
42- with open (raw_input_file , 'w' ) as geom_file :
40+ with open (raw_input_file , "w" ) as geom_file :
4341 json .dump (self .geometry , geom_file )
4442
45- driver = ogr .GetDriverByName (' GeoJSON' )
43+ driver = ogr .GetDriverByName (" GeoJSON" )
4644 datasource = driver .Open (raw_input_file , 0 )
4745
4846 try :
4947 layer = datasource .GetLayer ()
50- except :
48+ except AttributeError :
5149 logger .warning (
52- f' { self .projectId } '
53- f' - validate geometry - '
54- f' Could not get layer for datasource'
50+ f" { self .projectId } "
51+ f" - validate geometry - "
52+ f" Could not get layer for datasource"
5553 )
56- raise CustomError (f' could not get layer for datasource' )
54+ raise CustomError (f" could not get layer for datasource" )
5755
5856 # check if layer is empty
5957 if layer .GetFeatureCount () < 1 :
6058 logger .warning (
61- f' { self .projectId } '
62- f' - validate geometry - '
63- f' Empty file. '
64- f' No geometry is provided.'
65- )
66- raise CustomError (f' Empty file. ' )
59+ f" { self .projectId } "
60+ f" - validate geometry - "
61+ f" Empty file. "
62+ f" No geometry is provided."
63+ )
64+ raise CustomError (f" Empty file. " )
6765
6866 # check if more than 1 geometry is provided
6967 elif layer .GetFeatureCount () > 1 :
7068 logger .warning (
71- f' { self .projectId } '
72- f' - validate geometry - '
73- f' Input file contains more than one geometry. '
74- f' Make sure to provide exact one input geometry.'
75- )
76- raise CustomError (f' Input file contains more than one geometry. ' )
69+ f" { self .projectId } "
70+ f" - validate geometry - "
71+ f" Input file contains more than one geometry. "
72+ f" Make sure to provide exact one input geometry."
73+ )
74+ raise CustomError (f" Input file contains more than one geometry. " )
7775
7876 # check if the input geometry is a valid polygon
7977 for feature in layer :
8078 feat_geom = feature .GetGeometryRef ()
8179 geom_name = feat_geom .GetGeometryName ()
8280 if not feat_geom .IsValid ():
8381 logger .warning (
84- f' { self .projectId } '
85- f' - validate geometry - '
86- f' Geometry is not valid: { geom_name } . '
87- f' Tested with IsValid() ogr method. '
88- f' Probably self-intersections.'
89- )
90- raise CustomError (f' Geometry is not valid: { geom_name } . ' )
82+ f" { self .projectId } "
83+ f" - validate geometry - "
84+ f" Geometry is not valid: { geom_name } . "
85+ f" Tested with IsValid() ogr method. "
86+ f" Probably self-intersections."
87+ )
88+ raise CustomError (f" Geometry is not valid: { geom_name } . " )
9189
9290 # we accept only POLYGON or MULTIPOLYGON geometries
93- if geom_name != ' POLYGON' and geom_name != ' MULTIPOLYGON' :
91+ if geom_name != " POLYGON" and geom_name != " MULTIPOLYGON" :
9492 logger .warning (
95- f' { self .projectId } '
96- f' - validate geometry - '
97- f' Invalid geometry type: { geom_name } . '
98- f'Please provide "POLYGON" or "MULTIPOLYGON"'
99- )
100- raise CustomError (f' Invalid geometry type: { geom_name } . ' )
93+ f" { self .projectId } "
94+ f" - validate geometry - "
95+ f" Invalid geometry type: { geom_name } . "
96+ f'Please provide "POLYGON" or "MULTIPOLYGON"'
97+ )
98+ raise CustomError (f" Invalid geometry type: { geom_name } . " )
10199
102100 # get geometry as wkt
103101 wkt_geometry = feat_geom .ExportToWkt ()
@@ -106,7 +104,9 @@ def validate_geometries(self):
106104 # for doing this we transform the geometry into Mollweide projection (EPSG Code 54009)
107105 source = feat_geom .GetSpatialReference ()
108106 target = osr .SpatialReference ()
109- target .ImportFromProj4 ('+proj=moll +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs' )
107+ target .ImportFromProj4 (
108+ "+proj=moll +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs"
109+ )
110110
111111 transform = osr .CoordinateTransformation (source , target )
112112 feat_geom .Transform (transform )
@@ -118,24 +118,23 @@ def validate_geometries(self):
118118
119119 if project_area > max_area :
120120 logger .warning (
121- f'{ self .projectId } '
122- f' - validate geometry - '
123- f'Project is to large: { project_area } sqkm. '
124- f'Please split your projects into smaller sub-projects and resubmit'
121+ f"{ self .projectId } "
122+ f" - validate geometry - "
123+ f"Project is to large: { project_area } sqkm. "
124+ f"Please split your projects into smaller sub-projects and resubmit"
125+ )
126+ raise CustomError (
127+ f"Project is to large: { project_area } sqkm. Max area for zoom level { self .zoomLevel } = { max_area } sqkm"
125128 )
126- raise CustomError (f'Project is to large: { project_area } sqkm. Max area for zoom level { self .zoomLevel } = { max_area } sqkm' )
127-
128129
129130 del datasource
130131 del layer
131132
132133 self .validInputGeometries = raw_input_file
133134
134135 logger .info (
135- f'{ self .projectId } '
136- f' - validate geometry - '
137- f'input geometry is correct.'
138- )
136+ f"{ self .projectId } " f" - validate geometry - " f"input geometry is correct."
137+ )
139138
140139 return wkt_geometry
141140
@@ -145,17 +144,14 @@ def create_groups(self):
145144 """
146145 # first step get properties of each group from extent
147146 raw_groups = grouping_functions .extent_to_slices (
148- self .validInputGeometries ,
149- self .zoomLevel
150- )
147+ self .validInputGeometries , self .zoomLevel , self .groupSize
148+ )
151149
152150 for group_id , slice in raw_groups .items ():
153151 group = BuildAreaGroup (self , group_id , slice )
154152 group .create_tasks (self )
155153 self .groups .append (group )
156154
157155 logger .info (
158- f'{ self .projectId } '
159- f' - create_groups - '
160- f'created groups dictionary'
161- )
156+ f"{ self .projectId } " f" - create_groups - " f"created groups dictionary"
157+ )
0 commit comments