From a4a9d7035580989fe87042cbc0cde7275ff59cc0 Mon Sep 17 00:00:00 2001 From: Sara <sarasdj@stud.ntnu.no> Date: Wed, 13 Mar 2024 11:50:51 +0100 Subject: [PATCH] update: test with circle, update grid creation --- .../__pycache__/get_relation.cpython-311.pyc | Bin 6653 -> 7317 bytes server/map/get_relation.py | 60 +++++++++--------- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/server/map/__pycache__/get_relation.cpython-311.pyc b/server/map/__pycache__/get_relation.cpython-311.pyc index 140394c18ade684876d995f2db2b1352085f9609..744144e33606421cf5d36ed1c24d8c6e2ddab9df 100644 GIT binary patch delta 3393 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 Pk;I(LP#bL~)R6xN%Iff= delta 2759 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 MumBYwj;;Ow4|~av$p8QV diff --git a/server/map/get_relation.py b/server/map/get_relation.py index c43bb700..52b037aa 100644 --- a/server/map/get_relation.py +++ b/server/map/get_relation.py @@ -26,12 +26,15 @@ def get_relation(self, body_of_water: str): # NB: implement body_of_water if not polygons: raise ValueError("Failed to convert to polygons") - divided_map = [] + divided_map = [] # List to store map shapes while splitting + + # NB: test polygon, remove after testing + polygons = [circle_polygon()] # Divide all polygons into sections for polygon in polygons: - cell_size = 0.1 + cell_size = 0.4 # Divide the length and with of polygon into a grid of equally sized parts grid_lines = create_grid_coords(polygon, cell_size) @@ -50,18 +53,7 @@ def get_relation(self, body_of_water: str): # NB: implement body_of_water if not horizontal_section or not divided_poly[0]: continue - # Cut each horizontal section into vertical sections, right to left - for vrt_line in vrt_lines: - if len(horizontal_section.exterior.coords) < 3: - break # Break from loop im remaining section has no coordinates - - # Split the horizontal section into two vertical parts - vertical_parts = cut_polygon_by_points(horizontal_section, vrt_line, -0.1) - - divided_map.append(vertical_parts[0]) # Append split vertical sections to final list of shapes - - # Set horizontal_section to the remaining, un-split, horizontal section for next iteration - horizontal_section = vertical_parts[1] + divided_map.append(horizontal_section) divided_map.append(polygon) @@ -115,7 +107,9 @@ def cut_polygon_by_points(polygon: Polygon, divisor: float, cell_size: float): remaining_shape.append(point) # Add points to the newly created edges of split_shape and remaining_shape - split_shape, remaining_shape = populate_new_edge(split_shape, remaining_shape, cell_size, divisor) + populate_new_edge(split_shape, remaining_shape, cell_size, divisor) + #split_shape = shape_w_edges[0] + #remaining_shape = shape_w_edges[1] else: # Vertical split for point in exterior_coords: @@ -154,11 +148,10 @@ def populate_new_edge(split_shape, remaining_shape, cell_size: float, divisor: f right_corner = split_shape[-1] left_corner = split_shape[0] - print("right_corner: ", right_corner, " left_corner: ", left_corner, " cell_size: ", cell_size) + print("right_corner: ", right_corner, " left_corner: ", left_corner, " left == right?: ", left_corner == right_corner) while starting_point < left_corner.x: # Increment starting point until it is withing the polygons bounds starting_point += cell_size - # if starting_point < left_corner.x: # NB: optimised substitute for previous while loop, requires testing # starting_point += cell_size * math.floor(starting_point - left_corner.x) @@ -177,19 +170,28 @@ def create_grid_coords(polygon: Polygon, cell_size: float): # Define boundaries of grid min_x, min_y, max_x, max_y = polygon.bounds - global polygon_min_x # Set value of global variable - polygon_min_x = min_x - # Divide grid into sections of size *cell_size - x_coords = np.arange(min_x, max_x, cell_size) - y_coords = np.arange(min_y, max_y, cell_size) + x_step = max((max_x - min_x) / 10, cell_size) + y_step = max((max_y - min_y) / 10, cell_size) + + x_coords = np.arange(min_x, max_x + x_step, x_step) + y_coords = np.arange(min_y, max_y + y_step, y_step) + + return x_coords, y_coords + - # Round coordinates to 4 decimals - x_coords_rounded = np.around(x_coords, decimals=4) - y_coords_rounded = np.around(y_coords, decimals=4) +# NB: only for testing +def circle_polygon(): + circle_points = [] + num_points = 80 + center_x, center_y = 0.0, 0.0 + radius = 6 - if len(x_coords_rounded) == 0 or len(y_coords_rounded) == 0: - raise ValueError("No grid points generated") + 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 tuple of list of x coordinates and list of y coordinates - return x_coords_rounded, y_coords_rounded + return Polygon(circle_points) \ No newline at end of file -- GitLab