目錄
?一、取得使用者位址位置訊息
使用者傳送位置時的訊息及格式如下
<xml> <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName> <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FLACFromUserName> <CreateTime>1359036619</CreateTime> <MsgType><![CDATA[location]]></MsgType> <Location_X>22.539968</Location_X> <Location_Y>113.954980</Location_Y> <Scale>16</Scale> <Label><![CDATA[中國廣東省深圳市南山區(qū)華僑城深南大道9789號 郵政編碼: 518057]]></Label> <MsgId>5837017832671832047</MsgId> </xml>?XML格式講解
ToUserName 消息接收方微信號,一般為公眾平臺賬號微信號 FromUserName 消息發(fā)送方微信號 CreateTime 消息創(chuàng)建時間 MsgType 消息類型,地理位置為location Location_X 地理位置緯度 Location_Y 地理位置經(jīng)度 Scale 地圖縮放大小 Label 地理位置信息 MsgId 消息ID號二、取得週邊區(qū)域資訊百度地圖Place API 是一類簡單的HTTP接口,用於傳回查詢某個區(qū)域的某類POI數(shù)據(jù),且提供單一POI的詳情查詢服務,使用者可以使用C#、C++、Java等開發(fā)語言發(fā)送HTTP請求且接收json、xml的資料。 Place API 提供區(qū)域檢索POI服務、POI詳情服務與團購資訊檢索服務、商家團購詳情查詢。區(qū)域檢索POI服務提供三種區(qū)域檢索方法:城市內(nèi)檢索、矩形檢索、圓形區(qū)域檢索。 我們使用圓形區(qū)域檢索來實現(xiàn)附近搜尋功能。 place區(qū)域檢索POI服務介面如下:http://api.map.baidu.com/place/v2/search
##參數(shù) | 是否必須 | 預設值 | 格式範例 | 意思 |
#location | 是 | 38.76623, 116.43213? | # lat<緯度>,lng<經(jīng)度>||
#週邊擷取中心點,不支援多個點 | radius(r) | 否 | #無 | ##2000 |
##週邊檢索半徑,單位為米 | #q(query) | ##是 | ||
中關村、ATM、百度大廈 | 檢索關鍵字,週邊擷取與矩形區(qū)域內(nèi)檢索支援多個關鍵字並集檢索,不同關鍵字間以$符號分隔,最多支援10個關鍵字檢索。如:”銀行$酒店”。 | tag | ||
日式烤肉/鐵板燒、朝外大街 | 標籤項,與q組合檢索 | ##output | 否 | |
json或xml | 輸出格式為json或xml | #scope | 1
| |
page_size | 否 | 10 | 10 | 范圍記錄數(shù)量,默認為10條記錄,最大返回20條。多關鍵字檢索時,返回的記錄數(shù)為關鍵字個數(shù)*page_size。 |
page_num | 否 | 0 | 0、1、2 | 分頁頁碼,默認為0,0代表第一頁,1代表第二頁,以此類推。 |
ak | 是 | 無 | E4805d16520de693a3fe707cdc962045 | 用戶的訪問密鑰,必填項。v2之前該屬性為key。 |
sn | 否 | 無 |
| 用戶的權限簽名。 |
timestamp | 否 | 無 |
| 設置sn后該值必填。 |
調用舉例如下:
http://api.map.baidu.com/place/v2/search?ak=MgBALVVeCd8THVBi6gPdvsvG&output=json&query=%E9%93%B6%E8%A1%8C&page_size=5&page_num=0&scope=2&location=39.915,116.404&radius=2000&filter=sort_name:distance
三、程序實現(xiàn)
百度地圖類定義如下
class baiduMapClient { private $api_server_url; private $auth_params; public function __construct() { $this->api_server_url = "http://api.map.baidu.com/"; $this->auth_params = array(); $this->auth_params['key'] = "401f9a693dd267dd9a4661ec0895fb20"; $this->auth_params['output'] = "json"; } public function Geocoding_coordinate_address($location) { return $this->call("geocoder", array("location" => $location)); } //http://api.map.baidu.com/place/search?&query=眼鏡&location=39.915,116.404&radius=3000&output=json&key=37492c0ee6f924cb5e934fa08c6b1676 public function Place_search($query, $location, $radius) { return $this->call("place/search", array("query" => $query, "location" => $location, "radius" => $radius)); } protected function call($method, $params = array()) { $headers = array( "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language: en-us,en;q=0.5", //"Accept-Encoding: gzip, deflate", "Referer: http://developer.baidu.com/" ); $params = array_merge($this->auth_params, $params); $url = $this->api_server_url . "$method?".http_build_query($params); if (DEBUG_MODE){echo "REQUEST: $url" . "\n";} $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $data = curl_exec($ch); curl_close($ch); $result = null; if (!empty($data)){ if (DEBUG_MODE){ echo "RETURN: " . $data . "\n"; } $result = json_decode($data); } else{ echo "cURL Error:". curl_error($ch); } return $result; } }
獲取附近的調用代碼如下:
function catchEntitiesFromLocation($entity, $x, $y, $radius) { $mapObj = new baiduMapClient(); $search = $mapObj->Place_search($entity, $x.",".$y, $radius); $results = $search->results; for ($i = 0; $i < count($results); $i++) { $distance = getDistance($x, $y, $results[$i]->location->lat, $results[$i]->location->lng); $shopSortArrays[$distance] = array( "Title"=>"【".$results[$i]->name."】<".$distance."M>".$results[$i]->address.(isset($results[$i]->telephone)?" ".$results[$i]->telephone:""), "Description"=>"", "PicUrl"=>"", "Url"=>""); } ksort($shopSortArrays);//排序 $shopArray = array(); foreach ($shopSortArrays as $key => $value) { $shopArray[] = array( "title" => $value["Title"], "description" => $value["Description"], "pic" => $value["PicUrl"], "url" => $value["Url"], ); if (count($shopArray) > 6){break;} } return $shopArray; }
計算兩坐標之間距離如下
function getDistance($lat_a, $lng_a, $lat_b, $lng_b) { //R是地球半徑(米) $R = 6366000; $pk = doubleval(180 / 3.14169); $a1 = doubleval($lat_a / $pk); $a2 = doubleval($lng_a / $pk); $b1 = doubleval($lat_b / $pk); $b2 = doubleval($lng_b / $pk); $t1 = doubleval(cos($a1) * cos($a2) * cos($b1) * cos($b2)); $t2 = doubleval(cos($a1) * sin($a2) * cos($b1) * sin($b2)); $t3 = doubleval(sin($a1) * sin($b1)); $tt = doubleval(acos($t1 + $t2 + $t3)); return round($R * $tt); }
對于用戶的坐標記錄,我們使用數(shù)據(jù)庫的方式來存儲,
如果用戶發(fā)送查詢命令,則直接查詢,
function searchUserLocation($userWxid) { Global $mysql_host; Global $mysql_host_s; Global $mysql_port; Global $mysql_user; Global $mysql_password; Global $mysql_database; //查詢使用從庫,支持SAE $mysql_table = "location"; $mysql_state = "SELECT * FROM ".$mysql_table." WHERE userWxid = \"".$userWxid."\""; $con = mysql_connect($mysql_host.':'.$mysql_port, $mysql_user, $mysql_password); if (!$con){ die('Could not connect: ' . mysql_error()); } mysql_query("SET NAMES 'UTF8'"); mysql_select_db($mysql_database, $con); $result = mysql_query($mysql_state); $location = array(); while($row = mysql_fetch_array($result)) { $location["x"] = $row["locationX"]; $location["y"] = $row["locationY"]; } mysql_close($con); if (isset($location["x"]) && $location["x"] != 0.0){ return $location; }else{ return "系統(tǒng)中沒有你的地理位置信息,請先發(fā)送位置給我!您不用擔心你的行蹤被泄漏,因為你可以滑動地圖,把別處的地址發(fā)送過來。"; } }
如果用戶發(fā)了位置,則進行更新
function updateOrInsert($weixinid, $locationX, $locationY) { if (isset($_SERVER['HTTP_APPNAME'])){ $mysql_host = SAE_MYSQL_HOST_M; $mysql_host_s = SAE_MYSQL_HOST_S; //sae的從庫 $mysql_port = SAE_MYSQL_PORT; $mysql_user = SAE_MYSQL_USER; $mysql_password = SAE_MYSQL_PASS; $mysql_database = SAE_MYSQL_DB; }else{ $mysql_host = "127.0.0.1"; $mysql_host_s = "127.0.0.1"; $mysql_port = "3306"; $mysql_user = "root"; $mysql_password = "root"; $mysql_database = "sae"; } $mysql_table = "location"; //INSERT INTO location VALUES("23s2s", 1122.2, 366.2) ON DUPLICATE KEY UPDATE locationX = 1122.2, locationY = 366.2; $mysql_state = "INSERT INTO ".$mysql_table." VALUES(\"".$weixinid."\", ".$locationX.", ".$locationY.") ON DUPLICATE KEY UPDATE locationX = ".$locationX.", locationY = ".$locationY.";"; var_dump($mysql_state); // $con = mysql_connect($mysql_host.':'.$mysql_port, $mysql_user, $mysql_password); if (!$con){ die('Could not connect: ' . mysql_error()); } mysql_query("SET NAMES 'UTF8'"); mysql_select_db($mysql_database, $con); $result = mysql_query($mysql_state); if ($result == true){ //return "你提交的位置為緯度:".$locationX.",經(jīng)度:".$locationY."。\n現(xiàn)在可以發(fā)送“附近”加關鍵字的命令查詢附近的目標,如“附近酒店”,“附近醫(yī)院”。"; return "已經(jīng)成功獲取你的位置。您不用擔心你的行蹤被泄漏,因為你可以把千里之外的地址提交過來。\n現(xiàn)在可以發(fā)送“附近”加關鍵字的命令查詢附近的目標,如“附近酒店”,“附近醫(yī)院”。"; }else{ return "提交失敗,請重試。如果一直出現(xiàn)這樣的錯誤,請給我們留言。"; } }
對于用戶發(fā)送的內(nèi)容,先提取坐標,然后進行組合查詢
實現(xiàn)效果如下:
?
?
以上是微信公眾平臺訊息介面開發(fā)地理位置查詢附近商家實例的詳細內(nèi)容。更多資訊請關注PHP中文網(wǎng)其他相關文章!
本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內(nèi)容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool
免費脫衣圖片

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

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

Clothoff.io
AI脫衣器

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

熱門文章
指南:恆星刀片保存文件位置/保存文件丟失/不保存
4 週前
By DDD
Oguri Cap Build Guide |漂亮的德比志
2 週前
By Jack chen
Agnes Tachyon Build Guide |漂亮的德比志
1 週前
By Jack chen
沙丘:覺醒 - 高級行星學家Quest演練
4 週前
By Jack chen
約會一切:德克和哈珀關係指南
4 週前
By Jack chen

熱工具

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

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

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

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