在地理位置附近查询事物?

7
我有一个查询尝试在特定的地理位置内寻找物品,但是它带回来的结果有点奇怪。之前我曾经发布过这个帖子,社区帮助我找到了我需要的公式:Querying within longitude and latitude in MySQL,但是现在查询结果十分混乱。
我的数据围绕旧金山市,其纬度/经度为37.780182,-122.517349查询:
SELECT
    id,
    hike_title,
    lat,
    lng,
    ( 3959 * acos(  cos( radians(37) )
                  * cos( radians( lat ) )
                  * cos( radians( lng ) - radians(37.780182) )
                  + sin( radians(-122.517349) ) * sin( radians( lat ) )
                 )
    ) AS distance
FROM
    my_awesome_table
HAVING
    distance < 10000
ORDER BY
    distance
LIMIT
    0 , 50

正如您所见 - 即使我将半径设置为10000,它仍然找不到很多内容,所以我想知道我的查询是否有误。它返回的一些结果甚至在lat/lng中都有0,0,这是我用来表示该记录没有lat/lng。

以下是公式的预期样式:

SELECT
    id,
    ( 3959 * acos(  cos( radians(37) ) 
                  * cos( radians( lat ) )
                  * cos( radians( lng ) - radians(-122) )
                  + sin( radians(37) ) * sin( radians( lat ) )
                 )
    ) AS distance
FROM
    markers
HAVING
    distance < 25
ORDER BY
    distance
LIMIT
    0 , 20;

谢谢您,很抱歉问题比较长!顺便说一下,我正在使用MySQL。


嗯,

我刚刚尝试了您给出的确切查询,并且它的准确度达到了50%。以下是数据集样例:

    lat          lng    
| 37.223465 | -122.090363 |
| 39.320980 | -111.093735 |
| 38.031715 |  -84.495132 |
| 37.787144 | -122.493263 |
| 52.975361 |   -1.458620 |
| 40.848557 | -111.906883 |
| 40.572498 | -111.859718 |

现在查询返回了所有距离很远的物品,但没有返回那些距离不到100英里的物品。比如这个物品(37.787144,-122.493263),即使它距离起始点只有大约50英里,也从未被返回过。你知道是为什么吗?


3
为什么你不使用MySQL的空间扩展来提供这类功能的函数呢?http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html - Jani Hartikainen
2
刚刚浏览了一些相关主题,还不确定是否完全理解,但可能对我的需求来说有点过头了。它能让查询速度更快吗?你认为它比我们在这个帖子中讨论的方案好得多吗?谢谢! - Genadinik
1个回答

12

我认为你颠倒了中心点的纬度(37.780182)和经度(-122.517349),请尝试:

select
    id,
    hike_title,
    lat,
    lng,
    ( 3959 * acos(  cos( radians(37) )
                  * cos( radians( lat ) )
                  * cos( radians( lng ) - radians(-122.517349) )
                  + sin( radians(37.780182) ) * sin( radians( lat ) )
                 )
    ) AS distance
FROM
    my_awesome_table
HAVING
    distance < 10000
ORDER BY
    distance
LIMIT
    0 , 50

如何将 distance 转换为米? - Alisson Linneker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接