From 967a86622f05c73b2bef7b9d392257ef66bc3524 Mon Sep 17 00:00:00 2001
From: Sara <sarasdj@stud.ntnu.no>
Date: Thu, 14 Mar 2024 09:45:39 +0100
Subject: [PATCH] update: backtrack to method 2

---
 .../__pycache__/get_relation.cpython-311.pyc  | Bin 8312 -> 4190 bytes
 server/map/get_relation.py                    | 169 +++---------------
 2 files changed, 26 insertions(+), 143 deletions(-)

diff --git a/server/map/__pycache__/get_relation.cpython-311.pyc b/server/map/__pycache__/get_relation.cpython-311.pyc
index f13e9b873b357cf5927106718f674e4048732460..d3f0c0786e20b0ddc077d121d821cf744be96425 100644
GIT binary patch
delta 2091
zcmb7EO>7%Q6rS1N+4cG-KXx3aN!&mR?twH(1EMX6APNH7s#OjsrpUP2jqB8Ztk<F`
zyCg_Cn5q?(=FnV_%z=`sJ%D;b9JqqG*u|)3rB;<t50N-na6z1Sv$hFsC=#QYH*em&
zdGF1e@68`C-HWe%;rFWuTHn{d8NUMe3tRLW*JXa+0Ol&vk&bgHiDBk)T%J$zc_Ara
zCg*cvUP?-NIVtB!l6W$lQ}Sxk*X6amKk4uCfn>n56-=%LJtmaw({Zw27mR^rP8T<X
z<e)BXpk!E=4IU%}BoQ4ipoFr`VmguFT=`@%x0)#yT=iJCU@TZ>wvb8iu9AaQ-Y_$U
z>#G#f=4z@^$TF=`M?HJNaQ$bB`f94UoO+)sIHuj^+3hmO;Veu)6QXJcJG{-mg5LRn
zp2AOaHI6m{5pIR24L%}aWGM*IsYq0EB+J)fIY*)?E*i3e-IT#(^>y~>&wPLl$kZj9
z2KmT@&E4d#VT5kL=rl*RhI%|gD;k}~5$!bO-yx1-D>Xk&Yl9Oye)trGGP-lhmUW(f
zrA6swUXfKt(1lu%9gA6eca&Bjs7}*GU7|nmqfhv3VWqz(T^Z<co_EdhgZDu&6CTxU
zzb@<KrgBYy&|!2MMxYU98VS&_eLCK)ajE#w^&)hyILynnAr>CJAq2&MjcQT0is<U2
zcZ98Bwk7C3U87hWz_ISRKnR?pm62X3wLP#A<^#1+ra*Lm#}s?E0D~UjCvak$C7pgF
z#zd3hoBkx8IzHwGma^tj&Pa7p;`)|MBW)R}jG5J4DP1ZV1>GfQij{&6m@*|eX^KEx
z$vAJZJt3DZTc*q`ek3g@go({;(WF00DJAF%Wh1w25_(vk5=914T9@Yph87wki@rm^
z1Yne#m|7&hM#O_{1f(jr2E$e5L1<+2wc27MG}R1ERmJ<n|A}@{yYf~uJlP=onq*&{
z?7Is(M;oDuW@w@+-VF_JPBudEW++}2TV&u4iQOi#PY-^sZp}5~)6MvFV`Qc|GSeWl
zO)^{e`U5T4)b`ZQ)wP*hH<cs!*17P9_`nMg)i%5CHp`ZmvV`o4X1V|s#uZ8~SIWBl
zQnBpv<!r(1r_rI8XAgp^D}qYSFrQ_|o&!>bvO)1)GoNSjP>&p;mxsPp55v+G*c;IK
zfruW1r@G2s7{s0Ca5i@upy%+8;E0X{MJwBaLu_J8=e%k%=PW4aUbA_dEOWNVXy(zH
zQ*0SZ8xUhCyD&#=e8JDkZ^!bNb2jg&wrY$2>PfW)@TA((e|b8&+mqV$^bgD6Nd~Oq
z6Y!r&9_Gp>t2dLCX~Ji|$@nQoj??pl@imp9G{sO=_A<@DSm<QF3?I}^(&O<?+Sw;y
zGI9(?`8y!%=)S-2(%b8=-rxIFLl|2>TAjNxxfyQt4XnS>mXH!ypKqzYYUSeo>i)aI
z;mxD9>CHo1;?{e$3-z_wOd~kk49-@C7U{o3hHsPM%_kdVyh+CEWV}U`>f*<NDsIcj
zr*%xUwcRG?H!ENgZ_R<p|7CH}i>j?6Em9Z4CIeAo$W<~%v6O~#Et?ULxS{gdbjirA
zJ_GW+VL=fyoOpS4eZ9S6sqB??r@&=;eQX>@>GxyfYwV+Sg?!pN>xzX+zO-u2Gl{?Z
zVWjfeLh3x!fMuGjm^;X3DZY-ph`hxANsi=;dL?JPXub<u46x;UK-xUUxP^x5z1~6x
y>JRnF?z)8z)gRyK#`x<C`|)&bsf}QIl$^$XJkdsflXw_Mu4LK>rpFR5_`d){;`yHd

