热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信公众平台消息接口开发地理位置查询附近商家实例

这篇文章主要为大家详细介绍了微信公众平台消息接口开发地理位置查询附近商家实例的相关资料,需要的朋友可以参考下
一、获取用户地址位置消息

用户发送位置时的消息及格式如下

后台格式:




1359036619

22.539968
113.954980
16

5837017832671832047

XML格式讲解


ToUserName 消息接收方微信号,一般为公众平台账号微信号
 FromUserName 消息发送方微信号
 CreateTime 消息创建时间
 MsgType 消息类型,地理位置为location
 Location_X 地理位置纬度
 Location_Y 地理位置经度
 Scale 地图缩放大小
 Label 地理位置信息
 MsgId 消息ID号

二、获取周边区域信息

百度地图Place API 是一类简单的HTTP接口,用于返回查询某个区域的某类POI数据,且提供单个POI的详情查询服务,用户可以使用C#、C++、Java等开发语言发送HTTP请求且接收json、xml的数据。

Place API 提供区域检索POI服务、POI详情服务与团购信息检索服务、商家团购详情查询。区域检索POI服务提供三种区域检索方法:城市内检索、矩形检索、圆形区域检索。

我们使用圆形区域检索来实现附近搜索功能。

place区域检索POI服务接口如下:

http://api.map.baidu.com/place/v2/search

参数

是否必须

默认值

格式举例

含义

location

38.76623,116.43213
lat<纬度>,lng<经度>

周边检索中心点,不支持多个点

radius(r)

2000

周边检索半径,单位为米

q(query)

中关村、ATM、百度大厦

检索关键字,周边检索和矩形区域内检索支持多个关键字并集检索,不同关键字间以$符号分隔,最多支持10个关键字检索。如:”银行$酒店”。

tag

日式烧烤/铁板烧、朝外大街

标签项,与q组合进行检索

output

xml

json或xml

输出格式为json或者xml

scope

1

1、2

检索结果详细程度。取值为1 或空,则返回基本信息;取值为2,返回检索POI详细信息

filter

filter=industry_type:cater
|sort_name:price
|sort_rule:0
|price_section:100,200
|groupon:0
|discount:0

检索过滤条件,当scope取值为2时,可以设置filter进行排序。
industry_type:行业类型
sort_name:排序字段
sort_rule:排序规则,取值如下:0:从高到低,1:从低到高;
price_section:价格区间;
groupon:是否有团购,1为有团购,0为无团购;
discount:是否打折,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 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 "提交失败,请重试。如果一直出现这样的错误,请给我们留言。";
    }
}

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

以上就是微信公众平台消息接口开发地理位置查询附近商家实例的详细内容,更多请关注php中文网其它相关文章!


推荐阅读
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
author-avatar
花花花
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有