From e2bdb579b329ba3d8aa826d3de3d2caea134d699 Mon Sep 17 00:00:00 2001 From: Sara <sarasdj@stud.ntnu.no> Date: Tue, 5 Mar 2024 09:53:25 +0100 Subject: [PATCH] add: attempt to split map, non-working --- app/lib/pages/widgets/cloropleth_map.dart | 10 ++- app/lib/pages/widgets/map_widget.dart | 2 +- .../process_lidar_data.cpython-311.pyc | Bin 0 -> 5317 bytes server/main.py | 1 + .../__pycache__/get_markers.cpython-311.pyc | Bin 4015 -> 3544 bytes .../__pycache__/get_relation.cpython-311.pyc | Bin 1716 -> 3440 bytes .../input_new_data.cpython-311.pyc | Bin 0 -> 3042 bytes server/map/get_markers.py | 17 ++--- server/map/get_relation.py | 58 +++++++++++++++++- 9 files changed, 71 insertions(+), 17 deletions(-) create mode 100644 server/data_processing/__pycache__/process_lidar_data.cpython-311.pyc create mode 100644 server/map/__pycache__/input_new_data.cpython-311.pyc diff --git a/app/lib/pages/widgets/cloropleth_map.dart b/app/lib/pages/widgets/cloropleth_map.dart index ac235158..3e4fb6bc 100644 --- a/app/lib/pages/widgets/cloropleth_map.dart +++ b/app/lib/pages/widgets/cloropleth_map.dart @@ -1,5 +1,7 @@ import 'dart:typed_data'; -import 'package:app/pages/consts.dart'; +import 'package:latlong2/latlong.dart'; + +import '../marker_handler/marker_data.dart'; import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_maps/maps.dart'; import '../consts.dart'; @@ -17,9 +19,13 @@ class IceThicknessModel { /// The map data is fetched from the server, and the map is rendered /// using the Syncfusion Flutter Maps library. class ChoroplethMap extends StatefulWidget { - const ChoroplethMap({Key? key, required this.relation}) : super(key: key); + const ChoroplethMap({Key? key, + required this.relation, + required this.measurements + }) : super(key: key); final Uint8List relation; + final List<Measurement> measurements; @override _ChoroplethMapState createState() => _ChoroplethMapState(); diff --git a/app/lib/pages/widgets/map_widget.dart b/app/lib/pages/widgets/map_widget.dart index 1dee6355..f0ca2186 100644 --- a/app/lib/pages/widgets/map_widget.dart +++ b/app/lib/pages/widgets/map_widget.dart @@ -118,7 +118,7 @@ class _MapContainerWidgetState extends State<MapContainerWidget> { height: screenWidth * boxHeight, child: Padding( padding: const EdgeInsets.all(15.0), // Padding around map - child: ChoroplethMap(relation: widget.relation), + child: ChoroplethMap(relation: widget.relation, measurements: widget.markerList,), ), ), Positioned( // Quick view box layered over map diff --git a/server/data_processing/__pycache__/process_lidar_data.cpython-311.pyc b/server/data_processing/__pycache__/process_lidar_data.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcaab3c96c44cab902c18d3bd614a974fbd0561c GIT binary patch literal 5317 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 literal 0 HcmV?d00001 diff --git a/server/main.py b/server/main.py index 90c4048f..989e1c30 100644 --- a/server/main.py +++ b/server/main.py @@ -2,6 +2,7 @@ from flask import Flask from http.server import HTTPServer, BaseHTTPRequestHandler from consts import SSL_CERT_PATH, SSL_KEY_PATH, HOST, PORT from map.get_markers import get_all_markers +from map.get_relation import get_relation from APIs.get_weather import get_weather import ssl import keyboard diff --git a/server/map/__pycache__/get_markers.cpython-311.pyc b/server/map/__pycache__/get_markers.cpython-311.pyc index 465b8e596d1a8109ff12180b38c80096d6b4e58d..e0b4752477d0eafd895b1d8937cd74c85045d82a 100644 GIT binary patch delta 993 zcmaKrPe>F|9LIle-u$1Popl>$-P!!#A(cvEArM;-)QA-m3d%xaW42P$V4O7MO-iRd zNU*$vhYXeub|@(D);;MYyU`&ek9G2}7ePApM%$)|=r_FY?|mM>`TgGSJ>J{)FPZo& zT~~qG*xvWz%cgR?jBvSPo*c&j>!5&xd`yrl5bSWvIshXmS5wV+69K$t<Jb@osGxGq zqzPoK@YCQ6gdc{fnlBR3!RbaE_!472WJW@S#0W_dk|U%<NDaw!v<=CZiA01&aL*H& z2t=Y)WXX%j?feC2uE>A4u;#H}L`M%ZF^WgXh*08BqGMcI5S?Ti=nikuRZh4r-$S1A zyLI?qwoQ&5CmYA+m>X>KL>gqc_Q}&4>i|Tkh`}+}xmK)rM)|8vdvPkQM0;`Y>`^W^ zNpIrL6?NY7PJ}sTjxIc4qBzEzRJ69Q&i8eLXNB>nz-{w2uPIz{T8Q=>UU1Q>2pr2- zC&2+<d!o(D$9@ULm*6p;ge64OtI(6)+UIvLzs%j5q95hcTu+RqmAir4R;EpDuHeoV z-P=yVE9|1;LW~uq6Y7m*j!h&s7IfCxD%80=eXmZ4-Ab|!-87-?H|tq8Wl~LaRN88Z z{%WHCpo2EWE}ga8O8HX$K!i;DMsMZXyUwbet=ZYncD9s1Jp87ab>M_dL+G=ZowMwc z7Ji4!>H>=iybQ5amA4jJ*lwPVTo@UE4+H9G7vAR0(N?_ODvWk*jq3x*xX1$B-iA!k z^>|<A9K&6HuHfBw*$V@g52PoM9NmlC?MLB50S^Zfr1&8Z&OLM<Jt*ef%hWQm9peb4 TD%m;&{vUdW&KN`N@d5k<aUs9= delta 1330 zcmaKsPi)gx9LL{_pZ~>i5<168laeMB)^?~OR7k4^>V&qW3|29<)fgaFMLY)rsZ-g8 zjL3#*+93xHMDMT*hnyH=lQ?kLl?!O6$*Cf>vOwBp2c#Wx0BM?b;5nfLOVfVI`~BYM z_j~W_-?J_6WFAgNf0X4gp!VR|bM4o$cC-yqyQ56ZBLIE?BEZl=cF16DghNdk07|g! zCP{{gaS+(B1KVAN#9{0fTLlhhv!8+sU5B@M%#8c819Jq*XvCD*0C55010)1U3{ZGP z3YPBjj%W)ucO4k>wrF#<KwPK_*P)Sr19PXvdk}!1=@=RWw=KGb$MQ&tQZzuZ0L9-W z@_A?+@}v@)JR@F$mbj}6!2hY-3(+3v7#ddY@_v8EDBj+(q}@E#;5wXtd;6iiv9J|; zr@)d4=D>J3co@uF9f%qVImhHB2`8P1p28_dA~%`j(J+qvG9J7%t<OyXOC2fi2S(13 ztv#a*PTMkZndH<!?<~N;k#EYnFpLe@0N*fYK?B;L6QRwjwiN7&z9pa|(@F|w@I>(X zgIaX>21VmOU3q)TPMqeE9qH_$@qN5Es2U_lyIKXa*+&BUorzXo(&yU@oxkwnH+l@> z@iVi{$R~B((sXOiy0NJ><K@lGTJ>Vts@C;GSIoNJWUpD3xrNy=f`rPFC!3m%*A30w ztm~%cNdvsBm9b`cl3yCmO^<C<sx^%UqiSg$r|B2#SeuP{$kb{TQWL6q(N|gb)1I_Z zHm+*MIxbsf4{BzVc9+YM7s6L#OLWT9VLJ2)ehd1cWwI)M!R-^r`d}aVN&G7jIYOt@ zx$#^l+l?38c;Qu+JP0qnm&&w0+ev3zr&_1}@aKP~v*h1!N@Cbd9}FFtl+w49WJ}yp z(=BQA`<q&yr)&He0j#)<)GegmxzR=W9?H8Yzk`Hrq--JO&e!gN54&ighZbD4@HX8= zY7eO{Qu`d;{{6`}i_dQ-rneH)_xWz3&`T7$=x}cu9d>vBW{RHmyW-K}B6zYGF3m7c z1+_HAJe^`oGmje5M=(~R3yg!iP9u*a2iFP|J+x7_E*p$rp`R#VeBe9(_IYga_{!P| zk6kXV6<0j&bg8sjTpMbf^cOAr&e#1%IJQy8*J|3Lu|htUkL13DaQ?p12Y&nyZxA9M HNB;KLy%{Yp diff --git a/server/map/__pycache__/get_relation.cpython-311.pyc b/server/map/__pycache__/get_relation.cpython-311.pyc index 664196b347f107025d30408fd41a62052110dbee..12b87d51b16f83f1ef4d1dc694a1692b02674d0f 100644 GIT binary patch literal 3440 zcmbsrTWlN0@s7OX^Jp<4sfR^Lbc!TkBw8}1RFv(;YUJ3iVXL;&)-5ZEV09~o63Jut zPF5ux5fv~HA#hO@uv-O40TxJI6>b6jH6Q(KfqWHr#0De|NFktT3-^nKQJ~3JXOAx( zWfcXwcQ-pTJ3F(xH#;-G^7%XrwC{fQH<S?=<}Z|JHCq#Tb_<Z7F(M<fIVRcY*(7Vy zwxk_;TaL@~NuH%+_M9W{Ogi(fq$}@Ex`D?bX2mA*_qn7;blhi>UXgv9i8`NB_485I z=*b`@mCof-`7~ZbSdQ8a=PfC>nUM;H=SH@G-d1q7kTLjMQnsKNzVAumW=dK~ZKM^1 zms_i(+8prN;d}N6mabR<*lMe7Tx1^u{-jNpY$`mWZJ;H}thRNE_B9jljFs$)vn|N1 zaxGl7m-!Zcw0{i5lQyHvGH206S8q0@r-d<$%Bc3ou!bk?HFfFWRi^Cf$agT2vr4j{ ztL*NKcQBC`9abBrtmzpYsRm}<50zW>wq(lSLC2fQmwm^%3?n+N>$6hSm%vM0^IQEg z!uJp!&!>yy`Bh0ypUog?RR-s90g^`w-o*4bJpBZ~mM|w36jV@R%4QL5`P0Q>F1wso zvQlB3&e`JEm6cc`ddje8ilX7hC@rQ|vN>e9sj?KEWpJi;J}0F`*>EaSszHnE`J!y} zh}nBt5v4H7nQ9H6j0z%<a#1SC$ncuvJD?X~!%K%6xNPtnrXhX<XBA{PP+?gTQPg2@ zGRm!B>Q&~BQes+38$z*h1DaHG%PBFt3^$-<%v_jE{U&0zFJ|V>FMJcuOI|1_h4qEY zNM2K<;zAKinfT1a#6sgJ7vLxt=%s7z;cRi!5RNkN2<W7~BL4}%HuKk>7ax?gp=rG* zL3$F~*Xj-?7~Z>9PLl8h37`KsTM1t!fot10{sja556|!As>AWha9kgrBEwU9;B^vs z-5d-JJiPw%clVWp1%2dAGV-P#oFl=x?VF&GcUQUI3fH?U>)asW1~qQ5#<{9ou)+m* zm$a9sbuK};gvKS>Y@O>RT(8FUn$z!JZwfC~L(xhoy8o&kijz=W=Ozg^skPo`up`D2 zHt0spu<?6<*02HY-3}BYE7~4|#1krOwvtV>i(JN5vS*kQ2OkfgLpc%%j$UxJEAUty z{xY-6F1}lGf(DmrzsxMomE0=Z2{6wOFBXY*0BNm{_LgAcw%W8(BLADNFi>(mxU9NX z+u=oYb^@Ww-eYk@WuG5XPMT%42;sy2f6iysBWo&oRG>xI7Tx!eFx`FfTX0gHos_)h zc|R%%sz(*p%)g6&q<Y)<drGKtq9EhV*sS{~w?kk@uIuCl>kKP}zXd_^xuIG0SS8`a z94AP2SpdnCbRL&HNvF5lI?EJBAN=%0&Hwvqk4f&b4}Pe0ehRGKYTGjAu#UkE<WvsQ zg?s*r!QZ4wB5KRv&wHN!?(Y0-ro#N$=Kjaav%ve{wf;xsJHX3)`uEk*FTXPT4Jbf7 z1qtWVx$G7aF-@~i>6MTAF!cn(vAm9D2^&047c$7O=MW?w^aCh8vcUC1MS?KIYN$mF zC&bxRw5(uy5n-YvVMrhj$U%?>FpUa^$CQ^rNH&ueSfP7{sm+2%$fLBpj!_<Rm~8lE zNMDKq)laHOiyz=L(hp5I&HUq0P`;RwQ6_cH=-_dK%^JStoFpSzX-qbFQwMO@F$VQb zuBQOIY2rQI_GspA<d!DH!@$8WwgAl&vIh<gazx;z^3+Ec4)}u&J#dKxE^Xg{uskrT zjlH4uUDCK9Q2nQ&ue}i1zHS1@7N-J_CU-Y}a`E9s-4`LgNS%rBv42vq!yfjZ-tob# z-dE}j>;695fIDy1!e1icv1&L`2`4`8BQsyC&fKod-2U{=UG3Y8`kf_mXGxz)k(rdX zCTZb>9xjq_ap&d^%`(CO@s5;P;(clVRn2=2-a{eq<N5dJ_r5{~#}8OC7}teKB1~$+ z<e{s->KduIM#?@CnL4;lBGbAnL0k#Vl{oANEgyPze6>(`FI_(K0s5u9Km7~!BUK-o zB%!Gt4;YI~)ES>UW`dos*Zf1}k&1sp^H0=*!{zZx@SGMr_ZgtR{Vi?eydJzjf)}d6 zE0y4tKdyh0(yuO(tBZPYi3FGGb|w@DjV}yV{bwrvGv%1>pCAog{?kp~xbBY=e_Zp& zYyXw^n(mJge@yeoYW~nJ|8LOi>#GVw6=7&EuM1;D7}JEYn$UZU_c{Erfk@e-_m7hP z(cj)ZNb0d!5}Vcfz6w9~&`Xmxj(|@@1;ZhmWjj6vq*+}R(*-dtV;U=s-bN*I7Ag@a z=ag3I-?(yq`JHqT<u+-d*QxK!3uIm`vpO+-@YjrK&2-8yTo?0_xSm6A;7eeF-eLJY z0ChXdvNguHZ9X-|yKO!-rcZ0VH72fE-x@Qmo&45a0d}gqQfHv+24itHTxX60bD{qM DbxInr delta 891 zcmaJ<O=uHA6rSCE`;(@LjY&vJlm?Axo7RJf2T?CQn1)&_z2y=%&Ne1&cEaw48jYwB z(1RYrUOWa55$V-~cds522?zs%J$j3H5Q+z9Ha}?ndF;%a@4fFm-p`JbZ$jZ$q0k&+ z@}v0K_%3zAi^8SO*>p}Yp(Ym;0b$WVyCRm_P*Ab3gO=e7r*F|viQs0D>=yTQ*RXGk z+&U4NX^EY0me`>MXh~hkJ5XZ}d(5^!;UFX+H!uUJ%7c8t&=VMsov|F@DN{R^|I1Tn zJY~Y$_<KTaO8ld|=+uKy)gKbateYV3#w!U+*<Ts+Q+De}0}tdD>W2K7mbk!X%3zqo zMXcdKk4<iWHa*{Y%;#PZqrrt~&TfR+;*#7w&V3@D^S;U_G`1eZRuc4Hif67;b(@&Y zGO-#-7BzW0>57%UQGNH;(bLxrlHa+xMFX3}Dp%YFHmJ6#yZ+02FRlqu?@&CsUN?zL zrMl@-nfXkEDtAr2WSCTGjx{)U$R35NLo6zrM8^(QT~Zul+^E$ZZ(Yg>lJ`t{9z4xz z;S+XZf|r4{?U91y$VZ5OfcO9sLrC-?@d?!SMnAkVfb0;meaLb{{^|Vzq=t~{Lu!og z4Inv$WFL|o=N{+V`A2#07G$&+twC&c7+dw8fNd;mRB>FpVwG*a9vUbcq^?_7cWk~y z8mZ|n@6oK3&exlMx5`-CVdl4a#jlZ_;qO!II@GSz2yU3hHG73Y{$Dx;?_mDi<)uFQ T?Hg%H;bM1pgqZs0<tP3LpbyWM diff --git a/server/map/__pycache__/input_new_data.cpython-311.pyc b/server/map/__pycache__/input_new_data.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd6d9570fddc887d26dcac27986f9c6d168eb713 GIT binary patch literal 3042 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 literal 0 HcmV?d00001 diff --git a/server/map/get_markers.py b/server/map/get_markers.py index deef5834..6b777a4f 100644 --- a/server/map/get_markers.py +++ b/server/map/get_markers.py @@ -1,9 +1,10 @@ import json from math import pi, cos + # get_markers requests all marker data or valid markers, converts the data to json, and writes # the data to the response object -def get_all_markers(self, cursor, valid: bool, waterBodyName): +def get_all_markers(cursor, valid: bool, waterBodyName): try: sql_query = ''' SELECT m.MeasurementID, m.SensorID, m.TimeMeasured, m.CenterLat, m.CenterLon, @@ -63,7 +64,8 @@ def get_all_markers(self, cursor, valid: bool, waterBodyName): 'Active': bool(row[6]) }, 'Subdivisions': [sub_division], # Array of sub_division objects - 'Corners': calculate_corners(row[3], row[4]), # Return list of corners calculated based on center coordinates + 'Corners': calculate_corners(row[3], row[4]), + # Returns list of corners calculated based on center coordinates } # Convert dictionary values to list of measurements @@ -71,25 +73,16 @@ def get_all_markers(self, cursor, valid: bool, waterBodyName): if len(rows) == 0 or len(data) == 0: # Return 500 and empty list if no data is found print(f"Error in querying database") - resp_code = 500 marker_data = '[]' else: - resp_code = 200 # Convert list of dictionaries to JSON marker_data = json.dumps(data, indent=4) except Exception as e: print(f"Error in querying database: {e}") - resp_code = 500 marker_data = '[]' - # Set headers - self.send_response(resp_code) - self.send_header("Content-type", "application/json") - self.end_headers() - - # Write marker data to response object - self.wfile.write(marker_data.encode('utf-8')) + return marker_data EARTH = 6378.137 # Radius of the earth in kilometer diff --git a/server/map/get_relation.py b/server/map/get_relation.py index b96120ec..4ffd0409 100644 --- a/server/map/get_relation.py +++ b/server/map/get_relation.py @@ -1,7 +1,8 @@ import string import json import geopandas as gpd -import matplotlib.pyplot as plt +from server.map.get_markers import get_all_markers +from shapely.geometry import Polygon, LineString, Point # get_relation returns the geojson data for a selected body of water @@ -16,7 +17,7 @@ def get_relation(self, body_of_water: string): geojson_dict = json.loads(polygon_data.to_json()) # Convert response data to JSON string - response_json = json.dumps(geojson_dict) + response_json = json.dumps(divide_relation(self, polygon_data)) # Set headers self.send_response(200) @@ -25,3 +26,56 @@ def get_relation(self, body_of_water: string): # Write coordinates to response object self.wfile.write(response_json.encode('utf-8')) + + +def divide_relation(self, polygon): + # Fetch measurements from database + measurements = get_all_markers(self.cursor, False, 'Mjosa') + + # Temporary hardcoded point at which relation is split, should be + splitting_points = [(60.6853, 10.9571), (60.7018, 11.1058)] + + # Lists to hold new polygons + divided_relation = [] + temp_seg_1 = [] + temp_seg_2 = [] + + # Loop through polygon coordinates and split at defined coordinates + for i in range(len(polygon)): + + closest_point = [] + + # Find the closest point on the polygon to the splitting point + for point in splitting_points: + closest_point = polygon.exterior.interpolate(polygon.exterior.project(Point(point)),normalized=True) + + # Check if the closest point is already in the polygon coordinates + if closest_point.coords[0] not in polygon: + # If not, add it to the polygon coordinates + polygon.append(closest_point.coords[0]) + # Add the splitting point (either the original or the closest) to the splitting points list + splitting_points.append(closest_point.coords[0]) + + current_point = polygon[i] + next_point = polygon[(i + 1) % len(polygon)] # Circular index + + # Check if the current segment crosses any splitting point + for splitting_point in splitting_points: + if (current_point != splitting_point and + next_point != splitting_point and + LineString([current_point, next_point]).intersects(Point(splitting_point))): + # Split the segment at the splitting point + temp_seg_1.append(current_point) + temp_seg_2.append(splitting_point) + temp_seg_1.append(splitting_point) + temp_seg_2.append(next_point) + break + else: + # If the segment doesn't cross any splitting point, add it to both lists + temp_seg_1.append(current_point) + temp_seg_2.append(current_point) + + # Return a list containing all the created polygons + divided_relation = [Polygon(temp_seg_1), Polygon(temp_seg_2)] + + return divided_relation -- GitLab