【问题标题】:Calculate the distance between two Geographical Coordinates in Java用Java计算两个地理坐标之间的距离
【发布时间】:2016-02-22 21:05:00
【问题描述】:

我有两个 GPS 坐标,例如:(44.40239182909422, 8.930511474608954)(30.297017883371236, 122.3822021484364)

我想知道这两点之间的距离(以米为单位)。我不知道第一个坐标是否大于第二个。

我正在尝试理解和修改此代码示例:

 private double _distance(double lat1, double lon1, double lat2, double lon2) {
      double theta = lon1 - lon2;
      double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
      dist = Math.acos(dist);
      dist = rad2deg(dist);
      dist = dist * 60 * 1.1515; // 60 is the number of minutes in a degree;  //1.1515 is the number of statute miles in a nautical mile.One nautical mile is the length of one minute of latitude at the equator.
      dist = dist * 1.609344;

      return (dist);
}

为了计算“theta”,我添加了以下代码:

double theta = lon1 - lon2;

if(lon2>lon1)
    theta = lon2 - lon1;

【问题讨论】:

标签: java


【解决方案1】:

距离函数将返回以米为单位的两点之间的距离

public double distance() {

    double lat1 = 44.40239182909422;
    double lon1 = 8.930511474608954;
    double lat2 = 30.297017883371236;
    double lon2 = 122.3822021484364;
    double theta = lon1 - lon2;
    double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
    dist = Math.acos(dist);
    dist = rad2deg(dist);
    dist = dist * 1.609344 * 1000;        
    return (dist); // 134910.69784909734
}
    /* The function to convert decimal into radians */
private double deg2rad(double deg) {
    return (deg * Math.PI / 180.0);
}       
    /* The function to convert radians into decimal */
private double rad2deg(double rad) {
    return (rad * 180.0 / Math.PI);
}

【讨论】:

  • 以英里为单位计算的距离,因此以公里为单位的转换应乘以 1.609344,以米为单位的转换再次乘以 1000
  • 地球半径隐藏在哪里?
  • 也许它利用了秒与海里紧密联系的事实?因此结果以英里为单位?那么半径将是不必要的
  • 最有可能。然而,这是一种简化。而且这个公式不是很好。它不应该被使用。还有其他公式可以指定地球半径,由于 GPS 坐标与 WGS84 地球模型相关,因此应使用 WGS84 地球半径。搜索半正弦公式以获得良好的开端。
  • @AlexWien 我不确定这个公式好不好,但我确信在这个公式中不需要使用地球半径。您正在谈论的公式是 Haversine's,它使用地球的半径来计算距离,链接是这样的:stackoverflow.com/questions/3694380