WeChat パブリック プラットフォーム メッセージ インターフェイスの開発例、近くの企業(yè)の地理的位置クエリ
Mar 31, 2017 pm 02:50 PM1. ユーザーのアドレスと位置メッセージを取得します
ユーザーが位置を送信するときのメッセージと形式は次のとおりです
バックエンド形式:
<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號(hào) 郵政編碼: 518057]]></Label> <MsgId>5837017832671832047</MsgId> </xml>
XML 形式の説明
ToUserName 消息接收方微信號(hào),一般為公眾平臺(tái)賬號(hào)微信號(hào) FromUserName 消息發(fā)送方微信號(hào) CreateTime 消息創(chuàng)建時(shí)間 MsgType 消息類型,地理位置為location Location_X 地理位置緯度 Location_Y 地理位置經(jīng)度 Scale 地圖縮放大小 Label 地理位置信息 MsgId 消息ID號(hào)
2. 取得周辺エリア情報(bào)
Baidu Map Place API は、特定のエリアをクエリするために特定の種類の POI データを返すために使用されるシンプルな HTTP インターフェイスであり、単一の POI に対して詳細(xì)なクエリ サービスを提供します。ユーザーは C#、C++、Java などを使用できます。 HTTP リクエストを送信し、json、xml データを受信するための他の開発言語。
Place API は、地域検索 POI サービス、POI 詳細(xì)サービス、グループ購入情報(bào)検索サービス、および加盟店グループ購入詳細(xì)クエリを提供します。地域検索POIサービスでは、都市內(nèi)検索、長方形検索、円形エリア検索の3つの地域検索方法を提供しています。
円形領(lǐng)域検索を使用して、近くの検索機(jī)能を?qū)g裝します。
場所エリア検索POIサービスインターフェースは次のとおりです:
http://api.map.baidu.com/place/v2/search
パラメータ | 必要ですか | デフォルト値 | フォーマット例 | 意味 |
location | は | なし | 38.76623,116.43213 | 2000 周辺探索半徑、単位はメートル |
q(クエリ) | は | なし | 中関村、ATM 、Baidu Building |
| 検索キーワード、周辺機(jī)器 複數(shù)のキーワードの結(jié)合検索をサポートしており、最大 10 個(gè)のキーワード検索がサポートされています。例: 「銀行$ホテル」。
タグ | いいえ | なし | 日本のバーベキュー/鉄板焼き、チャオワイストリート | アイテムにタグを付けて、qと組み合わせて検索 |
出力 | いいえ | xml | jsonまたはxml | 出力形式はjsonまたはxmlです |
scope | is |
| 11、2 | 検索結(jié)果の詳細(xì)。値が 1 または空の場合は、基本情報(bào)が返され、値が 2 の場合は、取得した POI の詳細(xì)情報(bào)が返されます。 |並べ替え名:価格 |
|グルーポン:0 |discount:0 | フィルター條件を取得します。スコープ値が 2 の場合、ソート用のフィルターを設(shè)定できます。 Industry_type: 業(yè)界タイプ |
sort_name: 並べ替えフィールド
sort_rule: 並べ替えルール、値は次のとおりです: 0: 高い方から低い方へ、1: 低い方から高い方へ ; 価格セクション: 価格帯 groupon: 共同購入の有無。1 は共同購入があることを意味し、0 は共同購入がないことを意味します。 割引: 割引があるかどうか。1 は割引があることを意味し、0 は割引がないことを意味します。 | ||
page_size | 否 | 10 | 10 | 范圍記錄數(shù)量,默認(rèn)為10條記錄,最大返回20條。多關(guān)鍵字檢索時(shí),返回的記錄數(shù)為關(guān)鍵字個(gè)數(shù)*page_size。 |
page_num | 否 | 0 | 0、1、2 | 分頁頁碼,默認(rèn)為0,0代表第一頁,1代表第二頁,以此類推。 |
ak | 是 | 無 | E4805d16520de693a3fe707cdc962045 | 用戶的訪問密鑰,必填項(xiàng)。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; }
計(jì)算兩坐標(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ù)庫的方式來存儲(chǔ),
如果用戶發(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)心你的行蹤被泄漏,因?yàn)槟憧梢曰瑒?dòng)地圖,把別處的地址發(fā)送過來。"; } }
如果用戶發(fā)了位置,則進(jìn)行更新
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)心你的行蹤被泄漏,因?yàn)槟憧梢园亚Ю镏獾牡刂诽峤贿^來。\n現(xiàn)在可以發(fā)送“附近”加關(guān)鍵字的命令查詢附近的目標(biāo),如“附近酒店”,“附近醫(yī)院”。"; }else{ return "提交失敗,請重試。如果一直出現(xiàn)這樣的錯(cuò)誤,請給我們留言。"; } }
對于用戶發(fā)送的內(nèi)容,先提取坐標(biāo),然后進(jìn)行組合查詢
實(shí)現(xiàn)效果如下:
?
?
以上がWeChat パブリック プラットフォーム メッセージ インターフェイスの開発例、近くの企業(yè)の地理的位置クエリの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









