From 056e99b224f909110f6d5f4b13b7a6345aa41f21 Mon Sep 17 00:00:00 2001 From: Sara <sarasdj@stud.ntnu.no> Date: Mon, 26 Feb 2024 13:28:06 +0100 Subject: [PATCH] update: interactivepolygon class --- app/lib/pages/marker_handler/marker_data.dart | 3 ++ .../pages/widgets/interactive_polygon.dart | 6 ++- app/lib/pages/widgets/map_widget.dart | 13 +++++- .../__pycache__/get_markers.cpython-311.pyc | Bin 3345 -> 4015 bytes server/map/add_new_water_body.py | 0 server/map/divide_measurement.py | 24 ----------- server/map/get_markers.py | 38 +++++++++++++++++- 7 files changed, 56 insertions(+), 28 deletions(-) delete mode 100644 server/map/add_new_water_body.py delete mode 100644 server/map/divide_measurement.py diff --git a/app/lib/pages/marker_handler/marker_data.dart b/app/lib/pages/marker_handler/marker_data.dart index e84c1416..6bb3d538 100644 --- a/app/lib/pages/marker_handler/marker_data.dart +++ b/app/lib/pages/marker_handler/marker_data.dart @@ -8,6 +8,7 @@ class Measurement { String bodyOfWater; LatLng center; List <SubDiv> subDiv; + List <LatLng> corners; Measurement({ required this.measurementID, @@ -16,6 +17,7 @@ class Measurement { required this.bodyOfWater, required this.center, required this.subDiv, + required this.corners }); factory Measurement.fromJson(Map<String, dynamic> json) { @@ -26,6 +28,7 @@ class Measurement { bodyOfWater: json['BodyOfWater'] ?? 'nil', center: LatLng(json['CenterLat'], json['CenterLon']), subDiv: (json['Subdivisions'] as List<dynamic>).map((data) => SubDiv.fromJson(data)).toList(), + corners: (json['Corners'] as List<dynamic>).map((corner) => LatLng(corner[0], corner[1])).toList(), ); } } diff --git a/app/lib/pages/widgets/interactive_polygon.dart b/app/lib/pages/widgets/interactive_polygon.dart index 52968654..fbbc893d 100644 --- a/app/lib/pages/widgets/interactive_polygon.dart +++ b/app/lib/pages/widgets/interactive_polygon.dart @@ -1,10 +1,11 @@ import 'package:flutter/material.dart'; +import '../marker_handler/marker_data.dart'; // InteractivePolygon returns a Polygon object wrapped in a GestureDetector // in order to make the Polygon clickable class InteractivePolygon extends StatelessWidget { final List<Offset> points; - final VoidCallback onTap; + final void Function(Measurement)? onTap; final Color color; final double strokeWidth; @@ -18,7 +19,8 @@ class InteractivePolygon extends StatelessWidget { @override Widget build(BuildContext context) { return GestureDetector( - onTap: onTap, + onTap: () { + }, child: CustomPaint( painter: PolygonPainter( points: points, diff --git a/app/lib/pages/widgets/map_widget.dart b/app/lib/pages/widgets/map_widget.dart index ea3ec581..f7a6995a 100644 --- a/app/lib/pages/widgets/map_widget.dart +++ b/app/lib/pages/widgets/map_widget.dart @@ -5,7 +5,7 @@ import 'quick_view_chart.dart'; import 'stat_charts.dart'; import 'sat_layer.dart'; import 'package:flutter_map/flutter_map.dart'; -import 'package:latlong2/latlong.dart'; +import 'interactive_polygon.dart'; /// MapContainerWidget is the main widget that contains the map with all @@ -79,6 +79,17 @@ class _MapContainerWidgetState extends State<MapContainerWidget> { ); }).toList(), ),*/ + // Custom polygon class for clickable polygons + InteractivePolygon( + // Map corner coordinates for each measurement to Offset object + points: widget.markerList.expand((measurement) => measurement.corners.map((corner) => + Offset(corner.latitude, corner.longitude))).toList(), + onTap: (Measurement measurement) { // Pass current measurement to onTap + setState(() { + selectedMarker = measurement; // Set selectedMarker to clicked measurement + }); + }, + ), MarkerLayer( markers: widget.markerList.map((Measurement measurement) { diff --git a/server/map/__pycache__/get_markers.cpython-311.pyc b/server/map/__pycache__/get_markers.cpython-311.pyc index 0936525a134986cdf0765898d85dcce201203bbb..48c87d4a51a052fa19f2af11e5b4e7735d8d4ba5 100644 GIT binary patch delta 1150 zcmZuvU1%It6uv(@voo{1&Hf~*Moq>|7rM5QH41_aVQby377|Sw73QJscJFk$b${y2 zZozfK22G^}r7rg&0R=-JY^8`PwU`H=1p6S0yILWPRs~V4z6=C?5Jb=2WLr_s%=ymm z%(>^B+ZuXrq<J9}(h$&NFMnfx5Jl(*Vf2V@DH{eTONb$ci^vd?6mf|dq(lvh5u>K> z7-7CepCK{HkeST<CaFsZF{K_r$drXHG^PqP{7f?x7Fa~a!z#lEQ8IW_RGLl_mz*rP zG+%LC=~S**V0qux5rhZ=iz97}`&!RAxO4ftLzq@o#6QJ}-ER|wE&*>6>wnYVkQ>Sb zn6G|Og`z!b$SZQ|a-7eT2=3$ONCNOGV1$27c7<ZSG=xrQJVr-jgSS09kgd;$suBJK z-H(I3MU(s|I>0}t+wnH|Wf-FdI?>n5UkO9T01d80t~}s7PqCk0_fPZ<K-l%~tJr1J zcIrd?fHK5W${`%(=ahIflFt?MwPLPn9?oy3@Kxm{Eb#}`_2_>1)DP^;Lz@f8BUAhy z?I}5~Mm-egj`r2=8zZUJ*y_ytgKM$1nGXj$BkAiSX>WV*A;<t|hxL`=PB_&Lr+yp0 zayYOPH}_;F(Z`cob|<~23}#2^wNVLl>$RnFbo7_Cw0$Skv&9Gs$1%XqF#enUVCHX4 z8VsR#_aYXwgj8g~ML93_O6sTg^*YkGI?^l0^pln13s$A9H;?8Vlj)%4^t@TFnl@xr zY*r}42sBLx+G|_25`>&bx+cs<9~<i>gH@>3n7J7$TmKAI%GT{z(w8LGjjM}|c78f- zefjP80bWR?lTBj1@$_4l-aP`&&-P4rS`Ba#>!VjLJp0K}@U0D>{&i-#>%0H2d;k31 z1mB}aer(5IOr+m|_FM`l04Q6I7=o_bSrGQF9+;pwcLBh<qCqL--A#kKhi*X=QAyu` zI7(`E3WVz`<*LVRF-==sefvHEV)L$)**iP;xGPO%<}$Oc{A4zJFf+GV>VQa^5+KU| zp-hx2tX4E9?O8BkZ^$_V;8Be6ItnawpLKLc8`XjT{d(Fn7>{4<_mGhPgEm2GWI<Y2 pwKLDZK7RJpGCkW^u64HU=%|T{{T*dY!~zSlCl6t0_P@|Q>fhkOBfbCt delta 532 zcmZ{gPbdU&6vyA2-*2axogF*NvXR)e{{JaS4r~r&T_hzJiR8CJD>aLQMkq(A?WbI% zz2W4rMY(fuS_dV$Ik`=3E^_dOm6JDpKi~I$@BQ91b6KCQ**P;!KTu?rUsAC$fLE{h z4W*P6YbZGe0Rq!74MIubq9WKnpH>7;LK}bc2FIU$oAc>qvA|2$JTpj)RQx0!gH9{9 zxue)VhYMxP%-+x8RlXf(u}*|fR7Z8R1Wg}Yuj^!`aMYYH`w*6{QjeyzSQD|27?d-t z!wmh70j%iqh{Y?ye<zJ#N4L%OpuA_JXn0GSd8G`ICU`^+kXu-0Avmx?AO91%AkA?n zkh941cl?l{DyOsrub{p>)wVDstMvvsuJ0j}1^uafm>Mc6vqXPv7hGjb-uNffm|pHe zOj^cc#H}=XsUQ@rXs+(T>MmH_@3r|*pcQwbBXPKm`;#WS?W#&@>`wDh-p1@s+G)3V z@ZN9%MIzWkgbyvTx+XT#sX;qQC6Y4z1eYP=6BxVSkL#a8>^Tp+;Q4<vej4@&-TwkX C@NUHb diff --git a/server/map/add_new_water_body.py b/server/map/add_new_water_body.py deleted file mode 100644 index e69de29b..00000000 diff --git a/server/map/divide_measurement.py b/server/map/divide_measurement.py deleted file mode 100644 index 02081900..00000000 --- a/server/map/divide_measurement.py +++ /dev/null @@ -1,24 +0,0 @@ -from math import pi, cos - -EARTH = 6378.137 # Radius of the earth in kilometer -METER = (1 / ((2 * pi / 360) * EARTH)) / 1000 # 1 meter in degree -OFFSET = 20 # Offset in meters - - -def calculate_corners(lat, lng): - # From https://stackoverflow.com/questions/7477003/calculating-new-longitude-latitude-from-old-n-meters - # Formulas: - lat_pos = lat + (OFFSET * METER) - lng_pos = lng + (OFFSET * METER) / cos(lat * (pi / 180)) - - lat_neg = lat - (OFFSET * METER) - lng_neg = lng - (OFFSET * METER) / cos(lat * (pi / 180)) - - return [ - (lat_neg, lng_pos), - (lat_pos, lng_pos), - (lat_pos, lng_neg), - (lat_neg, lng_neg) - ] - -# def div_measurement(): diff --git a/server/map/get_markers.py b/server/map/get_markers.py index 2f5c6733..bf7e9e11 100644 --- a/server/map/get_markers.py +++ b/server/map/get_markers.py @@ -1,4 +1,5 @@ import json +from math import pi, cos # get_markers requests all marker data or valid markers, converts the data to json, and writes @@ -46,7 +47,7 @@ def get_all_markers(self, cursor, valid: bool, waterBodyName): # Check if measurement ID already exists in measurement_data if measurement_id in measurement_data: - # Check if the data object already exists in the list + # Create new subdivision within measurement if it does not already exist if sub_division not in measurement_data[measurement_id]['Subdivisions']: measurement_data[measurement_id]['Subdivisions'].append(sub_division) @@ -63,6 +64,7 @@ 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 } # Convert dictionary values to list of measurements @@ -89,3 +91,37 @@ def get_all_markers(self, cursor, valid: bool, waterBodyName): # Write marker data to response object self.wfile.write(marker_data.encode('utf-8')) + + +EARTH = 6378.137 # Radius of the earth in kilometer +METER = (1 / ((2 * pi / 360) * EARTH)) / 1000 # 1 meter in degree +OFFSET = 20 # Offset in meters + + +def calculate_corners(lat, lng): + """Calculate corners of polygon based on a center coordinate + + Arguments: + lat -- center latitude + lng -- center longitude + """ + # From https://stackoverflow.com/questions/7477003/calculating-new-longitude-latitude-from-old-n-meters + # Formulas: + ''' + lat_pos = lat + (OFFSET * METER) + lng_pos = lng + (OFFSET * METER) / cos(lat * (pi / 180)) + + lat_neg = lat - (OFFSET * METER) + lng_neg = lng - (OFFSET * METER) / cos(lat * (pi / 180)) + + return [ + (lat_neg, lng_pos), + (lat_pos, lng_pos), + (lat_pos, lng_neg), + (lat_neg, lng_neg) + ] ''' + + return [(60.7798, 10.7062), # NB: temporary hardcoded values + (60.7553, 10.7433), + (60.7718, 10.7975), + (60.7966, 10.7405)] -- GitLab