【问题标题】:Calculate distance in (x, y) between two GPS-Points计算两个 GPS 点之间的 (x, y) 距离
【发布时间】:2021-04-15 16:13:29
【问题描述】:

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

我的想法是使用半正弦公式计算点之间的距离。 (这会返回我的斜边)

除此之外,我还在计算这两点之间的方位角。这是我的 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的?
  • 我已经添加了 alpha 的方法 ;)
  • @Borian 不。这不是重复的,因为我不需要这两点之间的直接距离。我知道 harversine 公式,但我必须在出租车几何中“行走”;)
  • 也许很明显,但您确定您将弧度传递给sin()cos()(在计算catheti_1catheti_2 时)?只是为了丢弃它
  • 您至少有一个错字:您的lat2 使用的是point2.longitude。不会得到正确的答案......

标签: gps latitude-longitude


【解决方案1】:

我刚刚实现了您的代码,使用纽约市和波士顿的近似坐标作为参考点,并实现了 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;

当我运行此代码时,我得到d = 306,这与上述网站的答案一致。

对于方位,我得到 52 度 - 再次接近网站给出的值。

如果不查看您的其余代码,很难知道您的答案为何不同。

注意:当两点靠得很近时,您可以进行各种近似,但这段代码应该仍然有效——该公式具有良好的数值稳定性,因为它使用了经度、纬度之间的差异sin(而不是比罪的区别)。

附录:

使用您的 x、y 代码(在您的问题中),我得到了距离的合理值 - 同意 120 m 以内的“正确”答案(这还不错,因为一个是直线近似值,而其他遵循地球的曲率)。所以我认为你的代码基本上没问题,现在你修正了错字。

【讨论】:

  • 嘿,谢谢。在纠正错字并得到一些可能的值之后,我自己也对其进行了测试。也许这只是错字;)
【解决方案2】:

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

来自:Haversine 公式 - R. W. Sinnott,“Haversine 的美德”

天空与望远镜,第 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;
}

【讨论】:

    【解决方案3】:

    如果有人有兴趣拥有一个任何人都可以理解的更简单的公式。这是我的,它适用于瑞典,但您可以通过制定一个更通用的计算 longfactor 的公式来使其适用于任何地方。 希望你能理解,即使是用奇怪的语言写的。

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

    /贝蒂尔·弗里曼

    【讨论】:

      猜你喜欢
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      相关资源
      最近更新 更多