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

时间:2013-01-16 10:43:22

标签: php mysql sql geolocation haversine

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

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

我希望能够做的是在一个SQL字符串中将两个查询连接在一起,以便“找到起点位于”Place 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字符串?

1 个答案:

答案 0 :(得分:3)

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