欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java根据几个地点的经纬度,求出这些经纬度的中心点

程序员文章站 2024-03-24 12:24:28
...

java根据几个地点的经纬度,求出这些经纬度的中心点

最近项目中需要根据得到的一些地图上点的经纬度,求出这些经纬度的中心点的需求哦,为此写了一个方法。这里给大家分享一下。

public class CenterPoint {

    /**
     *  根据输入的地点坐标计算中心点
     * @param str
     * @return
     */
    public static Map<String,Double> getCenterPoint(String str) {
        String[] arr = str.split(";");
        int total = arr.length;
        double X = 0, Y = 0, Z = 0;
        for(int i=0;i<arr.length;i++){
            double lat, lon, x, y, z;
            lon = Double.parseDouble(arr[i].split(",")[0]) * Math.PI / 180;
            lat = Double.parseDouble(arr[i].split(",")[1]) * Math.PI / 180;
            x = Math.cos(lat) * Math.cos(lon);
            y = Math.cos(lat) * Math.sin(lon);
            z = Math.sin(lat);
            X += x;
            Y += y;
            Z += z;
        }

        X = X / total;
        Y = Y / total;
        Z = Z / total;
        double Lon = Math.atan2(Y, X);
        double Hyp = Math.sqrt(X * X + Y * Y);
        double Lat = Math.atan2(Z, Hyp);

        Map<String,Double> map = new HashMap<String,Double>();
        map.put("lng", Lon * 180 / Math.PI);
        map.put("lat", Lat * 180 / Math.PI);
        return map;
    }

    public static void main(String[] args) {
        String lng_lat = "116.3301,34.42709;116.3326,34.42544;116.3326,34.42443;116.3324,34.4221;116.3365,34.42225;116.3338,34.42206;";
        Map <String,Double>  map = getCenterPoint(lng_lat);
        System.out.println(map.get("lng") +","+ map.get("lat"));//30.589848801178064,118.65923827037791

        String[] arr = lng_lat.split(";");
        int total = arr.length;
        for(int i=0;i<total;i++){

            double distince = GetDistance(Double.parseDouble(arr[i].split(",")[1]), Double.parseDouble(arr[i].split(",")[0]),
                    map.get("lat"), map.get("lng"));

            System.out.println(arr[i]+":"+distince);
        }
    }


    private static double EARTH_RADIUS = 6371.393;
    private static double rad(double d)
    {
        return d * Math.PI / 180.0;
    }

    /**
     * 计算两个经纬度之间的距离
     * @param lat1
     * @param lng1
     * @param lat2
     * @param lng2
     * @return
     */
    public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
    {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double a = radLat1 - radLat2;
        double b = rad(lng1) - rad(lng2);
        double s = 2 * Math.asin(Math.sqrt(Math.abs(Math.pow(Math.sin(a/2),2) +
                Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2))));
        s = s * EARTH_RADIUS;
        s = Math.round(s * 1000);
        return s;
    }
}

看都看完了,给个关注呗

相关标签: 工具类 java