PHP/Laravel如何通過經(jīng)緯度計(jì)算距離獲取附近商家
實(shí)際開發(fā)中,常常需要獲取用戶附近的商家,思路是
- 獲取用戶位置(經(jīng)緯度信息)
- 在數(shù)據(jù)庫中查詢?cè)诰嚯x范圍內(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)測(cè)距離 * @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í)際測(cè)試:我這邊的測(cè)試數(shù)據(jù)比較少,我就用了50公里范圍之內(nèi)的。因?yàn)槲业臄?shù)據(jù)庫里面只添加了連個(gè)測(cè)試商家,大家將就看一下,理解了就行了。
到此這篇關(guān)于PHP/Laravel通過經(jīng)緯度計(jì)算距離獲取附近商家的文章就介紹到這了,更多相關(guān)php經(jīng)緯度距離計(jì)算內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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)文章
Django中的cookie與session操作實(shí)例代碼
本文通過示例代碼給大家介紹了Django中的cookie與session操作,需要的朋友參考下吧2017-08-08解析CI即CodeIgniter框架在Nginx下的重寫規(guī)則
本篇文章是對(duì)CI即CodeIgniter框架在Nginx下的重寫規(guī)則進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP中對(duì)各種加密算法、Hash算法的速度測(cè)試對(duì)比代碼
這篇文章主要介紹了PHP中對(duì)各種加密算法、Hash算法的速度測(cè)試對(duì)比代碼,對(duì)選擇一個(gè)加密算法的同學(xué)可以作為一個(gè)性能考慮因素,需要的朋友可以參考下2014-07-07Laravel5.5 數(shù)據(jù)庫遷移:創(chuàng)建表與修改表示例
今天小編就為大家分享一篇Laravel5.5 數(shù)據(jù)庫遷移:創(chuàng)建表與修改表示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10PHP在線生成二維碼(google api)的實(shí)現(xiàn)代碼詳解
本篇文章是對(duì)PHP在線生成二維碼(google api)的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06使用php重新實(shí)現(xiàn)PHP腳本引擎內(nèi)置函數(shù)
使用php重新實(shí)現(xiàn)PHP腳本引擎內(nèi)置函數(shù)...2007-03-03