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

时间:2016-12-02 15:07:05

标签: 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

来自MySQL documentation

  

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米)

2 个答案:

答案 0 :(得分:9)

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


SELECT id1, id2, CAST(date1 as DATETIME) as date1, CAST(date2 as DATETIME) as date2
INTO #tbl_Temp
FROM ( VALUES 
('a','b','1-dec-2017','2-dec-2017'),
('b','c','2-dec-2017','30-nov-2017'),
('a','e','1-dec-2017','15-dec-2017'),
('d','e','14-dec-2017','15-dec-2017') 
) as a (id1, id2, date1, date2)
GO
;WITH tbl as (
    SELECT id1, date1 FROM #tbl_Temp
    UNION 
    SELECT id2, date2 FROM #tbl_Temp
)
SELECT t1.id1, t2.id1 as id2, t1.date1, t2.date1 as date2
FROM tbl as t2
INNER JOIN (
    SELECT TOP 1 id1, date1 FROM tbl 
    WHERE date1 = (SELECT MAX(date1) FROM tbl )
) as t1 
ON t1.id1 != t2.id1

将按预期返回466.9696023582369,并且466.9696023582369&gt;当然是300

答案 1 :(得分:1)

为了让未来的人(像我一样)明白:

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只是为了安全起见哈哈:)