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