【发布时间】:2018-11-21 19:43:56
【问题描述】:
我试图找到从 C 点到海滩的直线距离。海滩线由 A 点和 B 点定义,使用 Haversine 公式,我得到从 C(我在谷歌地图中的标记)到 AB 海滩线中垂直于 C 的点 D 的距离。
一切正常,但 D 点不是正确的。我用这段代码找到D:
function get_perp(C){
var A = { lat:33.345678, lng:-117.518921 };
var B = { lat:33.100678, lng:-117.318492 };
t = ((C.lat-A.lat)*(B.lat-A.lat)+(C.lng-A.lng)*(B.lng-A.lng))/((B.lat-A.lat)*(B.lat-A.lat)+(B.lng-A.lng)*(B.lng-A.lng));
var D = { lat:0,lng:0};
D.lat = A.lat + t*(B.lat-A.lat);
D.lng = A.lng + t*(B.lng-A.lng);
return D;
}
返回的D点确实是直线上的一个点,但它不垂直于C。是AB线水平或垂直的时候,但是AB和CD的夹角不对的时候。
我已经尝试了我在这里找到的其他功能,但它们都导致相同的结果。
在这个小提琴中,它是整个过程,如果你放大到足够大,你可以看到 AB 和 CD 线不垂直:Shortest distance from AB to C
编辑:在 geogebra 中使用它我可以看到该功能可以找到点。当 google maps api 表示该点时,就会发生错误。 Geogebra
【问题讨论】:
-
这很有趣。绝对是某种精度误差或舍入误差。或者可能与三角函数有关。
-
我尝试了四种不同的方法,它们都返回相同的点坐标,始终在线但不是最近/垂直于 C。
-
如果我猜的话,我会说精度错误发生在这里的某个地方:
t = ((C.lat-A.lat)*(B.lat-A.lat)+(C.lng-A.lng)*(B.lng-A.lng))/((B.lat-A.lat)*(B.lat-A.lat)+(B.lng-A.lng)*(B.lng-A.lng)); -
我一直在使用 geogebra 中的函数,它是正确的!它总是返回精确的垂直点,所以错误是当谷歌地图 api 将该点放在线上时。老实说,我不知道为什么。我已经编辑并放置了 geogebra 链接。
-
看这个answer,很容易移植到javascript
标签: javascript google-maps geometry distance haversine