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