?一、獲取用戶地址位置消息
用戶發(fā)送位置時的消息及格式如下
后臺格式:
<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的詳情查詢服務(wù),用戶可以使用C#、C++、Java等開發(fā)語言發(fā)送HTTP請求且接收json、xml的數(shù)據(jù)。
Place API 提供區(qū)域檢索POI服務(wù)、POI詳情服務(wù)與團購信息檢索服務(wù)、商家團購詳情查詢。區(qū)域檢索POI服務(wù)提供三種區(qū)域檢索方法:城市內(nèi)檢索、矩形檢索、圓形區(qū)域檢索。
我們使用圓形區(qū)域檢索來實現(xiàn)附近搜索功能。
place區(qū)域檢索POI服務(wù)接口如下:
http://api.map.baidu.com/place/v2/search
參數(shù) | 是否必須 | 默認值 | 格式舉例 | 含義 |
location | 是 | 無 | 38.76623,116.43213 | 周邊檢索中心點,不支持多個點 |
radius(r) | 否 | 無 | 2000 | 周邊檢索半徑,單位為米 |
q(query) | 是 | 無 | 中關(guān)村、ATM、百度大廈 | 檢索關(guān)鍵字,周邊檢索和矩形區(qū)域內(nèi)檢索支持多個關(guān)鍵字并集檢索,不同關(guān)鍵字間以$符號分隔,最多支持10個關(guān)鍵字檢索。如:”銀行$酒店”。 |
tag | 否 | 無 | 日式燒烤/鐵板燒、朝外大街 | 標(biāo)簽項,與q組合進行檢索 |
output | 否 | xml | json或xml | 輸出格式為json或者xml |
scope | 是 | 1 | 1、2 | 檢索結(jié)果詳細程度。取值為1 或空,則返回基本信息;取值為2,返回檢索POI詳細信息 |
filter | 否 | 無 | filter=industry_type:cater | 檢索過濾條件,當(dāng)scope取值為2時,可以設(shè)置filter進行排序。 |
page_size | 否 | 10 | 10 | 范圍記錄數(shù)量,默認為10條記錄,最大返回20條。多關(guān)鍵字檢索時,返回的記錄數(shù)為關(guān)鍵字個數(shù)*page_size。 |
page_num | 否 | 0 | 0、1、2 | 分頁頁碼,默認為0,0代表第一頁,1代表第二頁,以此類推。 |
ak | 是 | 無 | E4805d16520de693a3fe707cdc962045 | 用戶的訪問密鑰,必填項。v2之前該屬性為key。 |
sn | 否 | 無 |
| 用戶的權(quán)限簽名。 |
timestamp | 否 | 無 |
| 設(shè)置sn后該值必填。 |
調(diào)用舉例如下:
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
三、程序?qū)崿F(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; } }
獲取附近的調(diào)用代碼如下:
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; }
計算兩坐標(biāo)之間距離如下
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); }
對于用戶的坐標(biāo)記錄,我們使用數(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ā)送位置給我!您不用擔(dān)心你的行蹤被泄漏,因為你可以滑動地圖,把別處的地址發(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ā)送“附近”加關(guān)鍵字的命令查詢附近的目標(biāo),如“附近酒店”,“附近醫(yī)院”。"; return "已經(jīng)成功獲取你的位置。您不用擔(dān)心你的行蹤被泄漏,因為你可以把千里之外的地址提交過來。\n現(xiàn)在可以發(fā)送“附近”加關(guān)鍵字的命令查詢附近的目標(biāo),如“附近酒店”,“附近醫(yī)院”。"; }else{ return "提交失敗,請重試。如果一直出現(xiàn)這樣的錯誤,請給我們留言。"; } }
對于用戶發(fā)送的內(nèi)容,先提取坐標(biāo),然后進行組合查詢
實現(xiàn)效果如下:
?
?
Atas ialah kandungan terperinci 微信公眾平臺消息接口開發(fā)地理位置查詢附近商家實例. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)
