|
| 1 | +import json |
| 2 | +import urllib |
| 3 | + |
| 4 | +from mapswipe_workers.definitions import logger |
| 5 | +from mapswipe_workers.firebase.firebase import Firebase |
| 6 | +from mapswipe_workers.firebase_to_postgres.transfer_results import ( |
| 7 | + results_to_file, |
| 8 | + save_results_to_postgres, |
| 9 | + truncate_temp_results, |
| 10 | +) |
| 11 | +from mapswipe_workers.generate_stats.project_stats import ( |
| 12 | + get_statistics_for_integer_result_project, |
| 13 | +) |
| 14 | +from mapswipe_workers.project_types.arbitrary_geometry.project import ( |
| 15 | + ArbitraryGeometryProject, |
| 16 | +) |
| 17 | +from mapswipe_workers.utils.api_calls import geojsonToFeatureCollection, ohsome |
| 18 | + |
| 19 | + |
| 20 | +class ConflationProject(ArbitraryGeometryProject): |
| 21 | + def __init__(self, project_draft): |
| 22 | + super().__init__(project_draft) |
| 23 | + self.inputType = project_draft["inputType"] |
| 24 | + |
| 25 | + def handle_input_type(self, raw_input_file: str): |
| 26 | + """ |
| 27 | + Handle different input types. |
| 28 | +
|
| 29 | + Input (self.geometry) can be: |
| 30 | + 'aoi_file' -> query ohsome with aoi from geometry then write |
| 31 | + result to raw_input_file |
| 32 | + a Link (str) -> download geojson from link and write to raw_input_file |
| 33 | + a TMId -> get project info from geometry and query ohsome |
| 34 | + for objects, then write to raw_input_file. |
| 35 | + """ |
| 36 | + if not isinstance(self.geometry, str): |
| 37 | + self.geometry = geojsonToFeatureCollection(self.geometry) |
| 38 | + self.geometry = json.dumps(self.geometry) |
| 39 | + |
| 40 | + if self.inputType == "aoi_file": |
| 41 | + logger.info("aoi file detected") |
| 42 | + # write string to geom file |
| 43 | + ohsome_request = {"endpoint": "elements/geometry", "filter": self.filter} |
| 44 | + |
| 45 | + result = ohsome(ohsome_request, self.geometry, properties="tags, metadata") |
| 46 | + with open(raw_input_file, "w") as geom_file: |
| 47 | + json.dump(result, geom_file) |
| 48 | + elif self.inputType == "TMId": |
| 49 | + logger.info("TMId detected") |
| 50 | + hot_tm_project_id = int(self.TMId) |
| 51 | + ohsome_request = {"endpoint": "elements/geometry", "filter": self.filter} |
| 52 | + result = ohsome(ohsome_request, self.geometry, properties="tags, metadata") |
| 53 | + result["properties"] = {} |
| 54 | + result["properties"]["hot_tm_project_id"] = hot_tm_project_id |
| 55 | + with open(raw_input_file, "w") as geom_file: |
| 56 | + json.dump(result, geom_file) |
| 57 | + elif self.inputType == "link": |
| 58 | + logger.info("link detected") |
| 59 | + urllib.request.urlretrieve(self.geometry, raw_input_file) |
| 60 | + |
| 61 | + def save_tasks_to_firebase(self, projectId: str, tasks: dict): |
| 62 | + firebase = Firebase() |
| 63 | + firebase.save_tasks_to_firebase(projectId, tasks, useCompression=True) |
| 64 | + |
| 65 | + @staticmethod |
| 66 | + def results_to_postgres(results: dict, project_id: str, filter_mode: bool): |
| 67 | + """How to move the result data from firebase to postgres.""" |
| 68 | + results_file, user_group_results_file = results_to_file(results, project_id) |
| 69 | + truncate_temp_results() |
| 70 | + save_results_to_postgres(results_file, project_id, filter_mode) |
| 71 | + return user_group_results_file |
| 72 | + |
| 73 | + @staticmethod |
| 74 | + def get_per_project_statistics(project_id, project_info): |
| 75 | + """How to aggregate the project results.""" |
| 76 | + return get_statistics_for_integer_result_project( |
| 77 | + project_id, project_info, generate_hot_tm_geometries=False |
| 78 | + ) |
0 commit comments