Heim > Artikel > WeChat-Applet > Beispiel für die Entwicklung einer Nachrichtenschnittstelle auf der öffentlichen WeChat-Plattform für eine geografische Standortabfrage für Unternehmen in der Nähe
1. Erhalten Sie die Standortnachricht der Benutzeradresse
Die Nachricht und das Format, wenn der Benutzer den Standort sendet, sind wie folgt
Backend-Format:
<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[中国广东省深圳市南山区华侨城深南大道9789号 邮政编码: 518057]]></Label> <MsgId>5837017832671832047</MsgId> </xml>
Erklärung des XML-Formats
ToUserName 消息接收方微信号,一般为公众平台账号微信号 FromUserName 消息发送方微信号 CreateTime 消息创建时间 MsgType 消息类型,地理位置为location Location_X 地理位置纬度 Location_Y 地理位置经度 Scale 地图缩放大小 Label 地理位置信息 MsgId 消息ID号
Baidu Map Place API ist Eine einfache HTTP-Schnittstelle wird verwendet, um bestimmte Arten von POI-Daten in einem bestimmten Bereich zurückzugeben und detaillierte Abfragedienste für einen einzelnen POI bereitzustellen. Benutzer können C#, C++, Java und andere Entwicklungssprachen verwenden, um HTTP-Anfragen zu senden und JSON zu empfangen XML-Daten.
Place API bietet regionale POI-Suchdienste, POI-Detaildienste, Dienste zum Abrufen von Gruppenkaufinformationen und die Abfrage von Kaufdetails für Händlergruppen. Der POI-Dienst für die regionale Suche bietet drei regionale Suchmethoden: Suche innerhalb der Stadt, Suche nach Rechtecken und Suche nach Kreisgebieten.
Wir verwenden die Kreisflächensuche, um die Suchfunktion in der Nähe zu implementieren.
Die Schnittstelle des POI-Dienstes für die Ortsgebietssuche lautet wie folgt:
http://api.map.baidu.com/place/v2/search
Parameter |
Ob es erforderlich ist |
Standardwert |
Formatbeispiel |
Bedeutung |
Standort |
ist |
kein |
38.76623, 116.43213 |
Peripherer Suchmittelpunkt, mehrere Punkte werden nicht unterstützt |
Radius (r) |
Nein |
Keine |
2000 | Peripherer Suchradius in Metern |
q(query) |
ist | Keine |
Zhongguancun, Geldautomat, Baidu-Gebäude |
Suchbegriffe, Umgebungssuchen und rechteckige Bereiche Die interne Suche unterstützt die Union-Suche Mehrere Schlüsselwörter werden durch das $-Symbol getrennt und es werden bis zu 10 Schlüsselwortsuchen unterstützt. Zum Beispiel: „Bank$Hotel“. |
Tag |
Nein |
Keine |
Japanisches BBQ/Teppanyaki, Chaowai Street |
Artikel markieren, mit q kombinieren, um zu suchen |
Ausgabe |
nein |
xml |
json oder xml | Das Ausgabeformat ist JSON oder XML |
Umfang |
ist |
1 |
1, 2 |
Detailebene des Abrufergebnisses. Wenn der Wert 1 oder leer ist, werden grundlegende Informationen zurückgegeben; wenn der Wert 2 ist, werden detaillierte POI-Informationen zurückgegeben |
Filter |
Nein |
Keine |
filter=industry_type:cater |
Filterbedingungen abrufen Wenn der Bereichswert 2 ist, können Sie den Filter für die Sortierung festlegen. |
page_size |
否 |
10 |
10 |
范围记录数量,默认为10条记录,最大返回20条。多关键字检索时,返回的记录数为关键字个数*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
百度地图类定义如下
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); }
对于用户的坐标记录,我们使用数据库的方式来存储,
如果用户发送查询命令,则直接查询,
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 "系统中没有你的地理位置信息,请先发送位置给我!您不用担心你的行踪被泄漏,因为你可以滑动地图,把别处的地址发送过来。"; } }
如果用户发了位置,则进行更新
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.",经度:".$locationY."。\n现在可以发送“附近”加关键字的命令查询附近的目标,如“附近酒店”,“附近医院”。"; return "已经成功获取你的位置。您不用担心你的行踪被泄漏,因为你可以把千里之外的地址提交过来。\n现在可以发送“附近”加关键字的命令查询附近的目标,如“附近酒店”,“附近医院”。"; }else{ return "提交失败,请重试。如果一直出现这样的错误,请给我们留言。"; } }
对于用户发送的内容,先提取坐标,然后进行组合查询
实现效果如下:
Das obige ist der detaillierte Inhalt vonBeispiel für die Entwicklung einer Nachrichtenschnittstelle auf der öffentlichen WeChat-Plattform für eine geografische Standortabfrage für Unternehmen in der Nähe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!