从给定的阵列lat long开始,距离最近的lat长约25 km

时间:2012-06-05 06:19:00

标签: php google-maps map

我有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公里的纬度

是否有任何计算距离给定阵列最近的25 km纬度。

NOTE: for some reason i can not use sql query, because i get lat long from given address 

3 个答案:

答案 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时,你得到了你想要的结果。