literal 8312
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
aLxL>VqwXVQWDC#;Bo8YI&Oa-{yZAp*i9mP&

diff --git a/server/map/get_relation.py b/server/map/get_relation.py
index 50030107..6d7fc7ed 100644
--- a/server/map/get_relation.py
+++ b/server/map/get_relation.py
@@ -1,5 +1,6 @@
 import geopandas as gpd
-from shapely.geometry import Polygon, Point, LineString, MultiPolygon
+from shapely.geometry import Polygon, LineString
+from shapely.ops import linemerge, unary_union, polygonize
 import matplotlib.pyplot as plt
 import matplotlib.ticker as ticker
 import random
@@ -18,44 +19,14 @@ def get_relation(self, body_of_water: str):  # NB: implement body_of_water
 
     # Divide all polygons into sections
     for polygon in polygons:
-
-        cell_size = 0.4
+        cell_size = 1
         # Divide the length and with of polygon into a grid of equally sized parts
-        grid_lines = create_grid_coords(polygon, cell_size)
-
-        vrt_lines = grid_lines[0]  # Vertical grid coordinates
-        hrz_lines = grid_lines[1]  # Horizontal grid coordinates
-
-        # Cut polygon into horizontal sections, bottom to top
-        for hrz_line in hrz_lines:
-
-            # Split shape into upper and lower section as hrz_line as divider
-            divided_poly = cut_polygon_by_points(polygon, hrz_line, cell_size)
-            horizontal_section = divided_poly[0]  # Save upper horizontal section
-
-            polygon = divided_poly[1]  # Set polygon to the remaining, un-split shape for next iteration
-
-            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
+        lines = create_grid(polygon, cell_size)
 
-                # Set horizontal_section to the remaining, un-split, horizontal section for next iteration
-                horizontal_section = vertical_parts[1]
-
-            polygon = divided_poly[1]  # Set polygon to the remaining, un-split shape for next iteration
-
-        divided_map.append(polygon)
-
-        break
+        lines.append(polygon.boundary)
+        lines = unary_union(lines)
+        lines = linemerge(lines)
+        divided_map.extend(list(polygonize(lines)))
 
     tiles = gpd.GeoDataFrame(geometry=divided_map)
 
@@ -85,77 +56,6 @@ def get_relation(self, body_of_water: str):  # NB: implement body_of_water
     self.wfile.write(tiles_json.encode('utf-8'))
 
 
