区域坐标求中心点

前言:最近项目上在做地图集成的时候遇到了一个小问题,需要在一堆地图经纬度坐标中,算出一个默认的地理中心点,地图初始加载的时候,就从这个地理中心点开始加载,在各种搜寻答案的是,收集到了一般的这两种计算地理中心点的方式。

方式一:求物理中心点400km以内的区域

public static String getCenterPoint(String str) {
    String[] geoCoordinateArray = str.split(";");
    int total = geoCoordinateArray.length;
    double lat = 0, lon = 0;
    for (String g : geoCoordinateArray) {        String[] lngLat = g.split(",");
        lon += Double.parseDouble(lngLat[0]) * Math.PI / 180;
        lat += Double.parseDouble(lngLat[1]) * Math.PI / 180;
    }
    lat /= total;
    lon /= total;
    return lon * 180 / Math.PI + "," + lat * 180 / Math.PI;
}

方式二:求平均中心点坐标

public static String getCenterPoint2(String str) {
    String[] geoCoordinateArray = str.split(";");
    int total = geoCoordinateArray.length;
    double a = 0, b = 0, c = 0;
    for (String g: geoCoordinateArray) {        double lat, lon, x, y, z;
        String[] lngLat = g.split(",");

        lat = Double.valueOf(lngLat[1]) * Math.PI / 180;
        lon = Double.valueOf(lngLat[0]) * Math.PI / 180;
        x = Math.cos(lat) * Math.cos(lon);
        y = Math.cos(lat) * Math.sin(lon);
        z = Math.sin(lat);
        a += x;
        b += y;
        c += z;


    }    a = a / total;
    b = b / total;
    c = c / total;
    double lon = Math.atan2(a, b);
    double hyp = Math.sqrt(a * a + b * b);
    double lat = Math.atan2(c, hyp);
    return lon * 180 / Math.PI + "," + lat * 180 / Math.PI;
    //return new GeoCoordinate(Lat * 180 / Math.PI, Lon * 180 / Math.PI);

}

这两种方式都是根据经纬度来计算出大概的中心点坐标,还有一种更为精准的计算方式,因为涉及到3D平面科学计算等知识,超出本人理解能力,这里不做举例。

暂无评论