【问题标题】:Distance from long lat line segment wrong over long distances [duplicate]长距离长纬线段的距离错误[重复]
【发布时间】:2014-03-01 01:23:23
【问题描述】:

我正在计算一个点离地​​球上的线段有多远。

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

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

  • 英国伦敦 - 0 公里
  • 意大利罗马 - 5 公里
  • 利比亚昔兰尼 - 0 公里

但在 Google 地球上,它实际上更像是 61 公里

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

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

我相信问题出在代码的某个地方:

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/

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

【问题讨论】:

  • 可能想尝试基于Haversine(半正弦)的公式来计算两点之间的距离。 JavaScript 代码在 movable-type.co.uk/scripts/latlong.html 提供
  • 是的,似乎这个 distToSegment 在一些地方是错误的

标签: javascript geometry geocoding geospatial google-earth


【解决方案1】:

这个

bearing1 = 360 - (bearing1 + 360 % 360)

对我来说看起来很可疑。你是说

bearing1 = 360 - (bearing1 + 360) % 360

?

bearing2 也是如此。

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

【讨论】:

  • 刚试过,没区别:(
猜你喜欢
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多