Files
uWine.Portal/lib/services/polygon.area.calculator.service.dart
T
2025-07-18 22:24:01 +02:00

40 lines
1.5 KiB
Dart

// utils/polygon_area_calculator.dart
import 'package:latlong2/latlong.dart';
import 'dart:math';
class PolygonAreaCalculator {
// Costante per il raggio medio della Terra in metri (WGS84 ellipsoid semi-major axis)
static const double _earthRadius = 6378137.0;
/// Calcola l'area di un poligono su una sfera (Terra) in ettari.
/// Implementa una versione della formula di Shoelace per coordinate geodetiche.
/// Restituisce 0.0 se i punti sono meno di 3.
static double calculateAreaInHectares(List<LatLng> points) {
if (points.length < 3) return 0.0;
double area = 0.0;
// La formula di Shoelace richiede che il poligono sia chiuso (primo punto = ultimo punto)
List<LatLng> closedPoints = List.from(points);
if (closedPoints.first != closedPoints.last) {
closedPoints.add(closedPoints.first);
}
for (int i = 0; i < closedPoints.length - 1; i++) {
LatLng p1 = closedPoints[i];
LatLng p2 = closedPoints[i + 1];
// Conversione delle latitudini e longitudini da gradi a radianti
double lat1Rad = p1.latitude * pi / 180.0;
double lon1Rad = p1.longitude * pi / 180.0;
double lat2Rad = p2.latitude * pi / 180.0;
double lon2Rad = p2.longitude * pi / 180.0;
// Formula per l'area di un segmento sferico
area += (lon2Rad - lon1Rad) * (2 + sin(lat1Rad) + sin(lat2Rad));
}
area = (area * _earthRadius * _earthRadius / 2.0).abs();
// Converti da metri quadrati a ettari (1 ettaro = 10000 m^2)
return area / 10000.0;
}
}