远距离长距离线段的距离错误

时间:2014-02-04 20:58:34

标签: javascript geometry geocoding geospatial google-earth

我正在计算一个点距离地球上的一段线的距离。

我的功能似乎有效,但随着我增加距离,很明显它不起作用。我认为这是由于地球的曲率造成的。

在我的计算中,罗马显示为离线5公里:

  • 英国伦敦 - 0公里
  • 意大利罗马 - 5公里
  • Cyrene,利比亚 - 0km

但在谷歌地球上它实际上更像是61公里 enter image description here

当我开始走更远的距离时,计算会变得更糟!

  • 意大利罗马 - 0公里
  • 巴基斯坦Mohenjo-daro - 0公里
  • 土耳其伊斯坦布尔 - 250公里

enter image description here

我认为问题出现在代码中的某处:

function distToSegment(lat1, lon1, lat2, lon2, lat3, lon3) {
    var y = Math.sin(lon3 - lon1) * Math.cos(lat3);
    var x = Math.cos(lat1) * Math.sin(lat3) - Math.sin(lat1) * Math.cos(lat3) * Math.cos(lat3 - lat1);
    var bearing1 = radiansToDegrees(Math.atan2(y, x));
    bearing1 = 360 - (bearing1 + 360 % 360);
    var y2 = Math.sin(lon2 - lon1) * Math.cos(lat2);
    var x2 = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lat2 - lat1);
    var bearing2 = radiansToDegrees(Math.atan2(y2, x2));
    bearing2 = 360 - (bearing2 + 360 % 360);
    var lat1Rads = degreesToRadians(lat1);
    var lat3Rads = degreesToRadians(lat3);
    var dLon = degreesToRadians(lon3 - lon1);
    var distanceAC = Math.acos(Math.sin(lat1Rads) * Math.sin(lat3Rads) + Math.cos(lat1Rads) * Math.cos(lat3Rads) * Math.cos(dLon)) * 6371;  
    var min_distance = Math.abs(Math.asin(Math.sin(distanceAC / 6371) * Math.sin(degreesToRadians(bearing1) - degreesToRadians(bearing2))) * 6371);
    return min_distance;
}

这是一个可以用来测试的小提琴:

http://jsfiddle.net/kmturley/cfg2D/3/

任何帮助来解决这个问题都将不胜感激!

1 个答案:

答案 0 :(得分:1)

bearing1 = 360 - (bearing1 + 360 % 360)

对我来说很可疑。你的意思是

bearing1 = 360 - (bearing1 + 360) % 360

同样适用于bearing2

%是一个乘法运算符,其优先级高于+