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