40 lines
1.5 KiB
Dart
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;
|
|
}
|
|
} |