PHP/Laravel如何通過經(jīng)緯度計(jì)算距離獲取附近商家
實(shí)際開發(fā)中,常常需要獲取用戶附近的商家,思路是
- 獲取用戶位置(經(jīng)緯度信息)
- 在數(shù)據(jù)庫中查詢在距離范圍內(nèi)的商家
注: 本文章內(nèi)計(jì)算距離所使用地球半徑統(tǒng)一為 6378.138 km
public function mpa_list($latitude,$longitude,$distance)
{
// $latitude = 34.306465;
// $longitude = 109.050952;
// $distance = 5;
//1.計(jì)算最大最小經(jīng)緯度范圍
$range = 180 / pi() * $distance / 6378.138; //搜索 N km 之內(nèi)
$lngR = $range / cos($latitude * pi() / 180);
$maxLat = $latitude + $range; //最大緯度
$minLat = $latitude - $range; //最小緯度
$maxLng = $longitude + $lngR; //最大經(jīng)度
$minLng = $longitude - $lngR; //最小經(jīng)度
//2.查找經(jīng)緯度符合條件的商家
$list = Village::select("id","title","longitude","latitude")
->whereBetween('latitude', [$minLat, $maxLat])
->whereBetween('longitude', [$minLng, $maxLng])
->where('status', 1)
->get();
//3.計(jì)算距離
foreach ($list as &$item){
$item['distance'] = $this->getDistanceBy2Point([$longitude, $latitude], [$item['longitude'], $item['latitude']]);
}
if($list){
$list = $list->toArray();
}
//4.排序
$list = $this->arraySort($list, 'distance');
return $list;
}二維數(shù)組排序方法
// 二維數(shù)組排序方法
public static function arraySort($arr, $field, $sort = SORT_ASC){
$key = array_column($arr, $field);
array_multisort($key, $sort, $arr);
return $arr;
}根據(jù)經(jīng)緯度計(jì)算兩點(diǎn)距離
/**
* 根據(jù)起點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo)測距離
* @param [array] $from [起點(diǎn)坐標(biāo)(經(jīng)緯度),例如:array(118.012951,36.810024)]
* @param [array] $to [終點(diǎn)坐標(biāo)(經(jīng)緯度)]
* @param [bool] $km 是否以公里為單位 false:米 true:公里(千米)
* @param [int] $decimal 精度 保留小數(shù)位數(shù)
* @return [string] 距離數(shù)值
*/
public static function getDistanceBy2Point($from, $to, $km = true, $decimal = 2){
sort($from);
sort($to);
$EARTH_RADIUS = 6378.138; // 地球半徑系數(shù)
$distance = $EARTH_RADIUS*2*asin(sqrt(pow(sin( ($from[0]*pi()/180-$to[0]*pi()/180)/2),2)+cos($from[0]*pi()/180)*cos($to[0]*pi()/180)* pow(sin( ($from[1]*pi()/180-$to[1]*pi()/180)/2),2)))*1000;
if($km && $distance > 1000){
return round($distance / 1000, 2) . 'km';
}
return round($distance, $decimal) . 'm';
}實(shí)際測試:我這邊的測試數(shù)據(jù)比較少,我就用了50公里范圍之內(nèi)的。因?yàn)槲业臄?shù)據(jù)庫里面只添加了連個(gè)測試商家,大家將就看一下,理解了就行了。

到此這篇關(guān)于PHP/Laravel通過經(jīng)緯度計(jì)算距離獲取附近商家的文章就介紹到這了,更多相關(guān)php經(jīng)緯度距離計(jì)算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- PHP實(shí)現(xiàn)的7組經(jīng)緯度與距離的計(jì)算函數(shù)demo
- golang與php實(shí)現(xiàn)計(jì)算兩個(gè)經(jīng)緯度之間距離的方法
- PHP計(jì)算當(dāng)前坐標(biāo)3公里內(nèi)4個(gè)角落的最大最小經(jīng)緯度實(shí)例
- PHP根據(jù)兩點(diǎn)間的經(jīng)緯度計(jì)算距離
- PHP計(jì)算2點(diǎn)經(jīng)緯度之間的距離代碼
- php根據(jù)地址獲取百度地圖經(jīng)緯度的實(shí)例方法
- 定位地理位置PHP判斷員工打卡簽到經(jīng)緯度是否在打卡之內(nèi)
相關(guān)文章
Codeigniter通過SimpleXML將xml轉(zhuǎn)換成對(duì)象的方法
這篇文章主要介紹了Codeigniter通過SimpleXML將xml轉(zhuǎn)換成對(duì)象的方法,涉及Codeigniter操作XML文件的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
php實(shí)現(xiàn)文件編碼批量轉(zhuǎn)換
轉(zhuǎn)換文件編碼,比如原來是gbk,轉(zhuǎn)換成utf-8的,可以轉(zhuǎn)單個(gè)文件也可以轉(zhuǎn)換整個(gè)目錄的文件,可選是否遞歸目錄2014-03-03
Yii框架學(xué)習(xí)筆記之session與cookie簡單操作示例
這篇文章主要介紹了Yii框架學(xué)習(xí)筆記之session與cookie簡單操作,結(jié)合實(shí)例形式分析了Yii框架session與cookie的定義、設(shè)置、讀寫、刪除等簡單操作技巧,需要的朋友可以參考下2019-04-04
Kindeditor編輯器添加圖片上傳水印功能(php代碼)
這篇文章主要為大家詳細(xì)介紹了Kindeditor編輯器加圖片上傳水印功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08

