示例数据为美国 怀俄明州 边界 谷歌他的实际面积为253,300 平方公里(25.3 万 平方公里),谷歌地球地球计算为253,694.01 平方公里,以下算法计算的面积为254427.11970185622
package com.ky.area;
import java.util.ArrayList;
import java.util.List;
public class PolygonAreaCalculator {
// 将经纬度转换为弧度
private static double toRadians(double degrees) {
return degrees * Math.PI / 180;
}
// 使用 Haversine 公式计算两个经纬度点之间的距离
private static double haversine(double lat1, double lon1, double lat2, double lon2) {
final double R = 6371.0; // 地球半径,单位为公里
double dLat = toRadians(lat2 - lat1);
double dLon = toRadians(lon2 - lon1);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return R * c; // 距离,单位为公里
}
// 计算多边形的面积
public static double calculateArea(List<double[]> coordinates) {
int n = coordinates.size();
double area = 0.0;
for (int i = 0; i < n; i++) {
double[] point1 = coordinates.get(i);
double[] point2 = coordinates.get((i + 1) % n);
double lat1 = point1[0];
double lon1 = point1[1];
double lat2 = point2[0];
double lon2 = point2[1];
// 使用 Shoelace 公式结合球面几何计算面积
area += toRadians(lon2 - lon1) * (2 + Math.sin(toRadians(lat1)) + Math.sin(toRadians(lat2)));
}
area = Math.abs(area * (6371.0 * 6371.0) / 2.0); // 结果转换为平方公里
return area;
}
public static void main(String[] args) {
List<double[]> coordinates = new ArrayList<>();
// 示例经纬度数据
coordinates.add(new double[]{45.034650,-111.103838 });
coordinates.add(new double[]{41.039066,-111.079371 });
coordinates.add(new double[]{41.018909,-104.059046 });
coordinates.add(new double[]{45.019182, -104.039470 });
double areaKm2 = calculateArea(coordinates);
System.out.println("Calculated area: " + areaKm2 + " square kilometers");
}
}
JAVA 通过经纬度点(边界)计算面积
最新推荐文章于 2024-09-13 16:04:01 发布