-def cut_polygon_by_points(polygon: Polygon, divisor: float, cell_size: float):
-    # Extract polygon exterior coordinates
-    exterior_coords = list(polygon.exterior.coords)
-
-    # Initialize lists to store coordinates of new shapes after split
-    split_shape = []
-    remaining_shape = []
-
-    # Loop through points and check which side of the division line they are
-    for i in range(len(exterior_coords) - 1):
-        point1 = Point(exterior_coords[i])
-        point2 = Point(exterior_coords[i + 1])
-
-        # Check if both points are on the same side of the divisor
-        if (point1.y < divisor and point2.y < divisor) or (point1.y >= divisor and point2.y >= divisor):
-            # Both points on same side, add to appropriate shape
-            if point1.y < divisor:
-                split_shape.append(exterior_coords[i])
-            else:
-                remaining_shape.append(exterior_coords[i])
-        else:
-            # Points on different sides, calculate intersection with divisor
-            x_intersect = point1.x + (divisor - point1.y) * (point2.x - point1.x) / (point2.y - point1.y)
-
-            # Add intersection point to both shapes
-            split_shape.append((x_intersect, divisor))
-            remaining_shape.append((x_intersect, divisor))
-
-            # Determine which side each original point belongs to
-            if point1.y < divisor:
-                split_shape.append((point2.x, point2.y))
-            else:
-                remaining_shape.append((point2.x, point2.y))
-
-    # Populate newly created edges with points to facilitate vertical cutting
-    populated_split = populate_new_edge(split_shape, cell_size, divisor)
-    if populated_split is not None:
-        split_shape = populated_split
-
-    populated_rem = populate_new_edge(remaining_shape, cell_size, divisor)
-    if populated_rem is not None:
-        remaining_shape = populated_rem
-
-    # Ensure that the shapes are closed loops
-    if len(split_shape) > 0 and split_shape[0] != split_shape[-1]:
-        split_shape.append(split_shape[0])
-
-    if len(remaining_shape) > 0 and remaining_shape[0] != remaining_shape[-1]:
-        remaining_shape.append(remaining_shape[0])
-
-    return Polygon(split_shape), Polygon(remaining_shape)
-
-
-# Generate grid of equally spaced x and y coordinates where the grid size is determined by cell_size
-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
-    polygon_min_x = min_x
-
-    # Divide grid into sections of size *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
-
-
 # NB: only for testing
 def circle_polygon():
     circle_points = []
@@ -173,42 +73,25 @@ def circle_polygon():
     return Polygon(circle_points)
 
 
-def populate_new_edge(polygon, cell_size: float, divisor: float):
-    if polygon is not None and polygon_min_x is not None:
-
-        final_shape = []
-        left_edge = []
-        left_most_point = None
-
-        # Add all coordinates on the right side of the divisor first
-        for i in range(len(polygon)):
-            x, y = polygon[i]
-            if x > divisor:
-                final_shape.append((x, y))
-            elif x < divisor:
-                left_edge.append((x, y))
-
-        if len(final_shape) < 1 or len(left_edge) < 1:
-            return None
-
-        # Find most left point in the polygon
-        for point in left_edge:
-            if not left_most_point:
-                left_most_point = point[0]
-            elif point[0] < left_most_point:
-                left_most_point = point[0]
+def create_grid(poly: Polygon, cell_size):
+    # Retrieve bounds of the entire polygon
+    bounds = poly.bounds
 
-        # Sort final_shape from bottom to top
-        if final_shape[0][1] > final_shape[-1][1]:
-            final_shape = sorted(final_shape, key=lambda point: final_shape[1])
+    min_x, min_y, max_x, max_y = bounds
+    grid_lines = []
 
-        i = 0
-        while polygon[i][0] < left_most_point:  # While to haven't reached left edge
-            final_shape.append(polygon[i][0] + cell_size)
-            i += 1
+    # Horizontal lines
+    y = min_y
+    while y <= max_y:
+        line = LineString([(min_x, y), (max_x, y)])
+        grid_lines.append(line)
+        y += cell_size
 
-        # NB VERY IMPORTANT MUST CREATE LOGIC FOR SHAPES THAT ARE SPLIT
-        final_shape.append(left_edge)
-        final_shape.append(final_shape[0])
+    # Vertical lines
+    x = min_x
+    while x <= max_x:
+        line = LineString([(x, min_y), (x, max_y)])
+        grid_lines.append(line)
+        x += cell_size
 
-        return final_shape
+    return grid_lines
-- 
GitLab