【发布时间】: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