前言:最近项目上在做地图集成的时候遇到了一个小问题,需要在一堆地图经纬度坐标中,算出一个默认的地理中心点,地图初始加载的时候,就从这个地理中心点开始加载,在各种搜寻答案的是,收集到了一般的这两种计算地理中心点的方式。
方式一:求物理中心点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平面科学计算等知识,超出本人理解能力,这里不做举例。