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

计算两个GPS点之间的距离(x,y),gps,latitude-longitude,Gps,Latitude Longitude,我正在寻找一种平滑的方法来计算两个GPS点之间的距离,所以我得到的结果是:“你必须向上走x米,向左走y米——这样我就可以使用2d坐标系,我的位置是(0,0),其他位置是以米为单位显示距离(x,y) 我的想法是使用哈弗森公式计算点之间的距离。(这返回我的斜边) 除此之外,我正在计算这两点之间的方位角,这是我的alpha 有了这两个值,我想用基本的三角函数来解决我的问题 所以我试着计算:catheti_1=sin(alpha)*斜边,catheti_2=cos(alpha)*斜边 也许我做错了什么,

我正在寻找一种平滑的方法来计算两个GPS点之间的距离,所以我得到的结果是:“你必须向上走x米,向左走y米——这样我就可以使用2d坐标系,我的位置是(0,0),其他位置是以米为单位显示距离(x,y)

我的想法是使用哈弗森公式计算点之间的距离。(这返回我的斜边)

除此之外,我正在计算这两点之间的方位角,这是我的alpha

有了这两个值,我想用基本的三角函数来解决我的问题

所以我试着计算:
catheti_1=sin(alpha)*斜边,catheti_2=cos(alpha)*斜边

也许我做错了什么,但我的结果目前毫无用处

所以我的问题是:如何计算两个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;
}

我刚刚实现了您的代码,使用纽约和波士顿的近似坐标作为参考点,并实现了在中找到的哈弗森公式(您没有显示):

当我运行这个代码时,我得到了
d=306
,这与上面站点的答案一致

对于轴承,我得到52度-再次,接近网站给出的

如果看不到代码的其余部分,就很难知道您的答案为何不同

注意:当两个点靠近时,可以进行各种近似,但此代码仍应有效-公式具有良好的数值稳定性,因为它使用经度和纬度之间差异的
sin
(而不是sin的差异)

增编:


使用你的x,y代码(在你的问题中),我得到了距离的合理值——与120米内的“正确”答案一致(这并不坏,因为一个是直线近似值,另一个遵循地球的曲率).因此,我认为您的代码基本上是正确的,现在您已经纠正了输入错误。

使用哈弗森公式计算纬度/经度指定的两点之间的距离(以公里为单位)(以数字度为单位)

摘自:哈弗森公式-R.W.辛诺特,“哈弗森的优点”

《天空与望远镜》,第68卷,第2期,1984年

表单中的用法示例:

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

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

<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>
->
所有参数均为1/100000度。
示例:=>16303
同https://gps-coordinates.org/distance-between-coordinates.php =>16.35公里。

/Bertil Friman

你是如何计算α的?我已经添加了α的方法;)@Borian不。它不是重复的,因为我不需要这两点之间的直接距离。我知道harversine公式,但我必须“走”“在出租车几何图形中;)也许这是显而易见的,但您确定要将弧度传递给
sin()
cos()
(在计算
catheti_1
catheti_2
时)?只需放弃您至少有一个输入错误:您的
lat2
正在使用
point2.longitude
。这样做不会得到正确的答案…嘿,谢谢。我自己也测试过,在我纠正了错误后,我得到了一些可能的值。也许只是打字错误;)
<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>
->