我正在开发一个位置应用程序,我需要从我的Mysql Location表中获取所有位置,它们之间的距离为5km.
对于Ex位置表,有以下条目:
id Latitude Longitude
1 22.7499180 75.8950577
2 22.7498474 75.8950653
3 22.7498035 75.8950424
4 22.7497787 75.8950729
5 22.7498245 75.8950806
6 22.7497902 75.8950272
7 22.7497864 75.8950424
8 22.7497768 75.8950500
9 22.7497864 75.8950577
10 22.7497921 75.8950653
11 22.7497597 75.8950653
12 22.7498283 75.8950653
13 22.7497978 75.8950577
Run Code Online (Sandbox Code Playgroud)
所以从上面的表格我需要获取这样的结果
id Latitude Longitude Distance (>=5Km)
1 22.7499180 75.8950577 --
4 22.7497787 75.8950729 6km (From lat long of id 1)
8 22.7497768 75.8950500 8km (From lat long of id 4)
11 22.7497597 75.8950653 6km (From lat long of id 8)
13 22.7497978 75.8950577 10km (From lat long of id 11)
Run Code Online (Sandbox Code Playgroud)
我搜索了很多以获得这样的结果但我得到的查询只是为了得到一些固定的纬度/长度或固定半径的结果.如果可能,请帮助Mysql查询.
编辑 (来自OP的评论)
我需要的是计算距离上一个选定值的距离......对于Ex.从记录1开始1.将距离1与记录2进行比较<5km,与记录3相比也<5km,与4相比距离> 5km所以我们将其保持在列表中,下一条记录将与记录4进行比较因此,4的距离将与5进行比较,如果记录5的距离> 4,那么下一次比较将以记录5作为参考.
没有存储过程,只是纯粹的肆无忌惮的sql荣耀:
SET @prevLong=-1.0000;
SET @prevLat=-1.0000;
SET @currDist=1.0000;
select id, diff from (
select id,
@prevLat prev_lat,
@currDist:= 6371 * 2 * (atan2(sqrt(sin(radians(@prevLat - lat)/2)
* sin(radians(@prevLat - lat)/2)
+ cos(radians(lat))
* cos(radians(@prevLat))
* sin(radians(@prevLong - longi)/2)
* sin(radians(@prevLong - longi)/2))
,sqrt(1-(sin(radians(@prevLat - lat)/2)
* sin(radians(@prevLat - lat)/2)
+ cos(radians(lat))
* cos(radians(@prevLat))
* sin(radians(@prevLong
- longi)/2)
* sin(radians(@prevLong - longi)/2))))) diff,
@prevLong prevLong,
case when @currdist > 5 then @prevLat:=lat else null end curr_lat,
case when @currDist > 5 then @prevLong:= longi else null end curr_long
from latLong
order by id asc
) a where diff > 5
Run Code Online (Sandbox Code Playgroud)
SQLFiddle证明魔法是真实的:http://sqlfiddle.com/#!9/7e4fe/19
编辑 在Codeigniter中,您可以使用如下变量:
$this->db->query("SET @prevLong=-1.0000");
$this->db->query("SET @prevLat=-1.0000");
$this->db->query("SET @prevDist=-1.0000");
Run Code Online (Sandbox Code Playgroud)
然后照常发出您的查询
$query= $this->db->query("SELECT ...");
Run Code Online (Sandbox Code Playgroud)