diff --git a/server/map/get_lake.py b/server/map/get_lake.py index f25054f1fe8685e44b0b0411c8bcfc54c74b7b06..e9f9ce76ec363944a9537282811870fe331852f6 100644 --- a/server/map/get_lake.py +++ b/server/map/get_lake.py @@ -1,5 +1,5 @@ import geopandas as gpd -from shapely.geometry import Polygon, LineString, MultiLineString +from shapely.geometry import Polygon, MultiPolygon from shapely.ops import linemerge, unary_union, polygonize import json from server.map.add_new_lake import write_json_to_file @@ -19,6 +19,7 @@ def fetch_divided_map(self, file_name): self.wfile.write(data.encode('utf-8')) +# Create groups creates polygons which consist of groupings of related subdivisions def create_groups(relation_file: str, data: list): # Read lake relation from json file geo_data = gpd.read_file("server/lake_relations/" + relation_file + "_div.json") @@ -40,29 +41,44 @@ def create_groups(relation_file: str, data: list): if feature['sub_div_id'] == subDivID: subdiv_list.append((group_id, Polygon([feature['coordinates']]))) - # Sort subdiv_list in ascending order of group_ids - # While group_id is same -> merge all polygons and give each a group id - # new_polygons.append((group_id, new_shape)) - - - # Put the coordinates and group id of each new polygon in the expected structure - for polygon in new_polygons: - - ''' - Expected structure: - { - "type": "Feature", - "properties": { - "group_id": "0", - }, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - 10.4304,... - ''' + # Sort subdiv_list based on group_ids + sorted_list = sorted(subdiv_list, key=lambda x: x[0]) + current_group = -1 # Current group_id + # While group_id is same -> merge all polygons and give each a group id + for element in sorted_list: + new_shape = [] + if element[0] == current_group: + new_shape.append(element[1]) + + elif current_group > -1: + merged_polygon = MultiPolygon(new_shape).buffer(0) + + # Convert MultiPolygon to Polygon + if isinstance(merged_polygon, MultiPolygon): + merged_polygon = merged_polygon.convex_hull + + # Add following structure to new polygon + ''' + Expected structure: + { + "type": "Feature", + "properties": { + "group_id": "0", + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 10.4304,... + ''' + + # Append to new_polygons + + current_group = element[0] # Update current group to new group_id + else: + current_group = element[0] # Convert GeoDataFrame to JSON