【问题标题】:get nearest lat long around 25 km from given array lat long从给定的数组 lat long 获取最近的 lat long 大约 25 公里
【发布时间】:2012-06-05 06:19:00
【问题描述】:

我有 array 的 lat long 喜欢:

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 公里 lat long

对于给定数组的最近 25 km 的纬度是否有任何计算。

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

【问题讨论】:

  • locationList 是一个 javascript 数组,为什么该问题被标记为 PHP?
  • 我正在使用 php,并且我在 php 中有地址数组,所以我正在转换为 java 脚本

标签: php google-maps map


【解决方案1】:

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

【讨论】:

  • $lat1, $lon1, $lat2, $lon2 的值是多少?
  • 我强烈建议进行第一次“粗略”排序,以清除所有位于正方形之外且源位于中心的数据点。否则,您可能会使用大量计算能力来发现某个点距离您的起点 500 公里。
【解决方案2】:

首先,您的数据数组很糟糕。您需要使您的数据更具计算机可读性。然后您可以使用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;
  }

}

【讨论】:

  • +1,但要注意勾股定理是相当不精确的,因为地球是球形的,而不是平坦的 :) 想想看,例如,你越靠近北极和南极,坐标在小距离内变化更快。
【解决方案3】:

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

将结果存储在一个数组中,对数组进行排序,当最小的条目

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2012-03-20
    • 2021-04-18
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多