MySQL查询中两个Spacial Points之间的距离(以米为单位)
问题描述:
我想查询一个MySQL数据库(版本5.7.15)以从一些坐标(40.7542,-73.9961,在我的情况)中检索300米内的所有位置:MySQL查询中两个Spacial Points之间的距离(以米为单位)
SELECT *
FROM location
WHERE st_distance_sphere(latlng, POINT(40.7542, -73.9961)) <= 300
ST_Distance_Sphere(G1,G2 [,半径])
返回mimimum球面距离在球体上的两点之间和/或 多点,在米中,或者如果任何几何参数 为NULL或空,则为NULL。
不幸的是,查询还返回是远离POINT超过300米的点(40.7542,-73.9961),如:
- POINT(40.7501,-73.9949)(〜470米现实生活)
- POINT(40.7498,-73.9937)(〜在现实生活中530米)在POINT
答
第一个参数必须是LNG,第二 - LAT。
select st_distance_sphere(POINT(-73.9949,40.7501), POINT(-73.9961,40.7542))
将返回466.9696023582369,符合市场预期,当然466.9696023582369> 300
答
只是为了明确为未来的人(像我一样):
Mituha谢尔盖已经awnsered在意见上的问题OP。问题在于OP在使用POINT(lag, lng)
时事实上MySQL预计为POINT(lng, lat)
。
不确定OP发布的问题的时候,但今天的官方文档使它更清楚一点:
几何参数应当包含指定 (经度,纬度)的点的坐标值:
- 经度和纬度分别是该点的第一个和第二个坐标。
- 两个坐标都是度数。
- 经度值必须在(-180,180)范围内,正值在主子午线东部
- 纬度值必须在[-90,90]范围内正值在赤道以北。
如果您收到 “无效的参数” 的错误,那是因为那可能。尝试添加WHERE lat between -90 and 90 AND lng between -180 and 180
只是为了安全起见哈哈:)
点必须通过这种方式设置'POINT(LNG,LAT)' '选择st_distance_sphere(POINT(-73.9949,40.7501),点(-73.9961 ,40.7542))' 给我们466.9696023582369 - 与预期的一样 –
@MituhaSergey但为什么查询返回的距离大于300? – grim
,因为您使用的是不正确的POINT。 例如'选择st_distance_sphere(POINT(40.7501,-73.9949),POINT(40.7542,-73.9961))' 将返回183.3146597410617