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

Geo*_*lex 20 google-maps-api-3 android-maps

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

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

MrU*_*own 26

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

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

$lat$lng作为你的中心坐标

latlng成为你的MySQL列名

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

这使用了Haversine公式.可以在这里找到好的信息.

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


Pro*_*eek 14

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

谷歌创建了一个非常有用的.几何库有许多不同的方法可能有助于解决这个问题:

computeDistanceBetween()

这个答案解释了如何使用它.

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

所以你可以简单地说:

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

距离结果以米为单位表示.

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

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


rol*_*oll 5

我有同样的任务,我用hasrsine 公式解决了.这是我在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;
}  
Run Code Online (Sandbox Code Playgroud)

为了测试,我使用了这些坐标

$distance = $this->distance(-12.0972,-77.0267,-13.160616,-74.227440);
Run Code Online (Sandbox Code Playgroud)

结果应325932.546518以米为单位.如果你想在公里只是除325932.546518/1000=325.932546518km

相同的公式可以在指南hasrsine之后转换为javascript


Evi*_*mic 4

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