21

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

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

4

4 回答 4

27

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

您对此有不同的解决方案。您可以选择为地图范围内的所有自行车站绘制标记(但根据缩放级别可能需要绘制许多标记,或者您必须阻止脚本在达到某个缩放级别之前绘制标记)或者您可以在某个位置周围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 公式。好的信息可以在这里找到。

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

于 2013-05-15T11:17:58.430 回答
15

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

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

计算距离之间()

这个答案准确地解释了如何使用它。

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

所以你可以简单地:

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

距离结果以米为单位。

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

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

于 2016-07-30T04:53:23.747 回答
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

可以按照指南hasrsine将相同的公式转换为 javascript

于 2017-09-27T23:22:00.460 回答
4

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

于 2013-05-15T10:05:36.013 回答