查询地理位置附近的东西?

Posted

技术标签:

【中文标题】查询地理位置附近的东西?【英文标题】:Querying for things near a geolocation? 【发布时间】:2011-06-09 12:24:50 【问题描述】:

我有一个查询,它试图在某个地理位置内查找东西,但它返回的结果有点……奇怪。

我之前发布过这个帖子,社区帮我找到了我需要的公式: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 英里,也永远不会被退回。你会知道为什么吗?

【问题讨论】:

你为什么不使用 MySQL 的空间扩展来为这类东西提供功能? dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html 只需阅读那里的一些主题。不确定我对它的理解是否太深,但对于我的需求来说似乎有点矫枉过正。它是否使查询速度更快?你认为它比我们在这个线程中讨论的解决方案更好吗?谢谢! 【参考方案1】:

我认为您颠倒了中心点的纬度 (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转换为米?

以上是关于查询地理位置附近的东西?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firestore 运行地理“附近”查询?

查询附近的位置

团购网站上想要查询别的位置 附近的商家怎样可以查看?我现在只能查看我附近的商家我还没有到那个位置?

此查询的 MySQL 确切语法:查找附近的位置

Android:从firebase查询附近的位置

无法规范化查询 :: 由地理附近查询中的 :: 无效参数引起