init
This commit is contained in:
commit
e833bcaec4
224 files changed
+11812
No files matched your search
@@ -0,0 +1,40 @@
|
||||
// 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<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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user