diff --git a/server/lake_relations/overpass_query.txt b/server/lake_relations/overpass_query.txt index b584a5a44f99a12e58de95a509e9d4b402a7b7fb..611940c78356c3fa5bb70b635b7a784f80fcb0a6 100644 --- a/server/lake_relations/overpass_query.txt +++ b/server/lake_relations/overpass_query.txt @@ -1,11 +1 @@ -The following query - -[out:json]; -( - way["natural"="water"]["name"="lakeName"]; - relation["natural"="water"]["name"="lakeName"]; -); -/*added by auto repair*/ -(._;>;); -/*end of auto repair*/ -out body; +The following query \ No newline at end of file diff --git a/server/map/__pycache__/get_relation.cpython-311.pyc b/server/map/__pycache__/get_relation.cpython-311.pyc index 9133a38b51eb7799dc10e304937f79ddd98aaa6c..3b204b16e11294fd9832026311597b2109e3ac82 100644 Binary files a/server/map/__pycache__/get_relation.cpython-311.pyc and b/server/map/__pycache__/get_relation.cpython-311.pyc differ diff --git a/server/map/get_relation.py b/server/map/get_relation.py index 7cfa0cfd3f5f78251281c4c4c39a6725c8c98321..81a91db99ddf7522d17986542f463450098d37c7 100644 --- a/server/map/get_relation.py +++ b/server/map/get_relation.py @@ -10,14 +10,29 @@ polygon_min_x = None # The left most point of the entire polygon # Read a json file with relation data and send to response object def get_relation(self, body_of_water: str): # NB: implement body_of_water - divided_map = [] # List to store map shapes while splitting - # NB: test polygon, remove after testing - polygons = [circle_polygon()] + # Load GeoJSON data using geopandas + geo_data = gpd.read_file("server/map/mjosa.geojson") + + # Filter only polygons, exclude points and other feature types to reduce response size + polygon_data = geo_data[geo_data['geometry'].geom_type == 'Polygon'] + + # Extract coordinates from polygons and create polygon objects + polygons = [Polygon(polygon.exterior) for polygon in polygon_data['geometry']] + + if len(polygons) <= 1: # Return if conversion to polygon fails + print("Failed to convert to polygons") + return + divided_map = [] # List to store map shapes while splitting + polygon_counter = 1 + num_of_polygons = len(polygons) + + print("Dividing map... This may take a few minutes. As reference, " + "a cell size of 0.01 takes approximately 13 minutes") # Divide all polygons into sections for polygon in polygons: - cell_size = 1 + cell_size = 0.04 # NB smaller values require patience # Divide the length and with of polygon into a grid of equally sized parts lines = create_grid(polygon, cell_size) @@ -28,18 +43,24 @@ def get_relation(self, body_of_water: str): # NB: implement body_of_water divided_map = combine_gird_with_poly(polygon, lines) + print("Polygon nr.", polygon_counter, " finished processing. ", num_of_polygons-polygon_counter, + " polygons left to process.") + polygon_counter += 1 + + break + tiles = gpd.GeoDataFrame(geometry=divided_map) # NB test plot fig, ax = plt.subplots() - ax.set_aspect(1) + ax.set_aspect(1.5) # Plot the divided_map tiles.plot(ax=ax, facecolor='none', edgecolor='black') for i, tile in enumerate(tiles.geometry): random_color = "#{:06x}".format(random.randint(0, 0xFFFFFF)) - gpd.GeoSeries(tile).plot(ax=ax, facecolor=random_color, edgecolor='black') + gpd.GeoSeries(tile).plot(ax=ax, facecolor=random_color, edgecolor='none') plt.show() @@ -54,24 +75,6 @@ def get_relation(self, body_of_water: str): # NB: implement body_of_water # Write GeoJSON to response object self.wfile.write(tiles_json.encode('utf-8')) - -# NB: only for testing -def circle_polygon(): - circle_points = [] - num_points = 500 - center_x, center_y = 0.0, 0.0 - radius = 6 - - for i in range(num_points): - angle = 2 * np.pi * i / num_points - x = center_x + radius * np.cos(angle) - y = center_y + radius * np.sin(angle) - circle_points.append((x, y)) - circle_points.append(circle_points[0]) # Close the circle - - return Polygon(circle_points) - - def create_grid(poly: Polygon, cell_size): # Retrieve bounds of the entire polygon bounds = poly.bounds