透過經緯度來決定在某一範圍內哪些門市離顧客最近,如1000公尺內有哪些最近的某某門店
最近公司需要透過客戶的收貨地址查詢離客戶地址最近有哪些門市,客戶可以去最近的門市取貨.
那我們是如何計算出客戶地址1000米內有哪些門市呢?我們可以通過下面幾部計算出來.
1.取得客戶地址的經緯度,我們可以透過百度地圖提供的介面取得.($address為客戶地址)
//百度接口获取经纬度 public function getlat($address) { $url = 'http://api.map.baidu.com/geocoder/v2/?city=上海&address=' . $address . '&output=json&ak=' . $this->ak; $ch = curl_init($url); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_NOSIGNAL, 1); $data = curl_exec($ch); curl_close($ch); $data = json_decode($data, true); $ret['lat'] = $data['result']['location']['lat']; $ret['lng'] = $data['result']['location']['lng']; echo json_encode($ret); }
2.如果是1000公尺內的店,我們需要計算出1000公尺內的經緯度範圍.
/* * 计算经纬度范围 * $lat 纬度 * $lon 经度 * $raidus 半径(米) */ function getAround($lat, $lon, $raidus) { $PI = 3.14159265; $EARTH_RADIUS = 6378137; $RAD = $PI / 180.0; $latitude = $lat; $longitude = $lon; $degree = (24901 * 1609) / 360.0; $raidusMile = $raidus; $dpmLat = 1 / $degree; $data = array(); $radiusLat = $dpmLat * $raidusMile; $minLat = $latitude - $radiusLat; $maxLat = $latitude + $radiusLat; $data["maxLat"] = $maxLat; $data["minLat"] = $minLat; $mpdLng = $degree * cos($latitude * ($PI / 180)); $dpmLng = 1 / $mpdLng; $radiusLng = $dpmLng * $raidusMile; $minLng = $longitude - $radiusLng; $maxLng = $longitude + $radiusLng; $data["maxLng"] = $maxLng; $data["minLng"] = $minLng; //print_r($data); return $data; }
3.我們知道數據庫內每一家店都儲存了這家店的經緯度信息,現在我們可以通過上面計算出的經緯度範圍來查詢出1000米內有哪些門店了.
//计算出半径范围内的店 public function getdz($lat, $lng) { include_once('my_db.php'); $this->qu = new MY_DB_ALL("QUICK"); //$ret = json_decode($this->getlat($address), true); //print_r($ret);exit; $data = $this->getAround($lat, $lng, 2000); //print_r($data); $sql = "select * from shop where baidu_lat between '" . $data['minLat'] . "' and '" . $data['maxLat'] . "' and baidu_lng between '" . $data['minLng'] . "' and '" . $data['maxLng'] . "' and status=1 and ztd_flag=2"; $rett = $this->qu->rquery($sql); for ($i=0;$i<count($rett);$i++) { $array[$i]["shop_id"] = $rett[$i]["shop_id"]; $array[$i]["shop_name"] = iconv("gbk","utf-8",$rett[$i]["shop_name"]); $array[$i]["shop_address"] = iconv("gbk","utf-8",$rett[$i]["shop_address"]); $array[$i]["shop_date"] = $rett[$i]["shop_date"]; $array[$i]['shop_phone'] = $rett[$i]["shop_phone"]; $array[$i]['area'] = $rett[$i]["area"]; } //echo "<pre class="brush:php;toolbar:false">";print_r($array);exit; echo json_encode($array); }
上面的程式碼要依照自己實際狀況來寫喔.大家主要看$sql這個sql語句就行了.嘿嘿
4.如果想計算出離客戶址最近的一家店是哪家,我需要一個計算距離的方法,如下:
/** * @desc 根据两点间的经纬度计算距离 * @param float $lat 纬度值 * @param float $lng 经度值 */ public function getDistance($lat1, $lng1, $lat2, $lng2) { $earthRadius = 6367000; //地球半径 $lat1 = ($lat1 * pi() ) / 180; $lng1 = ($lng1 * pi() ) / 180; $lat2 = ($lat2 * pi() ) / 180; $lng2 = ($lng2 * pi() ) / 180; $calcLongitude = $lng2 - $lng1; $calcLatitude = $lat2 - $lat1; $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2); $stepTwo = 2 * asin(min(1, sqrt($stepOne))); $calculatedDistance = $earthRadius * $stepTwo; return round($calculatedDistance); }
5.最後我們通過計算比較1000米內那幾家店最少距離就可以知道最近是哪個店了.
//计算出最近的一家店 public function zjd($address) { $ret = $this->getdz($address); $jwd = $this->getlat($address); if ($ret) { $arr = array(); foreach ($ret as $k => $v) { $arr[$k] = $this->getDistance($jwd['lat'], $jwd['lng'], $v['baidu_lat'], $v['baidu_lng']); } asort($arr); //print_r($arr); foreach ($arr as $k1 => $v1) { $data[] = $ret[$k1]; } print_r($data); } else { echo '无最近的门店'; } }
以上就介紹了透過經緯度確定一定範圍內哪些門店離客戶最近,如1000米內有哪些最近的某某門店,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

data資料夾裡面是系統及程式的數據,例如軟體的設定和安裝包等,Data資料夾中各個資料夾則代表的是不同類型的資料存放資料夾,無論Data資料指的是檔案名稱Data還是擴充名data,都是系統或程式自訂的資料文件,Data是資料保存的備份類別文件,一般可以用meidaplayer、記事本或word開啟。

mysql load data亂碼的解決方法:1、找到出現亂碼的SQL語句;2、修改語句為「LOAD DATA LOCAL INFILE "employee.txt" INTO TABLE EMPLOYEE character set utf8;」即可。

差異有:1、xdata通常指的是自變量,data則指整個資料集;2、xdata主要用於建立資料分析模型,data則用於進行資料分析與統計;3、xdata通常用於迴歸分析、變異數分析、預測建模,data則可使用各種統計方法進行分析;4、xdata通常需要進行資料預處理,data則可以包含完整的原始資料。

人性化的AI Pin推出後不久,嚴厲的評論顯示,這款AI小工具還沒有做好上市的準備,因為最初宣傳的大多數功能要么無法正常工作,要么根本就缺失,電池壽命也很短。

不是,vue元件中data必須是一個函數。 vue中元件是用來重複使用的,為了防止data重複使用,將其定義為函數。 vue元件中的data資料都應該是互相隔離,互不影響的,元件每復用一次,data資料就應該被複製一次,之後,當某一處複用的地方元件內data資料被改變時,其他重複使用地方元件的data資料不受影響,就需要透過data函數傳回一個物件作為元件的狀態。

每個人和他們的阿姨似乎都在跳上人工智慧列車,尋找虛高的利潤率和行銷炒作——看看 AMD 最近的 Ryzen 品牌重塑就是這種人工智慧炒作的一個典型例子。蘭德公司最近進行的一項研究發現,

一台核心業務資料庫,版本為MySQL8.34社群伺服器版。從上線以來,這個資料庫伺服器的錯誤日誌增加非常迅猛(如下圖),每24小時能增加到10多個G的容量。因為有故障警報,也還沒有影響到業務的正常訪問,有關人員不讓重啟MySQL服務。鑑於這個情況,我只好設定一個自動規劃任務,在每晚的夜間定點清理這些日誌。具體的操作時候在系統命令行,執行“crontab-e”,添加如下的文字行:0001***echo>/data/mysql8/data/mysql_db/mysql.log儲存並退出編輯模式
