2016-12-02 56 views
1

我想查询一个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 

MySQL documentation

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
+0

点必须通过这种方式设置'POINT(LNG,LAT)' '选择st_distance_sphere(POINT(-73.9949,40.7501),点(-73.9961 ,40.7542))' 给我们466.9696023582369 - 与预期的一样 –

+0

@MituhaSergey但为什么查询返回的距离大于300? – grim

+1

,因为您使用的是不正确的POINT。 例如'选择st_distance_sphere(POINT(40.7501,-73.9949),POINT(40.7542,-73.9961))' 将返回183.3146597410617 <= 300。 只使用正确的位置ARGS POINT(LNG,LAT),LNG作为第一个arg,lat - 作为第二个 –

回答

4

第一个参数必须是LNG,第二 - LAT。

select st_distance_sphere(POINT(-73.9949,40.7501), POINT(-73.9961,40.7542)) 

将返回466.9696023582369,符合市场预期,当然466.9696023582369> 300

0

只是为了明确为未来的人(像我一样):

Mituha谢尔盖已经awnsered在意见上的问题OP。问题在于OP在使用POINT(lag, lng)时事实上MySQL预计为POINT(lng, lat)

不确定OP发布的问题的时候,但今天的官方文档使它更清楚一点:

几何参数应当包含指定 (经度,纬度)的点的坐标值:

  • 经度和纬度分别是该点的第一个和第二个坐标。
  • 两个坐标都是度数。
  • 经度值必须在(-180,180)范围内,正值在主子午线东部
  • 纬度值必须在[-90,90]范围内正值在赤道以北。

来源:https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html#function_st-distance-sphere

如果您收到 “无效的参数” 的错误,那是因为那可能。尝试添加WHERE lat between -90 and 90 AND lng between -180 and 180只是为了安全起见哈哈:)