我有array
长度像:
var locationList = new Array( '23.2531803, 72.4774396', '22.808782, 70.823863', '24.3310019, 72.8516531', '22.3073095, 73.1810976', '22.3038945, 70.8021599', '23.850809, 72.114838' );
我想从第一个给定的数组23.2531803, 72.4774396
是否有任何计算距离给定阵列最近的25 km纬度。
NOTE: for some reason i can not use sql query, because i get lat long from given address
答案 0 :(得分:4)
步骤1:计算起始坐标与每个次坐标之间的距离 第2步:选择最小距离 第3步:它是否< 25公里?成功了!
如何计算两个坐标之间的距离:
function distance($lat1, $lon1, $lat2, $lon2) {
$D = 6371; // Earth Radius
$dLat = $lat2-$lat1;
$dLon = $lon2-$lon1;
$a = sin($dLat/2) * sin($dLat/2) +
sin($dLon/2) * sin($dLon/2) * cos($lat1) * cos($lat2);
$b = 2 * atan2(sqrt($a), sqrt(1-$a));
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
return $D * $c;
}
这个函数认为地球是一个完美的球,它不是 - 很小的变化确实适用,但在你想要的25公里直径可以忽略不计。
答案 1 :(得分:1)
首先,您的数据阵列非常糟糕。您需要使数据更具计算机可读性。然后,您可以使用Pythagorean theorem计算每个位置的距离。您可以将第一个距离和索引保存在变量中,然后将其替换为新的距离和索引(如果它更短)。
var closest = {id:0,dist:-1};
var myloc = [23.2531303, 72.4774398]
for(var i = 0; i < locationList.length; i++)
{
var long_lat = locationList[i].match(/([0-9.]+)+/)
long_lat[0] = parseFloat(long_lat[0]);
long_lat[1] = parseFloat(long_lat[1]);
var dist = Math.sqrt(Math.pow(long_lat[0] - myloc[0], 2)+Math.pow(long_lat[1] - myloc[1], 2)));
if((closest.dist == -1) || (closest.dist > dist))
{
closest.dist = dist;
closest.id = i;
}
}
答案 2 :(得分:0)
如果您想在JS中计算,可以使用google.maps.geometry.spherical.computeDistanceBetween()计算单点之间的距离。
将结果存储在一个数组中,对数组进行排序,当最小的条目<25km时,你得到了你想要的结果。