Skip to content

Commit 808b2c6

Browse files
committed
move tile grouping functions to utils instead of having them duplicated for build area and change detection #242
1 parent 6176cd2 commit 808b2c6

File tree

7 files changed

+200
-941
lines changed

7 files changed

+200
-941
lines changed

mapswipe_workers/mapswipe_workers/project_types/build_area/build_area_project.py

Lines changed: 60 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66
from mapswipe_workers.definitions import DATA_PATH
77
from mapswipe_workers.definitions import logger
88
from 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
1311
from mapswipe_workers.definitions import CustomError
1412

13+
1514
class 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

Comments
 (0)