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

标签 php mysql sql geolocation haversine

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

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

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

我觉得最优雅的方法是在我现有的 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 字符串?

最佳答案

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

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 用于从另一个表添加数据。您只是想在同一个表中强加另一个要求。

关于php - 查找路线起点和终点周围的标记 (LatLng),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14356508/

相关文章:

mysql - 如何使用连接从 mysql 表中选择相同的列值作为不同的列?

mysql - 如何在mysql中搜索json数据?

php - 使用 PHP GET 方法时进行 URL 重写

php - 如何故意造成 "Fatal error: Allowed memory size of xxx bytes exhausted"

mysql - 用 SQL 替换 vb.net 查询

mysql - 查找mysql查询的重复行

mysql - 参数化表名

忽略链接的表中的mysql搜索字符串

php - 生成有错误的词(汽车品牌/型号)

php - 提高性能 select union 命令 mysql