diff --git a/app/lib/pages/marker_handler/marker_data.dart b/app/lib/pages/marker_handler/marker_data.dart index e84c14160deffc06dfd71ac1d3521d53b635c3e2..6bb3d5387e44da7be9d40ee832b92103093ef578 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 52968654d3d9eaec83169833ec8383ab5c278ec7..fbbc893d88d99f4734ea883f3aea419dbd6102c5 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 ea3ec5811c64e396fdf84bb93dc15f2d858e598a..f7a6995a5a2e61e856b9903ecb5006f56fc659df 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 Binary files a/server/map/__pycache__/get_markers.cpython-311.pyc and b/server/map/__pycache__/get_markers.cpython-311.pyc differ diff --git a/server/map/add_new_water_body.py b/server/map/add_new_water_body.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/server/map/divide_measurement.py b/server/map/divide_measurement.py deleted file mode 100644 index 020819000d0b1c79bdc3a36e04a408f2518d8569..0000000000000000000000000000000000000000 --- 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 2f5c6733bfe0528ce9d40441b450988994f9f76d..bf7e9e11c1d529040274e69ecc974726bcd88e14 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)]