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