From a906c973b6ff445743963e068be2884903963dd8 Mon Sep 17 00:00:00 2001
From: Sara <sarasdj@stud.ntnu.no>
Date: Mon, 11 Mar 2024 14:53:01 +0100
Subject: [PATCH] update: second split method

---
 .../__pycache__/get_relation.cpython-311.pyc  | Bin 5253 -> 5153 bytes
 server/map/get_relation.py                    |  68 +++---------------
 2 files changed, 11 insertions(+), 57 deletions(-)

diff --git a/server/map/__pycache__/get_relation.cpython-311.pyc b/server/map/__pycache__/get_relation.cpython-311.pyc
index f8284994a9998d150a327d0e5a06b482735e9e22..b6ace0d36253b3b00b4ae6cab83ec4b462051706 100644
GIT binary patch
delta 1682
zcmZ`(O>7%Q6rS;}y}MrjJF$Zkh}$H@E7XKGh$vAKpfQ3#6)J*yFtow(ZjIaZ+M3-I
z60MaW1t~>25Dlm~AYmjFirPa&E|ow?<-ifyl_ji|D(E4HaH*yC#06&7cA7L|JoCLb
z^S+sR^WIy3CViXmeed<U0cn4V50&?Po4zinZ4UOXKp+Dds;)ej;%%K#g}giE&WkBA
z?@4)Dc5mL7^0jn-Dj>5;@Ula8uCb|*>{<h<u*?zckl`GV_<efMti)K{`GUHXEoheW
zd?BY9mit^zQ|1hm)3U@Ws5x!(aniBF?2f~JIFtn?m&qo<#laG1c<C9<W^$%;+X28W
zGMcT#n=Y*SB$&XzIHF<KZE+hCI~gszfd6(#!|sx3ie<6AdRWSyqdOolMSPYSg<ibO
z^!5qmz+rY<H$~Y;ettP{JBWW~Mj4?T!Uo&-zQ+XRaGP~l%AsTTfO5xSMq8J|a>vnE
z5}!c1lbnCjOVulp78O5aqcPJ{?rLv6Eagt}fah@0>4cHpYtCmO4B{_c*ZEFD`T-&l
zk8mI0-?&ro8T^<#)f3Jv8uP_wmgX0h=1EEv%cXo`D4L94;&XVHe^c;Utgfh+k$_p@
zbjYJAAGf#Yh{g#|39;9xH<sJTsfs>-MK5SN&0zd+LqSUMWEEo`DQeot6*TlJS>nmi
ze}{NWFjw|iq2lhXvhf-ludwm^fmo$ysPf|3O80a%kgNrgt22LvJ6F%u!`%(wa7s3;
zbN3_C&B2|qYGkq&nOqm^e8(Sr_dULQ>+LF^sPT!4-S<5Hny06%Ry-qB&q&QPvika-
zFSwyz*EY0I-&mbq55YSA+<k_rvjV>B9&j{VctBiQp_$Db6d#$eWH4kr`jNm5nj0dU
zO@>!(CSpvGg(YB6UaQHDHNs7TZ8E>rUIZr0!euf$S|}xl;cQXxPr-Lrm{~+m${f@<
zna~C5+oK)=H$avgeo-hv6FzZg)3M>61Bm8Af)>9}Sk&Y+T9O>dPnIl}re3EG$K!T-
zP>ATugU71klBNtzsD(^g)u)J((~V3aUz~cGu=N;$RZxkJH~Y>0E%s~g!4y#sB_}#T
z1aeW}DA1%^EIo+W0(dyoeQAs=>GaWd(KOxZqg)Cj)c7HRRZ!=AHLh!G<{mdt;RfpA
z*cTG10B@vu<<20H)#!LFI(|pKbD<iYu6mO-ZxVkMl3;lE8}SSipda8qef2&KA&TG!
zzQjq(P5z=3q$?Riw_NFBk$eKEm)ZviNNzNS`~7hjEqFAE-}1lGZP&A3&RxsN%9D~#
z5yHgocm7{t*nWDaC1jOCF--!mqh4GM_2Yj-JuA->nkDKVrHhKXG*l?+PX{NMPa8$G
zV5qr;AtRT$svz_N-Q(02^Tj3f4%HdmK=wCe#|Y7@?OfYIw<GuuKanrUi>fk(GQ>*D
zN54y8xWPaO>mXWb_c|D@{C~#}!m~3CHUUqUGYvq*({KU0V5|WSAanwDHo$SPUHcFG
C%Y!KZ

delta 1634
zcma)6O>7%Q6rQoyyX*DZyRqY+*nv1SQEj1=B#P7)(S)>tHcC^93O%?;m6P4Lo9>S_
zyFp5ENq{0!R0*O%B1je5UP>!^K{+Bo;)2xEI<nMgrHF9oAt&5JCB%=!jPuhrTo}*3
zefxd$-n@D5jc*k`F2=rzMg>5|>-_KP1$jA^f$uLL>{>9`5^HcJ4gv)zQ0I+sNoeUo
zJz|I@(TJ9!MywRu;Uz;Z$vb*mDc-V4l-d<WP0j?A&^4x%QrK&tlvX$*GYUKhiu@Mc
z_e?S5b7w7mzG9hv=&YrgjxU@pXr_A3L7G|drO7$n(M~@B#1^n)vi##j;0UuCfjy9^
zg<KZ@7D#qSZbJaRCC~P_%GMY~?AZMTE=N|i57*dz%Qz>vw+77eyLyeQz<besYkB-#
zpco2Y6>0+hHIPokp5-ARcsO_%N_aHb1$kT!rXzwPlV6(>zn8!t1rG;9Zkz@pKO5a_
z0^ed%JxF%;4gi4CzTdwoIS_xwWLdHm@3vD%_zfn;UX9d%o1|$-ruN$qCPkTaTFKlF
zkQ9+;dk`nUP475KL^8X$+d(m=7ICxG5O$E`JkKhClrOvb6Z0H|3A_=yo=Ovg%HMY%
ztxZmy9YNIXU5KLCWZyY_B{FV0DzepS$L_vTcuTdNyiTf_S1i@eo0gL&CEw=r&LuTp
z-R=c^pY4M={0G~YV5jD0W>n-0ibmh6Ij!PRPD=`VhPKa7S#zdRM)UYCHy##!##Z$i
z6v2OS17V(ScaiwT!+iGDED6pR98Fj4i?g<6+9Cn+PYslyE5wTGTtuo~b~MXGV+5kt
z#101VSA1>ZF$+S1Cv?@Be1pk*O#ZO|+Hzj!A+P_qmpf6H#~Sk3;`q9hc_4MINnI{e
zmwFpg@8YS=cy?vrix(fn3v2PholHGG*oY4<PCOK)hS=%8=Ng_kR2PRD;?Ux24`XdN
z^y}sg^MjL%Czj%y4ExFChm)TlsN=80#ZZ&RfbWNUM>aY60he3jax16YH*ZcfI{WL~
zK!Y1-f?(+74L-VL)cMW^-|4mHLq6)oj@0?14gRRdA8qpZQFtCESHBkrgK~--a*Nh)
zi{1s4!T(5w92y|H&z7rI)l^V7B@Pl%6wonzQqHq+ii~1I9?7+GCn?&ynxZ~Q-`ixt
z@zr1CpCL@*%R<KsO9c25Jl)|nFuT|9HCPE?Pq;h@$-e`l7ZD9o5vGEc!Dn>Mb_hpz
zrXQy2vxbT)s^W7~7E(w*p<{%zLqxP{ixRk-%N#%#2ylrqlwJfI(bNjp$Q17Mc<Gnw
z(f&rXA1{l=M3S(@4nJH`t!kMxmW{gc&3F%oSVABU{}At5C=k_;*q6#xRi8g(RqgFi
zpG4Val%1+>Il4A=$kC=Rs|fW`n~*tYROitI)!A+LexR!OLEAyCRzoyltx%CfH5yH;
zE&t?SF)U?HSBKHeNdnT8**+1?AcSxoq`lp_4$gc3Z{klAXU?yKgtt4J><}Dqr<;Jh
X_KPa)hRG(_6Q>~qvrX_{(Te$BLb$2R

diff --git a/server/map/get_relation.py b/server/map/get_relation.py
index 360d2451..25688489 100644
--- a/server/map/get_relation.py
+++ b/server/map/get_relation.py
@@ -1,10 +1,9 @@
 import geopandas as gpd
-from shapely.geometry import Polygon, Point, LineString, MultiLineString, MultiPolygon
+from shapely.geometry import Polygon, Point, LineString
 import matplotlib.pyplot as plt
 from shapely.ops import linemerge, unary_union, polygonize
 import matplotlib.ticker as ticker
 import numpy as np
-import pandas as pd
 
 
 def get_relation(self, body_of_water: str):
@@ -22,32 +21,22 @@ def get_relation(self, body_of_water: str):
         print("Failed to convert to polygons")
         return
 
-    ########################################################################################
     print("Performing div call")
-    # NB: any cell size under 0.02 will require patience
-    # For example, 0.007 requires up to 3 minutes to compute
-    # tiles = divide_relation(polygons, 0.02)
-
     test_line = LineString([(10.4600, 60.7451), (11.2000, 60.7451)])
-    line_pol = test_line.buffer(1e-3)
 
-    new_polygon = polygons[0].difference(line_pol)
+    new_polygons = []
+    for polygon in polygons:
+        new_polygon = cut_polygon_by_line(polygon, test_line)
+        new_polygons.extend(new_polygon)
 
-    tiles = gpd.GeoDataFrame(geometry=[new_polygon])
+    tiles = gpd.GeoDataFrame(geometry=new_polygons)
 
     fig, ax = plt.subplots()
-
     ax.set_aspect(1.5)
     ax.xaxis.set_major_locator(ticker.MultipleLocator(0.2))
     tiles.plot(ax=ax, color='blue', edgecolor='blue', alpha=0.5, label='Original Polygon')
     plt.show()
 
-    if test_line.intersects(polygons[0].boundary):
-        print("Intersects!")
-    else:
-        print("Test line does not intersect the polygon")
-
-    ########################################################################################
     # Convert GeoDataFrame to GeoJSON
     tiles_json = tiles.to_json()
 
@@ -60,47 +49,12 @@ def get_relation(self, body_of_water: str):
     self.wfile.write(tiles_json.encode('utf-8'))
 
 
-######################### Approach 1 #################################
-def divide_relation(polygons, cell_size):
-    # Calculate the combined bounding box of all polygons
-    combined_bounds = polygons[0].bounds
-    for polygon in polygons[1:]:
-        combined_bounds = (min(combined_bounds[0], polygon.bounds[0]),
-                           min(combined_bounds[1], polygon.bounds[1]),
-                           max(combined_bounds[2], polygon.bounds[2]),
-                           max(combined_bounds[3], polygon.bounds[3]))
-
-    # Create an empty list to store polygons representing tiles
-    tiles = []
-
-    # Iterate over each polygon
-    for polygon in polygons:
-        # Iterate over each cell
-        for i in np.arange(combined_bounds[1], combined_bounds[3], cell_size):
-            for j in np.arange(combined_bounds[0], combined_bounds[2], cell_size):
-                # Define the bounds of the cell
-                cell_bounds = (j, i, j + cell_size, i + cell_size)
-
-                # Create a polygon representing the cell
-                cell_polygon = Polygon([(cell_bounds[0], cell_bounds[1]),
-                                        (cell_bounds[2], cell_bounds[1]),
-                                        (cell_bounds[2], cell_bounds[3]),
-                                        (cell_bounds[0], cell_bounds[3])])
-
-                # Check if the cell polygon intersects with the current polygon
-                if polygon.intersects(cell_polygon):
-                    tiles.append(cell_polygon)
-
-    # Create a GeoDataFrame from the list of tiles
-    tiles_gdf = gpd.GeoDataFrame(geometry=tiles)
-
-    return tiles_gdf
-
-
-######################### Approach 2 #################################
-
+# From https://stackoverflow.com/questions/39338550/cut-a-polygon-with-two-lines-in-shapely
 def cut_polygon_by_line(polygon, line):
-    merged = linemerge([polygon.boundary, line])
+    if polygon.geom_type == 'Polygon':
+        polygon = [polygon]
+    merged = linemerge([poly.boundary for poly in polygon] + [line])
     borders = unary_union(merged)
     polygons = polygonize(borders)
     return list(polygons)
+
-- 
GitLab