你好,我正在编写一款显示附近自行车站点的应用程序。我已经从服务中获得了每个自行车站点的纬度和经度位置列表。
我可以标记我的当前位置或任何其他地址。如何在地图上显示所有靠近我的位置的自行车站点?我应该先获取距离当前位置最近的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年寻找正确答案。
谷歌创建了一个非常有用的库,几何库有许多不同的方法可以帮助解决这个问题:
computeDistanceBetween()
这个答案详细解释了如何使用它。
通常会计算传递的两个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
。谷歌可能已经有了这些结果,但如果您已经知道地点的坐标,直接绘制点似乎更为简单明了。