1. 사용자 주소 위치 메시지 받기
사용자가 위치를 보낼 때 메시지와 형식은 다음과 같습니다
백엔드 형식:
<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>
XML 형식 설명
ToUserName 消息接收方微信号,一般为公众平台账号微信号 FromUserName 消息发送方微信号 CreateTime 消息创建时间 MsgType 消息类型,地理位置为location Location_X 地理位置纬度 Location_Y 地理位置经度 Scale 地图缩放大小 Label 地理位置信息 MsgId 消息ID号
Baidu Map Place API는 간단한 HTTP 인터페이스입니다. 특정 영역의 특정 유형의 POI 데이터를 반환 및 쿼리하고 단일 POI에 대한 세부 쿼리 서비스를 제공하기 위해 사용자는 C#, C++, Java 및 기타 개발 언어를 사용하여 HTTP 요청을 보내고 json, xml을 받을 수 있습니다. 데이터.
Place API는 지역 검색 POI 서비스, POI 상세 서비스, 공동 구매 정보 조회 서비스, 가맹점 공동 구매 내역 조회 서비스를 제공합니다. 지역 검색 POI 서비스는 도시 내 검색, 직사각형 검색, 원형 지역 검색의 세 가지 지역 검색 방법을 제공합니다.
원형 영역 검색을 이용하여 주변 검색 기능을 구현하고 있습니다.
장소 지역 검색 POI 서비스 인터페이스는 다음과 같습니다.
http://api.map.baidu.com/place/v2/search
매개변수 | 필수여부 | 기본값 | 형식예 | 의미 |
위치 | 는 | 없음 | 38.76623, 116.43213 | 주변 검색 중심점, 다중 지점 지원 안 됨 |
radius (r) | 아니요 | 없음 | 2000 | 주변 검색 반경(미터) |
q(query) | 은 | 입니다. 없음 | 중관촌, ATM, 바이두빌딩 | 검색 키워드, 주변 검색 및 사각형 영역 내부 검색은 통합 검색을 지원합니다. 여러 키워드의 검색은 $ 기호로 구분되며, 최대 10개의 키워드 검색이 지원됩니다. 예: "은행$호텔". |
태그 | 없음 | 없음 | 일본식 바베큐/철판구이, 차오와이 거리 | 태그 항목, q와 결합하여 검색 |
출력 | 아니요 | xml | json 또는 xml | 출력 형식은 json 또는 xml입니다. |
scope | 는 | 1 | 1, 2 | 검색 결과 상세 수준입니다. 값이 1이거나 비어 있으면 기본 정보가 반환되고, 값이 2이면 POI 상세 정보가 반환됩니다. |
filter | 아니요 | 없음 | filter=industry_type:cater | 필터 조건을 검색합니다. 범위 값이 2인 경우 정렬용 필터를 설정할 수 있습니다. |
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 "提交失败,请重试。如果一直出现这样的错误,请给我们留言。"; } }
对于用户发送的内容,先提取坐标,然后进行组合查询
实现效果如下:
위 내용은 주변 업체에 대한 지리적 위치 쿼리를 위한 WeChat 공개 플랫폼 메시지 인터페이스 개발 사례의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!