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;
}
}
看都看完了,给个关注呗
上一篇: IOC注入框架的手写实现
下一篇: F2 判断回文 (10 分)