// utils/polygon_area_calculator.dart import 'package:latlong2/latlong.dart'; import 'dart:math'; class PolygonAreaCalculatorService { // 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 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 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; } }