一、获取用户地址位置消息

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

后台格式:

<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 消息类型,地理位置为locationLocation_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['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=37492c0ee6f924cb5e934fa08c6b1676public 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 "提交失败,请重试。如果一直出现这样的错误,请给我们留言。";}
}

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

实现效果如下:

原文:http://www.cnblogs.com/txw1958/archive/2013/02/04/weixin-if11-location.html

---------------------------------------------------------------------------------------------------------------------------

转载于:https://www.cnblogs.com/txw1958/archive/2013/02/04/weixin-if11-location.html

微信公众平台消息接口开发(11)地理位置查询附近商家相关推荐

  1. 微信公众平台消息接口开发(2)-封装weixin.class.php

    微信公众平台消息接口开发(2)-封装weixin.class.php 一.封装weixin.class.php 由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处 ...

  2. 微信公众平台消息接口开发(1)

    原文链接 现在微信很热,微信公众平台的应用也很热,其实微信公众平台消息接口开发并不难,只要有接口调用就OK了. 要开发微信公众平台上的应用,得准备什么呢? 至少要有一个公众账号.服务器.域名这三样东西 ...

  3. 微信公众平台消息接口开发(4)天气预报

    一.请求数据 首先需要能有取得天气数据的接口,这样的接口网上有很多.比如google, yahoo,天气网都提供天气接口 方倍工作室的API已经能提供全国各地的天气预报,使用方倍的API无需再建立城市 ...

  4. 微信公众平台消息接口开发(34)微信墙之表白墙/婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙...

    微信公众平台开发模式 微信 公众平台 消息接口 开发模式 企业微信公众平台 微信墙 婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙 历史上的今天 作者:方倍工作室   原文: http://www.c ...

  5. php网站怎么对接微信群,PHP对接微信公众平台消息接口开发流程教程

    PHP(外文名:PHP: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使 ...

  6. php对接微信提醒,PHP对接微信公众平台消息接口开发流程教程

    PHP对接微信公众平台消息接口开发流程教程 发布于 2015-02-15 08:54:13 | 157 次阅读 | 评论: 1 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hyperte ...

  7. php微信公众号怎么开发_PHP对接微信公众平台消息接口开发流程详解及实例

    这篇文章主要介绍了PHP对接微信公众平台消息接口开发流程,如何使用PHP版接口操作公众平台消息,需要的朋友可以参考下 一.写好接口程序 在你的服务器上上传好一个接口程序文件内容如下: 代码如下:< ...

  8. 微信公众平台消息接口开发(34)微信墙之表白墙/婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙

    微信公众平台开发模式 微信 公众平台 消息接口 开发模式 企业微信公众平台 微信墙 婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙 历史上的今天 作者:方倍工作室   原文: http://www.c ...

  9. 微信公众平台消息接口开发(13)多语种互译

    微信公众平台消息接口 微信公众平台API 微信开发模式 多语种翻译 多语言互译 Microsoft Translator 方倍工作室 Paraphrase API 10 out of 11 rated ...

  10. 微信公众平台消息接口开发(22)图片识别之漂亮指数/帅气指数

    微信公众平台开发模式 微信 图片识别 人脸识别 漂亮指数 帅气指数 微信公众平台消息接口 微信开发模式 作者:http://www.cnblogs.com/txw1958/ 原文:http://www ...

最新文章

  1. 玩转spring mvc入参自定义类型转换和格式化
  2. pandas如何获取某一个元素的行号,也就是索引值
  3. python 指针_python的指针
  4. mysql完整字段包括_MySQL字段类型最全解析
  5. python内置字符串处理函数_Python内置的字符串处理函数
  6. CTF——Web——MD5漏洞
  7. C#-数组定义及使用数组的好处 046
  8. java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner
  9. Java神鬼莫测之Mybatis--增删改查CRUD以及批量操作(二)
  10. 从零开始的linux 第十九章(mv命令详解)
  11. Js拼接Json供echarts的地图使用
  12. 计算机弹奏两只老虎爱跳舞,原神风物之诗琴乐谱
  13. openwrt 中 WiFi探针的三种实现办法
  14. 升级啦!二维码签到适用PC+andriod+IOS-PHP源码-开源代码
  15. 深入理解java虚拟机第一第二部分(周志明第三版)
  16. 【BOOST C++容器专题03】【05】Boost.CircularBuffer
  17. 2022年广东省安全员A证第三批(主要负责人)考试练习题及在线模拟考试
  18. DDDM: A Brain-Inspired Framework for Robust Classification
  19. java课堂作业部分
  20. 屡陷丑闻的 Facebook,试图靠 AI Bot 管住员工的嘴

热门文章

  1. 怎么导入字体ttf_教程小字体制作精品教程(简化版)丨精致小字体
  2. springboot图书管理怎么实现借书时间到期提醒_今日图书丨有了这个,图书管理再也没烦恼!...
  3. 必看 | VLAN划分和网络配置实例
  4. 让创新触手可及,阿里云容器服务 ACK 发行版开放免费下载
  5. workerman在linux上怎么运行,linux系统中workerman的安装步骤
  6. mysql空表_MySQL中两种快速创建空表的方式
  7. coso全称是什么_国际贸易术语的全称是什么?
  8. C# json解析字符串总是多出双引号_Python小白必备知识:Python字符串详解
  9. iis thinkphp隐藏index.php,thinkphp 隐藏index.php iis apache nginx
  10. 加固工程验收规范50550_石家庄栾城县厂房梁柱加固施工队规范作业-建筑加固