嗨我正在写一个应用程序,显示地址附近的自行车站。我有一个服务的每个自行车站的经纬度位置列表。使用Google Maps API查找最近的地点
我可以标记我目前的位置或目前为止的任何地址。如何在地图上显示我所在位置附近的所有自行车站。我是否首先从当前位置获取最近的Google地点,然后访问数据库获取自行车位置并在地图上制作标记?什么是最好的方法?
嗨我正在写一个应用程序,显示地址附近的自行车站。我有一个服务的每个自行车站的经纬度位置列表。使用Google Maps API查找最近的地点
我可以标记我目前的位置或目前为止的任何地址。如何在地图上显示我所在位置附近的所有自行车站。我是否首先从当前位置获取最近的Google地点,然后访问数据库获取自行车位置并在地图上制作标记?什么是最好的方法?
谷歌可能已经有these结果, 但是,如果你已经有了你的坐标的地方,它似乎可能会更直接地绘制你的点。
如果您已经拥有自行车站的坐标,并且您信任这些数据,那么只需使用它来绘制标记。现在你必须定义“近”的含义。
您对此有不同的解决方案。您可以选择为地图范围内的所有自行车站绘制标记(但可能会根据缩放级别绘制多个标记,或者必须防止脚本在达到某个缩放级别之前绘制标记)或者您可以在一个位置(可以是用户位置,地图中心坐标等)周围的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年
感谢您的SQL查询。我拥有所有的自行车站位置和经度和纬度,我从服务中拉出来,并可以将其存储在SQL表中。我会试着给你的解决方案。看到某个地方,你可以把所有lat-long放在一个数组中并使用Haversine公式。我有近3000条记录,并且不想加载数组中的所有内容并搜索最近的记录。我想我会尝试你的第二个解决方案,并在这里更新什么工作。干杯。 – Geoplex
如果我有3K记录,我会使用这种方法。它会没事的。我正在处理超过150K条记录,它运行得很好。使用AJAX!你会有一个伟大的应用程序! :-) – MrUpsidown
非常感谢。帮了我很多。 – RY35
以防万一有人正在寻找正确的答案有一个非常有用的library由谷歌创建的,几何库有许多不同的方法,这可能有助于解决这个问题:
computeDistanceBetween()
这answer准确地解释了如何使用它。
这通常会计算两个传递的LatLng对象之间的距离。
所以你可以简单地说:
距离结果用米表示。
以前的算法可能不是最优的,因为有些人可能有成千上万的坐标的阵列,这其中方法containsLocation()变得方便,因为你可以通过指定一个多边形缩小检索范围你可以在里面搜索。
这可能不是寻找最近位置的最佳方法,但我相信如果数据库中有合理数量的工作站,它会完成这项工作。
您应该考虑性能和API调用/配额。当OP提到他正在处理几千个位置时,我认为这不是一个合适的答案,尤其是当您可以使用单个数据库查询完成所有这些操作时。 – MrUpsidown
@MrUpsidown我希望你在阅读评论前仔细阅读答案:) – ProllyGeek
它的哪一部分?两种方法都需要针对每个点的API调用。我错了吗? – MrUpsidown
我有同样的任务,我解决了使用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;
}
例子,测试我使用这些COORDS
$distance = $this->distance(-12.0972,-77.0267,-13.160616,-74.227440);
结果应该是325932.546518
米。如果妳希望公里只是划分325932.546518/1000
= 325.932546518km
同样的公式可以被翻译成JavaScript指导的答案haversine
这个数据的功能$ R = 6371000; ?那是静态的吗? –
@DimasAdiAndrea $ R是地球的半径;) – roll
感谢以下。似乎我需要谷歌地方另一个API密钥。我已经在使用Google地图api访问权限的Android地图键,这对我来说有点令人困惑,必须阅读更多内容。 – Geoplex
是的你是对的。尽管Google可以为您提供大量有用的数据,但如果您可以使用其他可信来源(您自己的数据,其他提供商等),只需使用它们即可!那么你不会依赖谷歌进行数据更新(这可能是一个难题),而且在很多情况下你不能这样做。 – MrUpsidown