我正在寻找一种方式平滑计算两个GPS点之间的距离,让我得到这样的结果:“你必须去X公尺高和y米向左 - 这样我就可以用一个二维坐标系统中工作,其中我有作为(0,0)的位置和其他位置被示出从我的位置以米在(X,Y)的距离。
我的想法是利用计算haversine公式点之间的距离。 (这将返回我的斜边)
除此之外,我计算这两个点之间的轴承。 这是我的阿尔法。
有了这个两个值,我想用基本的三角函数来解决我的问题。
于是,我就计算: catheti_1 = sin(alpha) * hypotenuse, catheti_2 = cos(alpha) * hypotenuse
。
也许我做错了什么,但我的结果是目前无用。
所以我的问题是:如何计算两个GPS点之间的X距离和Y方向?
我计算阿尔法以下过程:
public static double bearingTo(GPSBean point1, GPSBean point2) {
double lat1 = Math.toRadians(point1.latitude);
double lat2 = Math.toRadians(point2.latitude);
double lon1 = Math.toRadians(point1.longitude);
double lon2 = Math.toRadians(point2.longitude);
double deltaLong = lon2 - lon1;
double y = Math.sin(deltaLong) * Math.cos(lat2);
double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
* Math.cos(lat2) * Math.cos(deltaLong);
double bearing = Math.atan2(y, x);
return (Math.toDegrees(bearing) + 360) % 360;
}
我刚刚实施了代码,使用纽约和波士顿的大致坐标作为参考点,并实施haversine公式如发现http://www.movable-type.co.uk/scripts/latlong.html (你没节目):
long1 = -71.02; lat1 = 42.33;
long2 = -73.94; lat2 = 40.66;
lat1 *=pi/180;
lat2 *=pi/180;
long1*=pi/180;
long2*=pi/180;
dlong = (long2 - long1);
dlat = (lat2 - lat1);
// Haversine formula:
R = 6371;
a = sin(dlat/2)*sin(dlat/2) + cos(lat1)*cos(lat2)*sin(dlong/2)*sin(dlong/2)
c = 2 * atan2( sqrt(a), sqrt(1-a) );
d = R * c;
当我运行这段代码,我得到d = 306
,这与上述网站的答案一致。
对于轴承我得到52度 - 再次,接近现场给予了什么。
没有看到你的代码的其余部分,很难知道为什么你的答案是不同的。
注意:当两个点靠近在一起,你可以做出各种近似的,但是这个代码应该仍然工作-公式具有数值稳定性好,因为它是使用sin
经度之间的差异,纬度(而不是的区别罪)。
附录:
使用你的代码为X,Y(你的问题),我得到合理值的距离 - 120米(这是不坏之内与“正确”的答案同意,因为一个是直线逼近和其他跟随地球的曲率)。 因此,我认为你的代码基本上是OK,现在你固定的错字。
使用半正矢公式计算由纬度/经度指定的两个点之间的距离(单位:公里)(以数字度)
从:半正矢式 - RW辛诺特“的半正矢的德”
天空和望远镜,第68卷,第2,1984年
http://www.census.gov/cgi-bin/geo/gisfaq?Q5.1
示例用法从形式:
result.value = LatLon.distHaversine(lat1.value.parseDeg(), long1.value.parseDeg(), * lat2.value.parseDeg(), long2.value.parseDeg());
使用Javascript:
LatLon.distHaversine = function(lat1, lon1, lat2, lon2) {
var R = 6371; // earth's mean radius in km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
lat1 = lat1.toRad(), lat2 = lat2.toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d;
}