JAVA 通过经纬度点(边界)计算面积

示例数据为美国 怀俄明州 边界 谷歌他的实际面积为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");
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值