Skip to content

Commit 7655cea

Browse files
authored
Merge pull request #500 from mapswipe/arbitrary_geom_changes_2
Add more properties based on osm and ohsome data to geojson and push them into postgres
2 parents 1ccfe08 + e8eac12 commit 7655cea

File tree

10 files changed

+163
-146
lines changed

10 files changed

+163
-146
lines changed

mapswipe_workers/mapswipe_workers/definitions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
LOGGING_FILE_PATH = os.path.join(DATA_PATH, "mapswipe_workers.log")
1414

1515
OHSOME_API_LINK = "https://api.ohsome.org/v1/"
16+
OSM_API_LINK = "https://www.openstreetmap.org/api/0.6/"
17+
1618
# number of geometries for project geometries
1719
MAX_INPUT_GEOMETRIES = 10
1820

mapswipe_workers/mapswipe_workers/project_types/arbitrary_geometry/group.py

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,15 @@ class Group(BaseGroup):
88
def __init__(self, project: object, groupId: int) -> None:
99
super().__init__(project, groupId)
1010

11-
def create_tasks(
12-
self,
13-
feature_ids: List,
14-
feature_geometries: List,
15-
center_points: List,
16-
reference: List,
17-
screen: List,
18-
) -> None:
11+
def create_tasks(self, feature_ids: List, features: List,) -> None:
1912
"""Create tasks for a group
2013
2114
feature_geometries is a list of geometries or feature in geojson format.
2215
These consist two keys: Coordinates and type.
2316
Coordinates of four two pair coordinates.
2417
Every coordinate pair is a vertex.
2518
"""
26-
for i in range(0, len(feature_ids)):
27-
task = Task(
28-
self,
29-
feature_ids[i],
30-
feature_geometries[i],
31-
center_points[i],
32-
reference[i],
33-
screen[i],
34-
)
19+
for i, feature_id in enumerate(feature_ids):
20+
task = Task(self, feature_id, features[i])
3521
self.tasks.append(task)
3622
self.numberOfTasks = len(self.tasks)
Lines changed: 6 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,5 @@
1-
import argparse
21
import json
32

4-
from osgeo import ogr
5-
6-
########################################################################################
7-
parser = argparse.ArgumentParser(description="Process some integers.")
8-
parser.add_argument(
9-
"-i",
10-
"--input_file",
11-
required=False,
12-
default=None,
13-
type=str,
14-
help="the input file containning the geometries as geojson",
15-
)
16-
parser.add_argument(
17-
"-g",
18-
"--group_size",
19-
required=False,
20-
default=50,
21-
type=int,
22-
help="the size of each group",
23-
)
24-
########################################################################################
25-
263

274
def group_input_geometries(input_geometries_file, group_size):
285
"""
@@ -43,17 +20,15 @@ def group_input_geometries(input_geometries_file, group_size):
4320
"feature_geometries" per group with given group id key
4421
"""
4522

46-
driver = ogr.GetDriverByName("GeoJSON")
47-
datasource = driver.Open(input_geometries_file, 0)
48-
layer = datasource.GetLayer()
49-
23+
with open(input_geometries_file, "r") as infile:
24+
layer = json.load(infile)
5025
groups = {}
5126

52-
# we will simply, we will start with min group id = 100
27+
# we will simply start with min group id = 100
5328
group_id = 100
5429
group_id_string = f"g{group_id}"
5530
feature_count = 0
56-
for feature in layer:
31+
for feature in layer["features"]:
5732
feature_count += 1
5833
# feature count starts at 1
5934
# assuming group size would be 10
@@ -65,55 +40,11 @@ def group_input_geometries(input_geometries_file, group_size):
6540
try:
6641
groups[group_id_string]
6742
except KeyError:
68-
# todo: change this and call feature_geoms -> geojson
69-
groups[group_id_string] = {
70-
"feature_ids": [],
71-
"feature_geometries": [],
72-
"center_points": [],
73-
"reference": [],
74-
"screen": [],
75-
}
43+
groups[group_id_string] = {"feature_ids": [], "features": []}
7644

