使用纬度经度距离mysql连接从数据库中检索记录

Posted

技术标签:

【中文标题】使用纬度经度距离mysql连接从数据库中检索记录【英文标题】:retrieve record from database using latitude longitude distance mysql join 【发布时间】:2015-01-15 11:03:50 【问题描述】:

我发现了很多类似的帖子,但没有一个能与我的问题相提并论。

我在使用纬度和经度检索距离时连接了数据库中的两个表。

具体来说,这些是我的表格:

registeredUsers:
publicSSID, nome, cognome, eta, sesso, foto, informazioni

(翻译:publicSSID = univoque id,nome = name,cognome = surname,eta = age,sesso = sex,foto = photos,informazioni = informations)

position:
ssid, latitude, longitude

(ssid = publicSSID -> 相同的东西)

这是我的查询:

SELECT publicSSID, nome, cognome, eta, sesso, foto, position.latitude, 
    position.longitude, informazioni, (3956 * 2 * 
      ASIN(SQRT( POWER(SIN(($lat - abs(latitude))*pi()/180/2),2)
      +COS($lat*pi()/180 )*COS(abs(latitude)*pi()/180)
      *POWER(SIN(($lon-longitude)*pi()/180/2),2)))) 
      as distance 
      FROM registeredUsers, position 
      WHERE registeredUsers.publicSSID = position.ssid
      and longitude between ($lon - 1/abs(cos(radians($lat))*69)) 
      and ($lon + 1/abs(cos(radians($lat))*69)) 
      and latitude between ($lat -(1/69)) 
      and ($lat +(1/69)) 
      having distance < $dist ORDER BY distance limit 200;

其中$lat$lon$dist 分别是我输入的纬度、经度和用于检索记录的公里距离。例如,如果有两条经纬度的记录,我们知道在 10 公里的距离内,如果我设置$dist = 10,数据库必须返回这两条记录。

现在问题很多。

首先,说$lat, $lon也存储在表position(因为试图做这个请求的用户是想在自己附近找到另一个用户的用户) 而且我不希望它检索自己(大声笑),但目前使用该查询我只检索我的记录(所以我自己检索的纬度和经度等于$lat, $lon) .

我试图编辑它,但我已经删除了这一行:

WHERE registeredUsers.publicSSID = position.ssid

所以现在的查询是:

SELECT publicSSID, nome, cognome, eta, sesso, foto, position.latitude, 
    position.longitude, informazioni, (3956 * 2 * 
      ASIN(SQRT( POWER(SIN(($lat - abs(latitude))*pi()/180/2),2)
      +COS($lat*pi()/180 )*COS(abs(latitude)*pi()/180)
      *POWER(SIN(($lon-longitude)*pi()/180/2),2)))) 
      as distance 
      FROM registeredUsers, position 
      WHERE longitude between ($lon - 1/abs(cos(radians($lat))*69)) 
      and ($lon + 1/abs(cos(radians($lat))*69)) 
      and latitude between ($lat -(1/69)) 
      and ($lat +(1/69)) 
      having distance < $dist ORDER BY distance limit 200;

现在新的问题是它检索了我周围的所有人(包括我自己),但它改变了每个纬度和经度(结果不在数据库中)用$lat,$lon中的纬度和经度覆盖它。

我能做什么?有人知道使用这种 Join for mysql 检索我想要的内容的方法吗?

谢谢

【问题讨论】:

2 个问题: 1. 如果您计算距离并确保只得到落在所需距离内的结果,为什么还要在 where 子句中限制纬度和经度? 2.(相关)你用的69常量是什么意思? 【参考方案1】:

我可能会迟到,但看起来第一个查询完全符合您的要求。只需去掉一些奇怪的条件,获取所有靠近指定点的用户即可:

SELECT publicSSID, nome, cognome, eta, sesso, foto, position.latitude, 
    position.longitude, informazioni, (3956 * 2 * 
      ASIN(SQRT( POWER(SIN(($lat - abs(latitude))*pi()/180/2),2)
      +COS($lat*pi()/180 )*COS(abs(latitude)*pi()/180)
      *POWER(SIN(($lon-longitude)*pi()/180/2),2)))) 
      as distance 
      FROM registeredUsers, position 
      WHERE registeredUsers.publicSSID = position.ssid
      having distance < $dist ORDER BY distance limit 200;

如果您想排除执行查询的用户,只需将其 id 作为参数传递和条件,如 registeredUsers.publicSSID $currentuserid。

这里http://sqlfiddle.com/#!2/33f96d/1/1是你查询的模型

(我必须硬编码 $lat = 10、$lon = 10 和两个不同的 $dist - 1000 和 10000)

【讨论】:

以上是关于使用纬度经度距离mysql连接从数据库中检索记录的主要内容,如果未能解决你的问题,请参考以下文章

根据圆形范围选择纬度和经度

用于查找使用纬度和经度之间的距离的Sql返回错误的距离

检索给定区域 x 距离内的所有经纬度点

在mysql中使用纬度和经度查找两点之间的距离

在 MySQL 中使用 GPS 坐标快速检索 SELECT 语句

如何设置Xcode模拟器地图的当前位置