我有一个查询,试图在某个地理位置中查找东西,但它带来的结果有点……奇怪。
我之前发布过这个帖子,社区帮我找到了我需要的公式: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 英里,也永远不会被退回。你会碰巧知道为什么吗?