7745
# we use a new id here based on the count
7846
# since we are not sure that GetFID returns unique values
7947
groups[group_id_string]["feature_ids"].append(feature_count)
80-
groups[group_id_string]["feature_geometries"].append(
81-
json.loads(feature.GetGeometryRef().ExportToJson())
82-
)
83-
84-
# from gdal documentation GetFieldAsDouble():
85-
# OFTInteger fields will be cast to double.
86-
# Other field types, or errors will result in a return value of zero.
87-
center_x = feature.GetFieldAsDouble("center_x")
88-
center_y = feature.GetFieldAsDouble("center_y")
89-
90-
# check if center attribute has been provided in geojson
91-
# normal tasks will never have a center of 0.0, 0.0
92-
# this is just in the middle of the ocean
93-
if (center_x == 0.0) and (center_y == 0.0):
94-
groups[group_id_string]["center_points"].append(None)
95-
else:
96-
groups[group_id_string]["center_points"].append([center_x, center_y])
97-
98-
# this is relevant for the tutorial
99-
reference = feature.GetFieldAsDouble("reference")
100-
screen = feature.GetFieldAsDouble("screen")
101-
groups[group_id_string]["reference"].append(reference)
102-
groups[group_id_string]["screen"].append(screen)
48+
groups[group_id_string]["features"].append(feature)
10349

10450
return groups
105-
106-
107-
# todo: groups should have this output formatting
108-
# reference is correct answer for tutorial,
109-
# if not tutorial reference = None
110-
# {"g100":[{"task_id":1, "screen": 1, "reference":0,
111-
# "geojson":{"valid geojson FeatureCollection Object"}}]}
112-
########################################################################################
113-
if __name__ == "__main__":
114-
115-
args = parser.parse_args()
116-
117-
groups = group_input_geometries(args.input_file, args.group_size)
118-
119-
print(groups)

mapswipe_workers/mapswipe_workers/project_types/arbitrary_geometry/project.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ def handle_input_type(self, raw_input_file: str):
4646
# write string to geom file
4747
ohsome_request = {"endpoint": "elements/geometry", "filter": self.filter}
4848

