Javascript 如何检查一个点是否靠近数组中的任何其他点
我在这里找到了一个答案,根据某个半径确定两个点是否彼此靠近: 这不是我想要的确切答案,但是,因为我想重写此函数:Javascript 如何检查一个点是否靠近数组中的任何其他点,javascript,google-maps,Javascript,Google Maps,我在这里找到了一个答案,根据某个半径确定两个点是否彼此靠近: 这不是我想要的确切答案,但是,因为我想重写此函数: function arePointsNear(checkPoint, centerPoint, km) { var ky = 40000 / 360; var kx = Math.cos(Math.PI * centerPoint.lat / 180.0) * ky; var dx = Math.abs(centerPoint.lng - checkPoint.lng)
function arePointsNear(checkPoint, centerPoint, km) {
var ky = 40000 / 360;
var kx = Math.cos(Math.PI * centerPoint.lat / 180.0) * ky;
var dx = Math.abs(centerPoint.lng - checkPoint.lng) * kx;
var dy = Math.abs(centerPoint.lat - checkPoint.lat) * ky;
return Math.sqrt(dx * dx + dy * dy) <= km;
}
函数arePointsNear(检查点、中心点、公里){
var ky=40000/360;
var kx=数学cos(数学PI*centerPoint.lat/180.0)*ky;
var dx=数学绝对值(centerPoint.lng-checkPoint.lng)*kx;
var dy=数学.abs(centerPoint.lat-checkPoint.lat)*ky;
return Math.sqrt(dx*dx+dy*dy)我认为解决方案很简单:只需将return false
语句从for循环中取出。这样,只有当数组中没有足够接近的点时,才会返回false
。(现在,如果第一个点不够接近,则返回false)
函数arePointsNear(检查点、中心点数组、km){
var ky=40000/360;
对于(变量i=0;i
函数arePointsNear(检查点、中心点、公里){
var ky=40000/360;
var kx=数学cos(数学PI*centerPoint.lat/180.0)*ky;
var dx=数学绝对值(centerPoint.lng-checkPoint.lng)*kx;
var dy=数学.abs(centerPoint.lat-checkPoint.lat)*ky;
返回Math.sqrt(dx*dx+dy*dy)不幸的是,它没有。我添加了一个JS小提琴的链接来帮助解释这里发生了什么。我建议,只使用谷歌的球面距离api,而不是滚动你自己的距离。我在你的小提琴上玩,你实现的距离函数是错误的。标记者说他们在2000公里之外,当他们被坐在彼此的上面。什么是“期望的结果?你为什么期望这个结果?如果我用几何体库中的computeDistanceBetween
替换你的函数,它会像我期望的那样工作。
function arePointsNear(checkPoint, centerPointArray, km) {
var ky = 40000 / 360;
for (var i = 0; i < centerPointArray.length; i++) {
var kx = Math.cos(Math.PI * centerPointArray[i].lat / 180.0) * ky;
var dx = Math.abs(centerPointArray[i].lng - checkPoint.lng) * kx;
var dy = Math.abs(centerPointArray[i].lat - checkPoint.lat) * ky;
if (Math.sqrt(dx * dx + dy * dy) <= km) {
return true;
} else {
return false;
}
}
}
var centerPointArray = [
{ lat: -42.734358, lng: 147.439506, info: "T" },
{ lat: -42.735258, lng: 147.438000, info: "V" },
{ lat: -43.999792, lng: 170.463352, info: "W" }
]
function arePointsNear(checkPoint, centerPointArray, km) {
var ky = 40000 / 360;
for (var i = 0; i < centerPointArray.length; i++) {
var kx = Math.cos(Math.PI * centerPointArray[i].lat / 180.0) * ky;
var dx = Math.abs(centerPointArray[i].lng - checkPoint.lng) * kx;
var dy = Math.abs(centerPointArray[i].lat - checkPoint.lat) * ky;
if (Math.sqrt(dx * dx + dy * dy) <= km)
return true;
}
return false;
}