2013-05-15 48 views
14

嗨我正在写一个应用程序,显示地址附近的自行车站。我有一个服务的每个自行车站的经纬度位置列表。使用Google Maps API查找最近的地点

我可以标记我目前的位置或目前为止的任何地址。如何在地图上显示我所在位置附近的所有自行车站。我是否首先从当前位置获取最近的Google地点,然后访问数据库获取自行车位置并在地图上制作标记?什么是最好的方法?

回答

3

谷歌可能已经有these结果, 但是,如果你已经有了你的坐标的地方,它似乎可能会更直接地绘制你的点。

+0

感谢以下。似乎我需要谷歌地方另一个API密钥。我已经在使用Google地图api访问权限的Android地图键,这对我来说有点令人困惑,必须阅读更多内容。 – Geoplex

+0

是的你是对的。尽管Google可以为您提供大量有用的数据,但如果您可以使用其他可信来源(您自己的数据,其他提供商等),只需使用它们即可!那么你不会依赖谷歌进行数据更新(这可能是一个难题),而且在很多情况下你不能这样做。 – MrUpsidown

19

如果您已经拥有自行车站的坐标,并且您信任这些数据,那么只需使用它来绘制标记。现在你必须定义“近”的含义。

您对此有不同的解决方案。您可以选择为地图范围内的所有自行车站绘制标记(但可能会根据缩放级别绘制多个标记,或者必须防止脚本在达到某个缩放级别之前绘制标记)或者您可以在一个位置(可以是用户位置,地图中心坐标等)周围的n公里内绘制标记。

对于第二个方案,如果你是存储在MySQL数据库中你的自行车站,你可以做一个这样的查询:

$sql = "SELECT *, (6371 * acos(cos(radians(" . $db->real_escape_string($lat) . ")) * cos(radians(lat)) * cos(radians(lng) - radians(" . $db->real_escape_string($lng) . ")) + sin(radians(" . $db->real_escape_string($lat) . ")) * sin(radians(lat)))) AS distance FROM your_table_name HAVING distance < 15"; 

$lat$lng是您的中心坐标

latlng是你的MySQL列名

15是坐标周围的半径(以公里为单位)

这使用Haversine公式。良好的信息可以发现here

希望这会有所帮助,但我们并不真正了解如何在您的应用中组织数据。如果您需要更多帮助,请提供更多信息!在2016年

+0

感谢您的SQL查询。我拥有所有的自行车站位置和经度和纬度,我从服务中拉出来,并可以将其存储在SQL表中。我会试着给你的解决方案。看到某个地方,你可以把所有lat-long放在一个数组中并使用Haversine公式。我有近3000条记录,并且不想加载数组中的所有内容并搜索最近的记录。我想我会尝试你的第二个解决方案,并在这里更新什么工作。干杯。 – Geoplex

+0

如果我有3K记录,我会使用这种方法。它会没事的。我正在处理超过150K条记录,它运行得很好。使用AJAX!你会有一个伟大的应用程序! :-) – MrUpsidown

+0

非常感谢。帮了我很多。 – RY35

5

以防万一有人正在寻找正确的答案有一个非常有用的library由谷歌创建的,几何库有许多不同的方法,这可能有助于解决这个问题:

computeDistanceBetween()

answer准确地解释了如何使用它。

这通常会计算两个传递的LatLng对象之间的距离。

所以你可以简单地说:

  • 获取所有自行车站的位置。
  • 将它们存储在数组中。
  • 找到用户当前位置。
  • 循环你的数组,并使用上述方法将位置转换为距离。
  • 排序你的数组以获得最小距离。

距离结果用米表示。

以前的算法可能不是最优的,因为有些人可能有成千上万的坐标的阵列,这其中方法containsLocation()变得方便,因为你可以通过指定一个多边形缩小检索范围你可以在里面搜索。

这可能不是寻找最近位置的最佳方法,但我相信如果数据库中有合理数量的工作站,它会完成这项工作。

+0

您应该考虑性能和API调用/配额。当OP提到他正在处理几千个位置时,我认为这不是一个合适的答案,尤其是当您可以使用单个数据库查询完成所有这些操作时。 – MrUpsidown

+0

@MrUpsidown我希望你在阅读评论前仔细阅读答案:) – ProllyGeek

+0

它的哪一部分?两种方法都需要针对每个点的API调用。我错了吗? – MrUpsidown

1

我有同样的任务,我解决了使用haversine 公式。 这是我在PHP

 private function distance($latA, $lngA,$latB, $lngB) { 
      $R = 6371000; 
      $radiansLAT_A = deg2rad($latA); 
      $radiansLAT_B = deg2rad($latB); 
      $variationLAT = deg2rad($latB - $latA); 
      $variationLNG = deg2rad($lngB - $lngA); 

      $a = sin($variationLAT/2) * sin($variationLAT/2) 
       + cos($radiansLAT_A) * cos($radiansLAT_B) * sin($variationLNG/2) * sin($variationLNG/2); 

      $c = 2 * atan2(sqrt($a), sqrt(1-$a)); 

      $d = $R * $c; 

      return $d; 
     } 

例子,测试我使用这些COORDS

  $distance = $this->distance(-12.0972,-77.0267,-13.160616,-74.227440); 

结果应该是325932.546518米。如果妳希望公里只是划分325932.546518/1000 = 325.932546518km

同样的公式可以被翻译成JavaScript指导的答案haversine

+0

这个数据的功能$ R = 6371000; ?那是静态的吗? –

+0

@DimasAdiAndrea $ R是地球的半径;) – roll

相关问题