49-
result = ohsome(ohsome_request, self.geometry)
49+
result = ohsome(ohsome_request, self.geometry, properties="tags, metadata")
5050
with open(raw_input_file, "w") as geom_file:
5151
json.dump(result, geom_file)
5252
elif self.inputType == "TMId":
5353
logger.info("TMId detected")
5454
hot_tm_project_id = int(self.TMId)
5555
ohsome_request = {"endpoint": "elements/geometry", "filter": self.filter}
56-
result = ohsome(ohsome_request, self.geometry)
56+
result = ohsome(ohsome_request, self.geometry, properties="tags, metadata")
5757
result["properties"] = {}
5858
result["properties"]["hot_tm_project_id"] = hot_tm_project_id
5959
with open(raw_input_file, "w") as geom_file:
@@ -139,7 +139,8 @@ def validate_geometries(self):
139139
for feature in layer:
140140
feat_geom = feature.GetGeometryRef()
141141
geom_name = feat_geom.GetGeometryName()
142-
fid = feature.GetFID
142+
fid = feature.GetFID()
143+
143144
if not feat_geom.IsValid():
144145
layer.DeleteFeature(fid)
145146
logger.warning(
@@ -194,13 +195,7 @@ def create_groups(self):
194195

195196
for group_id, item in raw_groups.items():
196197
group = Group(self, group_id)
197-
group.create_tasks(
198-
item["feature_ids"],
199-
item["feature_geometries"],
200-
item["center_points"],
201-
item["reference"],
202-
item["screen"],
203-
)
198+
group.create_tasks(item["feature_ids"], item["features"])
204199

205200
# only append valid groups
206201
if group.is_valid():
Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Dict, List, Optional, Union
1+
from typing import Dict, Union
22

33
from osgeo import ogr
44

@@ -7,43 +7,30 @@
77

88
class Task(BaseTask):
99
def __init__(
10-
self,
11-
group: object,
12-
featureId: Union[int, str],
13-
featureGeometry: Dict,
14-
center: Optional[List[float]],
15-
reference: Optional[int],
16-
screen: Optional[int],
10+
self, group: object, featureId: Union[int, str], feature: Dict,
1711
):
1812
"""
1913
Parameters
2014
----------
21-
feature_geometry: dict
22-
The geometries or feature in geojson format.
23-
It consist of two keys: Coordinates and type.
24-
Coordinates of four two pair coordinates.
25-
Every coordinate pair is a vertex.
15+
feature: dict
16+
a Feature in geojson format.
2617
"""
2718
task_id = f"t{featureId}"
2819
super().__init__(group, taskId=task_id)
29-
self.geojson = featureGeometry
30-
31-
# only tasks that use Google tile map service need this
32-
if center:
33-
self.center = center
34-
20+
self.geojson = feature["geometry"]
21+
self.properties = feature["properties"]
3522
# only tasks that are part of a tutorial need this
36-
if screen:
37-
self.screen = screen
38-
self.reference = reference
23+
if "screen" in feature["properties"].keys():
24+
self.screen = feature["properties"]["screen"]
25+
self.reference = feature["properties"]["reference"]
3926

4027
# Remove projectId and groupId for tasks of Footprint project type
4128
del self.projectId
4229
del self.groupId
4330

4431
# create wkt geometry from geojson
4532
# this geometry will be stored in postgres
46-
# it will be remove before storing the data in firebase
47-
poly = ogr.CreateGeometryFromJson(str(featureGeometry))
33+
# it will be removed before storing the data in firebase
34+
poly = ogr.CreateGeometryFromJson(str(self.geojson))
4835
wkt_geometry = poly.ExportToWkt()
4936
self.geometry = wkt_geometry

mapswipe_workers/mapswipe_workers/project_types/base/project.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,10 @@ def save_project(self):
121121
del group["tasks"]
122122
groups[group["groupId"]] = group
123123
del project["groups"]
124+
124125
project.pop("inputGeometries", None)
125126
project.pop("validInputGeometries", None)
127+
126128
# Convert Date object to ISO Datetime:
127129
# https://www.w3.org/TR/NOTE-datetime
128130
project["created"] = self.created.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
@@ -230,7 +232,9 @@ def save_to_firebase(self, project, groups, groupsOfTasks):
230232
# since the tasks hold geometries their storage size
231233
# can get quite big otherwise
232234
if self.projectType in [ProjectType.FOOTPRINT.value]:
233-
# todo: remove extra information from geojson
235+
# removing properties from each task
236+
for task in tasks_list:
237+
task.pop("properties", None)
234238

235239
compressed_tasks = gzip_str.compress_tasks(tasks_list)
236240
task_upload_dict[
@@ -587,14 +591,22 @@ def create_tasks_txt_file(self, groupsOfTasks):
587591
# these common attributes don't need to be written
588592
# to the project_type_specifics since they are
589593
# already stored in separate columns
590-
common_attributes = ["projectId", "groupId", "taskId", "geometry"]
594+
common_attributes = [
595+
"projectId",
596+
"groupId",
597+
"taskId",
598+
"geometry",
599+
"geojson",
600+
]
591601

592602
for key in task.keys():
593603
if key not in common_attributes:
594604
output_dict["project_type_specifics"][key] = task[key]
595605
output_dict["project_type_specifics"] = json.dumps(
596606
output_dict["project_type_specifics"]
597-
)
607+
).replace(
608+
"'", ""
609+
) # to prevent error: invalid token "'"
598610

599611
w.writerow(output_dict)
600612
tasks_txt_file.close()

mapswipe_workers/mapswipe_workers/project_types/base/task.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class BaseTask(object):
1010

1111
def __init__(self, group, taskId):
1212
"""
13-
The Constructor Method for a task instance
13+
The Constructor Method for a task instance
1414
1515
Parameters
1616
----------

0 commit comments

Comments
 (0)