MySQL查询中两个Spacial点之间的距离(米)

gri*_*rim 8 mysql geospatial

我正在尝试查询MySQL数据库(版本5.7.15)以检索距离某些坐标300米范围内的所有位置(在我的情况下为40.7542,-73.9961):

SELECT *
FROM location 
WHERE st_distance_sphere(latlng, POINT(40.7542, -73.9961)) <= 300
Run Code Online (Sandbox Code Playgroud)

MySQL文档:

ST_Distance_Sphere(g1,g2 [,radius])

返回球体上两点和/或多点之间的最小球面距离(米),如果任何几何参数为NULL或空,则返回NULL.

不幸的是,该查询还返回距离POINT(40.7542,-73.9961)超过300米的点,例如:

  • POINT(40.7501,-73.9949)(现实生活中约470米)
  • POINT(40.7498,-73.9937)(现实生活中约530米)

小智 10

POINT的第一个arg必须是LNG,第二个是LAT.

select st_distance_sphere(POINT(-73.9949,40.7501), POINT( -73.9961,40.7542)) 
Run Code Online (Sandbox Code Playgroud)

将按预期返回466.9696023582369,当然将返回466.9696023582369> 300


g0d*_*kar 6

只是为了让未来的人(比如我自己)清楚:

Mituha Sergey 在对 OP 的评论中回答了这个问题。问题是 OP 正在使用POINT(lat, 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只是为了安全起见哈哈:)