php根據經緯度排序,根據經緯度篩選距離段

2022-09-01 01:03:13 字數 3017 閱讀 3395

sql 語句:select location.* from (select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000)  as distance from bsx_training where (px_state = 1) and (type_id != '') and (((px_lat >= 27.683290277922) and (px_lat <= 45.653769722078)) and ((px_lon >= 105.81826766053) and (px_lon <= 128.22245033947))) order by  distance limit 0,10) location  where (1=1) and (location.distance <= 500)

先忽略上面這條sql語句。一一解釋

根據sql排序的sql語句

// lon1當前使用者經度 lat1當前使用者緯度,lon2 sql的經度字段 lat sql的緯度字段

function distance_sql($lon1,$lat1,$lon2,$lat2

)*pi()/180-*pi()/180)/2),2)+cos(*pi()/180)*cos(*pi()/180)* pow(sin( (*pi()/180-*pi()/180)/2),2)))*1000) ";

return

$sql

;}

這是乙個生成根據sql排序函式**

接下來下面是設定經緯度範圍內的資料

// 當前登入使用者經緯度

if(i("post.location"))) and (px_lat <= )) and ((px_lon >= ) and (px_lon <= )))";

//經緯度距離優先排序,距離最近優先顯示

if(i("post.distance_sort"))

if(i("post.km")))";

}else

if(strpos($kmstr,"-") !== false

)) and (location.distance <= ))";

}else

if(strpos($kmstr,">") !== false

))";}}

}

下面算出經緯度範圍內的資料控制函式

/*

* *

* @param $latitude 緯度

* @param $longitude 經度

* @param $raidus 半徑範圍(單位:公尺)

* @return multitype:number */

function getaround($latitude,$longitude,$raidus

)

要實現根據經緯度排序

就直接呼叫distance_sql(lon1,lat1,lon2,lat2)傳入引數 並且as 乙個別名例如 as distance, 然後sql語句中 order by 排序 根據 distance排序

如果篩選距離段 1000公尺-2000公尺的資料

那就sql語句巢狀sql 

select *.loation from (select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000) as distance) from table  location where (location.distance >= 1000) and (location.distance <= 2000))

如果實現根據最近位置排序sql

select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000) as distance order by distance 

public

function

training_list()

) and (px_lat <= )) and ((px_lon >= ) and (px_lon <= )))";

//經緯度距離篩選

if(i("post.distance_sort"))

if(i("post.km")))";

}else

if(strpos($kmstr,"-") !== false

)) and (location.distance <= ))";

}else

if(strpos($kmstr,">") !== false

))";}}

}$shownum = 10;

if(i("post.page"))

else

$n = ($page-1)*$shownum

;

$field = "*";

$sql = "select location.* from (select from bsx_training where order by limit ,) location ";

$training = m()->query($sql

);

dump(m()->getlastsql());die

;

}

根據經緯度反位址解析

一.首先引入所申請的ak金鑰 二.簡單樣式處理一下 body,html l map r result 三.html 布局 下面的 是用來顯示地圖的 四.js 如下 var map new bmap.map l map map.centerandzoom new bmap.point 116.3287...

根據經緯度計算距離 Java

根據兩個位置的經緯度,來計算兩地的距離 單位為km 引數為double型別 long1 位置1經度 lat1 位置1緯度 long2 位置2經度 lat2 位置2緯度 public class distanceutils 根據兩個位置的經緯度,來計算兩地的距離 param longitudeuser...

根據經緯度查詢資料mysql

根據中心點經緯度,查詢周邊,按照距離排序 jingdu weidu 為資料庫存經度 緯度的字段 116.433842 39.91004為中心點經緯度 select round 6378.138 2 asin sqrt pow sin 39.91004 pi 180 weidu pi 180 2 2 ...