【发布时间】:2013-05-15 09:22:58
【问题描述】:
您好,我正在编写一个显示地址附近的自行车站的应用。我有服务中每个自行车站的纬度和经度位置列表。
我可以标记我当前的位置,或到目前为止的任何地址。如何在地图上显示我所在位置附近的所有自行车站。我是否首先从当前位置获取最近的 Google 地点,然后访问数据库以获取自行车位置并在地图上做标记?最好的方法是什么?
【问题讨论】:
标签: google-maps-api-3 android-maps
您好,我正在编写一个显示地址附近的自行车站的应用。我有服务中每个自行车站的纬度和经度位置列表。
我可以标记我当前的位置,或到目前为止的任何地址。如何在地图上显示我所在位置附近的所有自行车站。我是否首先从当前位置获取最近的 Google 地点,然后访问数据库以获取自行车位置并在地图上做标记?最好的方法是什么?
【问题讨论】:
标签: google-maps-api-3 android-maps
如果您已经拥有自行车站的坐标并且您信任这些数据,那么只需使用它来绘制标记即可。现在您必须定义“近”的含义。
您对此有不同的解决方案。您可以选择为地图范围内的所有自行车站绘制标记(但根据缩放级别可能需要绘制许多标记,或者您必须阻止脚本在达到某个缩放级别之前绘制标记)或者您可以在某个位置周围 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 公式。好的资料可以找here。
希望这会有所帮助,但我们并不真正了解您是如何在应用中组织数据的。如果您需要更多帮助,请向我们提供更多信息!
【讨论】:
以防万一有人在 2016 年寻找正确答案。
谷歌创建了一个非常有用的library,几何库有许多不同的方法可以帮助解决这个问题:
computeDistanceBetween()
这个answer准确地解释了如何使用它。
这通常会计算两个通过的 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
同样的公式可以按照指南haversine翻译成javascript
【讨论】:
Google 可能已经有these 结果, 但是,如果您已经有了这些地点的坐标,那么仅绘制点似乎会更直接。
【讨论】: