我使用了这段代码,但它不起作用:
需要两个 GPS 坐标之间的距离,例如 41.1212、11.2323(以公里为单位)(Java)
double d2r = (180 / Math.PI);
double distance = 0;
try{
double dlong = (endpoint.getLon() - startpoint.getLon()) * d2r;
double dlat = (endpoint.getLat() - startpoint.getLat()) * d2r;
double a =
Math.pow(Math.sin(dlat / 2.0), 2)
+ Math.cos(startpoint.getLat() * d2r)
* Math.cos(endpoint.getLat() * d2r)
* Math.pow(Math.sin(dlong / 2.0), 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double d = 6367 * c;
return d;
} catch(Exception e){
e.printStackTrace();
}
经度和纬度以度为单位(0-360)。如果要将度数转换为弧度 (0-2π),您需要除以 360 并乘以 2π(或等效地,乘以 π/180)。然而,在您的代码中,您乘以 180/π。
即改变
double d2r = (180 / Math.PI);
进入
double d2r = Math.PI / 180;
看看Geocalc
Coordinate lat = new GPSCoordinate(41, .1212);
Coordinate lng = new GPSCoordinate(11, .2323);
Point point = new Point(lat, lng);
lat = new DegreeCoordinate(51.4613418);
lng = new DegreeCoordinate(-0.3035466);
Point point2 = new Point(lat, lng);
System.out.println("Distance is " + EarthCalc.getDistance(point2, point) / 1000 + " km");
距离是1448.7325760822912公里
我为我的一个项目编写了该库。
来自 http://www.androidsnippets.com/distance- Between-two-gps-coordinates-in-meter的解决方案。
仅当点足够近以至于您可以忽略地球不是规则形状时才有效。
私人双 gps2m(浮点 lat_a, 浮点 lng_a, 浮点 lat_b, 浮点 lng_b) { 浮动 pk =(浮动)(180/3.14169); 浮动a1 = lat_a / pk; 浮动a2 = lng_a / pk; 浮动 b1 = lat_b / pk; 浮动 b2 = lng_b / pk; float t1 = FloatMath.cos(a1)*FloatMath.cos(a2)*FloatMath.cos(b1)*FloatMath.cos(b2); float t2 = FloatMath.cos(a1)*FloatMath.sin(a2)*FloatMath.cos(b1)*FloatMath.sin(b2); float t3 = FloatMath.sin(a1)*FloatMath.sin(b1); 双 tt = Math.acos(t1 + t2 + t3); 返回 6366000*tt; } //
两点之间的距离(以及许多其他有用的东西)可以在以下位置找到:http://www.movable-type.co.uk/scripts/latlong.html
http://www.androidsnippets.com/distance- Between-two-gps-coordinates-in-meter 显示 double d2r = (180 / Math.PI);
可以使用 Esri Geometry 库计算距离:geodesicDistanceOnWGS84。
我假设 JTS 也有计算距离的方法。
使用 Java - 这将返回以 KM 为单位的距离。
public static Double calculateDistanceBetweenPoints(Double lat1, Double lng1, Double lat2, Double lng2) {
if (lng1 != null && lat1 != null && lng2 != null && lat2 != null) {
double theta = lng1 - lng2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2))
+ Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = (dist * 60 * 1.1515) * 1.609344;
return dist;
}
return null;
}
我们可以通过使用以下转换后的公式在谷歌电子表格中实现相同的效果给定单元格A1(lat1)、B1(long1)、C1(lat2)和D1(long2)中的纬度和经度
=ACOS(SIN(RADIANS(A1)) * SIN(RADIANS(C1)) + COS(RADIANS(A1)) * COS(RADIANS(C1)) * COS(RADIANS(B1 - D1))) * (180 / PI()) * 60 * 1.1515 * 1.609344