>  기사  >  위챗 애플릿  >  주변 업체에 대한 지리적 위치 쿼리를 위한 WeChat 공개 플랫폼 메시지 인터페이스 개발 사례

주변 업체에 대한 지리적 위치 쿼리를 위한 WeChat 공개 플랫폼 메시지 인터페이스 개발 사례

高洛峰
高洛峰원래의
2017-03-31 14:50:283381검색

1. 사용자 주소 위치 메시지 받기

사용자가 위치를 보낼 때 메시지와 형식은 다음과 같습니다

주변 업체에 대한 지리적 위치 쿼리를 위한 WeChat 공개 플랫폼 메시지 인터페이스 개발 사례

백엔드 형식:

<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号

2. 주변 지역 정보 얻기

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
lat,lng

주변 검색 중심점, 다중 지점 지원 안 됨

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
|sort_name:가격
|sort_rule:0
|가격 섹션:100,200
|그루폰:0
|discount:0

필터 조건을 검색합니다. 범위 값이 2인 경우 정렬용 필터를 설정할 수 있습니다.
industry_type: 산업 유형
sort_name: 정렬 필드
sort_rule: 정렬 규칙, 값은 다음과 같습니다: 0: 높은 것에서 낮은 것, 1: 낮은 것에서 높은 것
가격 섹션: 가격대
groupon: 공동구매 유무, 1은 공동구매 있음, 0은 공동구매 없음
할인: 할인 있음 여부, 1은 할인 있음, 0은 할인 없음

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[&#39;key&#39;] = "401f9a693dd267dd9a4661ec0895fb20";
        $this->auth_params[&#39;output&#39;] = "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.&#39;:&#39;.$mysql_port, $mysql_user, $mysql_password);
    if (!$con){
        die(&#39;Could not connect: &#39; . mysql_error());
    }
    mysql_query("SET NAMES &#39;UTF8&#39;");
    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[&#39;HTTP_APPNAME&#39;])){
        $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.&#39;:&#39;.$mysql_port, $mysql_user, $mysql_password);
    if (!$con){
        die(&#39;Could not connect: &#39; . mysql_error());
    }
    mysql_query("SET NAMES &#39;UTF8&#39;");
    mysql_select_db($mysql_database, $con);
    $result = mysql_query($mysql_state);
    if ($result == true){
        //return "你提交的位置为纬度:".$locationX.",经度:".$locationY."。\n现在可以发送“附近”加关键字的命令查询附近的目标,如“附近酒店”,“附近医院”。";
        return "已经成功获取你的位置。您不用担心你的行踪被泄漏,因为你可以把千里之外的地址提交过来。\n现在可以发送“附近”加关键字的命令查询附近的目标,如“附近酒店”,“附近医院”。";
    }else{
        return "提交失败,请重试。如果一直出现这样的错误,请给我们留言。";
    }
}

对于用户发送的内容,先提取坐标,然后进行组合查询

주변 업체에 대한 지리적 위치 쿼리를 위한 WeChat 공개 플랫폼 메시지 인터페이스 개발 사례

实现效果如下:

 주변 업체에 대한 지리적 위치 쿼리를 위한 WeChat 공개 플랫폼 메시지 인터페이스 개발 사례주변 업체에 대한 지리적 위치 쿼리를 위한 WeChat 공개 플랫폼 메시지 인터페이스 개발 사례주변 업체에 대한 지리적 위치 쿼리를 위한 WeChat 공개 플랫폼 메시지 인터페이스 개발 사례

 

위 내용은 주변 업체에 대한 지리적 위치 쿼리를 위한 WeChat 공개 플랫폼 메시지 인터페이스 개발 사례의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.