1

我有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' );

我想从第一个给定的数组中获得最近的 25 公里 lat long23.2531803, 72.4774396

是否有任何计算给定数组中最近的 25 km 的 lat long。

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

3 回答 3

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 公里直径处可以忽略不计。

于 2012-06-05T07:09:39.143 回答
1

首先,您的数据数组很糟糕。您需要使您的数据更具计算机可读性。然后您可以使用勾股定理来计算与每个位置的距离。您可以将第一个距离和索引保存在变量中,然后用新的距离和索引替换它(如果它更短)。

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;
  }

}
于 2012-06-05T07:18:46.337 回答
0

当你喜欢在 JS 中计算时,你可以使用google.maps.geometry.spherical.computeDistanceBetween()来计算单点之间的距离。

将结果存储在一个数组中,对数组进行排序,当最小的条目小于 25 公里时,你就得到了你想要的。

于 2012-06-05T07:33:47.153 回答