计算两个GPS点之间在(x, y)方向上的距离

5
我正在寻找一种平滑的方法来计算两个GPS点之间的距离,以便我可以得到结果,如:“您需要向上移动x米和向左移动y米 - 这样我就可以使用二维坐标系进行操作,其中我的位置为(0,0),其他位置显示的是相对于我的位置以米为单位的(x,y)距离。”
我的想法是使用haversine公式计算两点之间的距离。(这返回我的斜边)
除此之外,我还计算了这两个点之间的方位角。这是我的alpha。
有了这两个值,我想使用基本三角函数解决我的问题。
所以我尝试计算:catheti_1 = sin(alpha) * hypotenuse, catheti_2 = cos(alpha) * hypotenuse
也许我做错了什么,但目前我的结果是无用的。
所以我的问题是:如何计算两个GPS点之间在x和y方向上的距离?
我按以下步骤计算alpha:
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;
}

你是如何计算“alpha”的? - Barranka
我已经添加了alpha方法 ;) - Frame91
嘿,是的,我正在将弧度传递给正弦和余弦 :/。我想知道方位角始终返回大约180(+-1)的值。我的公式错了吗? - Frame91
1
你至少有一个拼写错误:你的 lat2 使用了 point2.longitude。这样不会得到正确答案...... - Floris
是的。谢谢!这明显是错误的。我已经更改了它,但我的结果仍然是错误的。 - Frame91
显示剩余4条评论
3个回答

6

我刚刚根据您提供的代码,使用纽约市和波士顿的近似坐标作为参考点,并实现了在http://www.movable-type.co.uk/scripts/latlong.html 上找到的Haversine公式(您没有展示):

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;

当我运行这段代码时,我得到了,这与上述网站的答案相符。
对于方位角,我得到了52度 - 再次接近该网站给出的结果。
不看你的代码的其余部分,很难知道你的答案为什么不同。
注意:当两个点靠得很近时,你可以进行各种近似,但这段代码仍然有效 - 公式具有良好的数值稳定性,因为它使用经度、纬度之间的差异的正弦(而不是正弦的差异)。
补充:
使用你在问题中提供的x、y代码,我得到了合理的距离值 - 与“正确”答案相符,在120米以内(这不错,因为一个是直线近似,另一个则遵循地球的曲率)。所以我认为你的代码基本上是没问题的,现在你已经修复了拼写错误。

嘿,谢谢。我自己测试了一下,在我纠正了打字错误后,我得到了一些可能的值。也许只是打错字了 ;) - Frame91

2
使用Haversine公式计算两个由纬度/经度(以数值度表示)指定的点之间的距离(以千米为单位)
来源:Haversine公式 - R.W. Sinnott,“Haversine的优点”
《天空与望远镜》杂志,1984年第68卷第2期

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;
}

0

如果有人对一个简单的公式感兴趣,每个人都能理解的话。这是我的公式,它适用于瑞典,但你可以通过制定一个更一般的长因子计算公式来适应任何地方。 希望即使用一种奇怪的语言写的,你也能理解。

<gpsDist lat1,long1,lat2,long2> all parameters in 1/100000 degree.
Example: <getDist 5950928,1327120,5958505,1302241> => 16303
Same at https://gps-coordinates.org/distance-between-coordinates.php => 16.35 KM.

<var $latFactor,1.112>
<function getDist,
-<var $longFactor,<calc 0.638 - ($1/100000-55)*0.0171,3>>
-<var $latDist,<calc ($3-$1)*$latFactor>>
-<var $longDist,<calc ($4-$2)*$longFactor>>
-<sqrt $latDist*$latDist + $longDist*$longDist>
->

/贝蒂尔·弗里曼/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接