使用MySQL查找距离内的点


20

我有一个mySQL表,其中包含用户名,用户的纬度和经度。我想获得一个在给定纬度和经度,给定距离的圆形或正方形内的用户列表。例如,我的输入纬度= 78.3232和长= 65.3234,距离= 30英里。我想获取在距离点78.3232和65.3234 30英里以内的用户列表。是否可以通过单个查询解决此问题?还是可以给我提示开始解决此查询?我是基于地理信息的新手。


为什么不使用PostGIS?如果您正在启动地理项目,您仍然可以更改堆栈
simplexio 2013年

stackoverflow.com/a/40272394/1281385 应在加快此查询了(如果需要)是有用的
exussum

Answers:


32

该SQL语句将查找距78.3232、65.3234坐标30英里以内的最近20个位置。它根据该行的纬度/经度和目标纬度/经度计算距离,然后仅询问距离值小于30英里的行,按距离对整个查询进行排序,并将其限制为20个结果。要按公里而不是英里进行搜索,请将3959替换为6371。

SELECT
  id, (
    3959 * acos (
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
  ) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;

这是将Google Maps API v3与MySQL后端一起使用。

https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql


使用此命令时,我在选择中遇到语法错误,“#
1582-

发现:我的lng变量为空!抱歉!
bluantinoo 2014年

正是我想要的,但是数千条记录的查询性能超载了什么?准确性如何?
阿米特·

1
更好地将其替换为6371392.896以进行米搜索
Vasilii Suricov

34

Mapperz的答案无效。窦必须根据纬度而不是经度来计算。因此,corect SQL语句是:

SELECT
    id, (
      3959 * acos (
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;

您的答案应排在第一位。
阿米特·

@AmitShah如果你认为你能ping通的提问者(@shihabK谁一直没有活跃在网站上对近6年)和/或投票meta.stackexchange.com/questions/268666/...
PolyGeo

这应该是公认的答案。
catbadger

2

它可能是创建函数的基础。因此您可以在其他区域重用它。还可以使您的查询更干净...至少那是我的2美分。

DELIMITER $$

create function calcDistance(lat float, lng float, pnt_lat float, pnt_lng float)

Returns float
BEGIN

Declare dist float;
SET dist =
  3959 * acos (
  cos ( radians(pnt_lat) )
  * cos( radians( lat ) )
  * cos( radians( lng ) - radians(pnt_lng) )
  + sin ( radians(pnt_lat) )
  * sin( radians( lat ) )
);

RETURN dist;

END

如果您修复代码样式,答案将被否决。正确的方法
Vasilii Suricov

0

这是我的查询变体,似乎稍微容易一些(http://dexxtr.com/post/83498801191/how-to-determine-point-inside-circle-using-mysql

SELECT 
    *
FROM 
    `locator`
WHERE
    SQRT(POW(X(`center`) - 49.843317 , 2) + POW(Y(`center`) - 24.026642, 2)) * 100 < `radius`

4
这比较容易,但忽略了地球是弯曲的事实。
蒂姆·里哈维茨

需要一个公式才能准确。也许这仅在短距离上会比较好:D
Jethro 2015年

你会发射导弹,还是什么?
丹尼斯·布拉加

1
@DennisBraga-如果是这样,那么也许这个问题是题外话,更适合http://globalthermonuclearwar.stackexchange.com ...?
ashleedawg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.