用于计算两个坐标之间距离的函数

2022-08-30 00:41:46

我目前正在使用下面的函数,它不能正常工作。根据谷歌地图,这些坐标(从到)之间的距离是公里,而函数返回公里。如何使此函数返回正确的距离?59.3293371,13.487747259.3225525,13.46194222.21.6

function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) {
  var R = 6371; // Radius of the earth in km
  var dLat = deg2rad(lat2-lat1);  // deg2rad below
  var dLon = deg2rad(lon2-lon1); 
  var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(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; // Distance in km
  return d;
}

function deg2rad(deg) {
  return deg * (Math.PI/180)
}

jsFiddle: http://jsfiddle.net/edgren/gAHJB/


答案 1

你使用的是所谓的哈弗正弦公式,它计算乌鸦飞行时球体上两点之间的距离。您提供的 Google 地图链接将距离显示为 2.2 公里,因为它不是一条直线。

Wolfram Alpha 是进行地理计算的重要资源,并且还显示了这两点之间的距离为 1.652 公里

Drive distance vs. straight line distance (red line mine).

如果您要查找直线距离(如乌鸦文件),则您的函数工作正常。如果你想要的是驾驶距离(或骑自行车距离或公共交通距离或步行距离),则必须使用地图API(GoogleBing是最受欢迎的)来获得适当的路线,其中包括距离。

顺便说一句,Google Maps API在其google.maps.geometry.spherical命名空间中提供了球面距离的打包方法(查找)。它可能比滚动自己的更好(对于初学者来说,它使用更精确的地球半径值)。computeDistanceBetween

对于我们当中的挑剔者,当我说“直线距离”时,我指的是“球体上的直线”,这实际上是一条曲线(即大圆距离)。


答案 2

我以前写过类似的方程式 - 测试过它,也得到了1.6公里。

你的谷歌地图显示了驾驶距离。

您的函数在乌鸦飞行时进行计算(直线距离)。

alert(calcCrow(59.3293371,13.4877472,59.3225525,13.4619422).toFixed(1));



    //This function takes in latitude and longitude of two location and returns the distance between them as the crow flies (in km)
    function calcCrow(lat1, lon1, lat2, lon2) 
    {
      var R = 6371; // km
      var dLat = toRad(lat2-lat1);
      var dLon = toRad(lon2-lon1);
      var lat1 = toRad(lat1);
      var lat2 = toRad(lat2);

      var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
      var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
      var d = R * c;
      return d;
    }

    // Converts numeric degrees to radians
    function toRad(Value) 
    {
        return Value * Math.PI / 180;
    }