From f2bf2720e50c03031a48d6a0ac7012fcdc31f706 Mon Sep 17 00:00:00 2001
From: Sara <sarasdj@stud.ntnu.no>
Date: Thu, 14 Mar 2024 11:10:04 +0100
Subject: [PATCH] fix: sucessfull map division

---
 server/lake_relations/overpass_query.txt      |  12 +----
 .../__pycache__/get_relation.cpython-311.pyc  | Bin 4520 -> 4442 bytes
 server/map/get_relation.py                    |  51 +++++++++---------
 3 files changed, 28 insertions(+), 35 deletions(-)

diff --git a/server/lake_relations/overpass_query.txt b/server/lake_relations/overpass_query.txt
index b584a5a4..611940c7 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
GIT binary patch
delta 1881
zcmaJ>O=ufO6rTNGNtRZYWZ6#ac&RClaH6D?HcIL`g&N!aGpXIul8~s2XDzQRY1P?v
zYP-8wEk5`V0%j=5QRLvJB$Ps-H9Zx2>ZM3Q2eVK}4uSSi6B+_-4y7}zNVZJrNc;B9
zyzjkv@0+)Cd)Rv}@?|(21Y}(J`A^*qZ$<i;^43T;sdEb~ls5Q_F(_|<i*d-zfmC4Y
z)?(s155NszGt{X$@(jMt_N}|DLw=C$Z>@to+fpI7<m>x3mxKHUaJYl`39wBZ?zEhM
z%iB_W0vvvuY<j1?F%*`39d+9Qf-;{Wq1Xvy00eU&2VB92wNTPwl*3Pe%PX!3WmmF8
z2euU*X`3W}r(KLIJ91UT4<bFBn3wQOu>bw;19-VJvMby1|F!n)TkYO`-I4Kc%-|*2
z-scQBq9Y&5MPNG5BHW7L2zLXAG6~p&Eh_+d1%JdIm4a@_300${nnV%?I~^F{1ghP%
z(2)=f!LGaEZH^E@p5`E1Ki|>;!RF(5k4fTx*nrgKhGC?dpka^Lqx+zIvZX@>M)4Ro
zn2L1tQkwxM+?h-(5hwCriCp`zqqaU$TT=A%@25H7Jx&o62UL$V3+?WVO@N?!v}uaL
zcqhfwh^u^(#E3-cB;RJSdW`t=a7uNE`m!*AclhBeJu_>4mX5CK=u}ZFpDN}}OH1c;
zGjEwCPbNxHx6vx1G|soXnM?%o&{lc;G7&dO%R1n4(q#_P<1l&r2h)3Ui@nx62fhL+
z)(_*!`iiY1!$c|8W7DTSscaTjb7sk+O^f%$SJ$5g#|nmJ&zr^a_?nv2?JUv@nr)b+
z^jN{1*9z7+QCbMvlh!a16;M-VoB!LnFQl7Nqwjb<nrcK-?e)h527af7tPM_TMnQ+F
zZL0HTi4b5@mFDs$O=fL$!nkTcqm)w#G3j(#eQ(jQh`y@Y+LEqn>Vp1>S~N<_wr=G<
zO?*A|U~S`kib3>-%F%5A`0G60<Bj90$K}e<3m{#C*#)wx7ofyu?bWjGaRt5P31wuI
zY`iGEgMSdtF+u!9xcXYu<1M|gfMgQMKZ-2WY|ZO>Mptttx5)ECkmjqyEJ+tB#0TFH
zhe(HiFOIB7$y7Zw5MA`T4zi10Cre%Av0fr)Q2|dx5RG4RYlCO%N~WP?D$|cdkQlf*
zUA@>CINcaHw`1HJm}<nQD{m7+bdDiB?+pByZ=8LXXmw?_q0CmMA4+coH#48P8}3c!
zp44BH`hS(fwaCf3oNmbJnw;L1Bb(y=SfcXQLq1Roo~iSh2A`?%nfvjhk3dL>_+nGq
zP4r<TL2g$L<6Y@QaJbGV8+@`x+C3syxQD!ivHUrUV&DE9y1>L#Qb;O<CddoDLd6um
z6dpa{F{>V5FiN_|tXTB!Jiv?32^ykcDkkxF;W`t;n~`srNqkmOWtFU^1f*b1IW{~)
zakE5N^lR|LGy~9PL{wbCw-gwU5iOPQ5526Fpk|>XxIg;AC3+trdf#|LX}MTl_1IF`
z3%8D!v{rV-<18Eb$I{Hok4#Sp(V+frPvx<q36~4{IJ!dCXm49T;a{RF0~zLp>ii=>
QUWbLv;E%gs<Y|n50U-dU{Qv*}

delta 2026
zcmZ`)+i%-c7(cd;9Vd?6q)oeYYiYV}n$q2XNx;~;3B+Z0A%WO5U?JqVnWHof$8ObD
zjvApo^kEXM&VWAf5Tr3cn*<UP5Bvjr;gU>|7FmL~3GJ<7AR(k7zT?ihRNGPg`HRnY
zJHPY$zIr>qo-n@B^$3Dhzx}8AFuG<Wh55BTnUO2#Vm}F)(zHm_EBN973B#8J5#B`U
z$lB+Zqd!RqeTMR=B02)A;pDS<p(44`E9kw23MN8DcEBK5E_US`B0@Le*<2OHRoKr)
zQY=X9KWXTafSho!hmfn>5WpIqz}nFQ{js}xXV>ZL=s_GvvF#njiFfT_*z2uGyt?QN
zbSw%!D*U%A-V(Re6LPk7Sw>k(9(wLw2v<=nVK-dsDyL&cgx(+mazizP{b~&E2@{Fn
zTk;Kn>}DG_fMl%W?S=|5j?^(g_`IJgQqhP~>pD}%*xB9D3+*$J5K-Ab(r7x`bIwFy
z>uS9P2F1D2#}#+=LJtOmfWfd7stvJE@x(#hMYS%3f(!_eaBmI(0o9W1m^73iTJMGM
zEp`p>igBf|J%~};!66&dYa_vz?l*~U#^+G6RXH@EpS#a#lomWSZ_dt`4qar&Lsop$
zGjbNq70pa}wz!y|EwOs&ESB<R!ba31g2pbW^ZN`B+h%c^su01`h&68!lVoPHWlw$N
zWqYB(-w2Nh20IYm6Ena()wS4RW$JY=nm3&cHH%rtnk~^6z$OZh{R@;=MXmls_4MBg
zijOs7sb(xy?;Ee4*icYnWCKOyDPOFFT8Tk68X@9}#;!#6MaCOA(Zq>5POu*%RT<o6
zl}%|MEkA(3D91&x6i_&`9=rkR{JurdqyiCrDv1?|NEPg~8xBang{?rl4=OUjPP>H>
zDzx<_89ZcP3QO8DG=k!aF7BQIg*LH+t_*79ZcFf^5^|+2J~*&>qK^vv0so%Gem9gI
zAy=K=(zXJ+n&al2Kr$loFyb`9&}cgQ*4VxbvrRc?{RJqb#Xo|G^ayD8Iez!~aVZz+
zkSEh@DQ|jWsqBem%ad}mwkO$EiSl-${H*D)r?)9)l^olPl;&oDZoaPO%#vf$%z_ta
zi_4xuv&5RS=^=3UWJpjnJz>EU7HvKp+l->m^BnzwI0}mW0|=l|VyJqy6;D)8wT6Km
zL)8;2ms`3~eeIs!zxrZBf2yfJwSlm_+ZQWBD;EFc<!i65h1XwN)0b<JMr?9LZbcKT
z^IwYBmD=1F`gOgrZGR)WA8eoSSslEqj@(g4*0Z(v`r8e4S5w_p_y1ZreitY2;N<#f
z?Zf79x`8K~c(RTs?`i$3Qw?prsg2k1I6Vxtd$|1lZS9oM&+$uZ^fbKaK`zd*34QO=
z^ptN@v`QvD398NiA+!-mr8Y6)vyO6chArt0;V?U6d?%b`4~^7GKdwv<z@~@u)FNI#
zT!cw&Gv`>Pe8#bgrcK}C0nUT4IjQ{ko00i6qg)U+-A4v^$>~8a3^S#iEs?BElkB&?
z^OyLTqA3ub43}MAq{q3gKbjGl8LI?0F4+$C2f*eX`bG25-yk0fKjFXX(V1B?S2T}N
o-pIT&?K|w_*uvg@!ZWqp27=dC@xGu7J2y~Uq}W9K5ay-+58{-fP5=M^

diff --git a/server/map/get_relation.py b/server/map/get_relation.py
index 7cfa0cfd..81a91db9 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
-- 
GitLab