查找路线起点和终点周围的标记 (LatLng)

Posted

技术标签:

【中文标题】查找路线起点和终点周围的标记 (LatLng)【英文标题】:Find markers around a route's start and end points (LatLng) 【发布时间】:2013-01-16 10:43:21 【问题描述】:

所以,我有一个保存“路线”的数据库(即起点和终点,采用纬度/经度格式“StartLat”、“StartLng”和“EndLat”,我的“EndLng”)。目前,人们可以通过起点或终点搜索这些路线(例如“查找起点在我的 LatLng 位置 5 英里范围内的路线。”)。他们可以通过起点或终点查找它们(例如“在此标记范围内查找起点”或“在此标记范围内查找终点”)。

我目前有一个基于 Haversine 公式的 SQL 查找,这对我来说非常有效。

我想要做的是在一个 SQL 字符串中将两个查询连接在一起,以便能够“找到起点在“地点 A”'x' 英里范围内且终点在距离“B 地”“x”英里。

我有一种感觉,最优雅的做法是在我现有的 SQL 字符串上创建一个连接,但我一生都无法弄清楚如何做!

我当前的 SQL 字符串如下所示:

SELECT ID, RouteCode, (3959 * acos(cos(radians('51.5073346')) * cos(radians( EndLat )) * cos(radians( EndLng ) - radians('-0.1276831')) + sin(radians('51.5073346')) * sin(radians( EndLat )))) AS distance FROM markers HAVING distance < 15

(因此,在上面的示例中,用户将搜索终点在坐标 51.5073346、-0.1276831 的 15 英里范围内的所有路线。如果他们想要查找起点在 15 英里范围内的路线英里的 LatLng,则 EndLat 和 EndLng 将被 StartLat 和 StartLng 替换。

是否有人对 SQL 命令有足够的了解,能够帮助我计算出我需要的 SQL 字符串?

【问题讨论】:

【参考方案1】:

您不需要join;您只需在查询中添加第二个条件:

SELECT ID, 
       RouteCode, 
       (
           3959 * acos(cos(radians('51.5073346')) * cos(radians( EndLat )) * 
           cos(radians( EndLng ) - radians('-0.1276831')) + 
           sin(radians('51.5073346')) *      
           sin(radians( EndLat )))
       ) AS end_distance,
       (
           [similar calculation for start here]
       ) AS start_distance
    FROM markers 
    HAVING start_distance < 15 and end_distance < 15

从概念上讲,join 用于添加来自另一个表的数据。您只是想在同一个表中强加另一个要求。

【讨论】:

就这么简单!谢谢@dan1111——我想我可能是在想这个问题。简单的效果最好。

以上是关于查找路线起点和终点周围的标记 (LatLng)的主要内容,如果未能解决你的问题,请参考以下文章

百度地图怎么设置起点和终点

沿路线添加标记

百度地图API 怎样实现根据起点和终点点击查询能出现路线

如何在 Google Maps API 中沿起点和终点之间的路线获取地点(例如加油站)

检查纬度和经度是不是在我的谷歌地图起点和终点范围内

如何解决这样一个多起点多终点的最短路径问题?