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

Gen*_*nik 7 mysql geolocation geo

我有一个试图在某个地理定位中查找内容的查询,但它带来的结果有点......奇怪.

我以前发过这个帖子,社区帮我找到了我需要的公式:在MySQL中查询经度和纬度,但查询现在给出了非常古怪的结果.

我的数据是围绕旧金山市的lat/lng 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
Run Code Online (Sandbox Code Playgroud)

所以如你所见 - 即使我使半径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;
Run Code Online (Sandbox Code Playgroud)

谢谢你,抱歉这个痛苦的长期问题!顺便说一下,我正在使用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 |
Run Code Online (Sandbox Code Playgroud)

所以现在查询返回了距离很远的所有项目,但不是100英里以外的项目.喜欢这个项目(37.787144,-122.493263),即使距离起点只有50英里,也永远不会归来.你会碰巧知道为什么吗?

dar*_*zig 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
Run Code Online (Sandbox Code Playgroud)