使用Google Maps API查找最近的位置

时间:2013-05-15 09:22:59

标签: google-maps-api-3 android-maps

您好我正在编写一个应用程序,显示地址附近的自行车站。我有一个服务中每个自行车站的纬度和经度位置列表。

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

4 个答案:

答案 0 :(得分:23)

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

您有不同的解决方案。您可以选择为地图边界内的所有自行车站绘制标记(但是根据缩放级别可以绘制许多标记,或者您必须阻止脚本在达到某个缩放级别之前绘制标记)或者你可以在一个位置周围的 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是坐标周围的半径(以km为单位)

这使用了Haversine公式。可以找到好的信息here

希望这会有所帮助,但我们并不知道您是如何在应用中组织数据的。如果您需要更多帮助,请告诉我们更多信息!

答案 1 :(得分:12)

以防万一有人在2016年寻找正确答案。

google创建了一个非常有用的 library ,Geometry库有许多不同的方法可以帮助解决这个问题:

<强> computeDistanceBetween()

answer 解释了如何使用它。

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

所以你可以简单地说:

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

距离结果以米为单位。

之前的算法可能没有优化,因为我们中的一些人可能有数千个坐标的数组,这样方法 containsLocation()变得很方便,因为您可以通过指定来缩小搜索范围您可以在其中搜索的多边形。

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

答案 2 :(得分:5)

我有同样的任务,我使用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;
        }  

对于测试,我使用了这些坐标

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

结果应为325932.546518米。如果你想要公里,只需除325932.546518/1000 = 325.932546518km

根据指南haversine

,可以将相同的公式翻译为javascript

答案 3 :(得分:4)

Google可能已经有these个结果, 但是如果你已经拥有了这些地方的坐标,那么就可以更直接地绘制你的积分。

相关问题