嗨,我正在编写一个应用程序,显示地址附近的自行车站。我有服务中每个自行车站的纬度和经度位置列表。
我可以标记我当前的位置,或到目前为止的任何地址。如何在地图上显示我所在位置附近的所有自行车站。我是否首先从当前位置获取最近的 Google 地点,然后访问数据库以获取自行车位置并在地图上做标记?最好的方法是什么?
嗨,我正在编写一个应用程序,显示地址附近的自行车站。我有服务中每个自行车站的纬度和经度位置列表。
我可以标记我当前的位置,或到目前为止的任何地址。如何在地图上显示我所在位置附近的所有自行车站。我是否首先从当前位置获取最近的 Google 地点,然后访问数据库以获取自行车位置并在地图上做标记?最好的方法是什么?
如果您已经有了自行车站的坐标并且您信任这些数据,那么只需使用它来绘制您的标记。现在您必须定义“近”的含义。
您对此有不同的解决方案。您可以选择为地图范围内的所有自行车站绘制标记(但根据缩放级别可能需要绘制许多标记,或者您必须阻止脚本在达到某个缩放级别之前绘制标记)或者您可以在某个位置周围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
成为你的中心坐标
lat
并lng
成为您的 MySQL 列名
15
是您的坐标周围的半径(以公里为单位)
这使用Haversine 公式。好的信息可以在这里找到。
希望这会有所帮助,但我们并不真正了解您是如何在应用程序中组织数据的。如果您需要更多帮助,请给我们更多信息!
以防万一有人在 2016 年寻找正确答案。
谷歌创建了一个非常有用的库,几何库有许多不同的方法可能有助于解决这个问题:
计算距离之间()
这个答案准确地解释了如何使用它。
这通常会计算两个通过的 LatLng 对象之间的距离。
所以你可以简单地:
距离结果以米为单位。
之前的算法可能没有优化,因为我们中的一些人可能有一个包含数千个坐标的数组,这其中containsLocation()方法变得很方便,因为您可以通过指定可以在其中搜索的多边形来缩小搜索区域。
这可能不是找到最近位置的最佳方法,但我相信如果您的数据库中有合理数量的站点,它会完成这项工作。
我有同样的任务,我用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
谷歌可能已经有了这些结果,但是如果你已经有了这些地方的坐标,那么绘制你的点似乎更简单。