最近,在做微信公众平台PHP开发时,实现了根据用户发送的自身定位消息来获取周边信息的功能,为防止时间久后会忘记,特此总结,与大家分享,希望可以共同进步!!!
首先,我们自身的服务器应该与微信服务器对接成功,关于怎么去对接,笔者这里不再赘余,大家可以参考微信提供的开发者文档来实现对接功能。
当我们对接成功后,就可以根据用户发送的定位消息来实现了,这里我们使用的是百度开放平台提供的地图API(http://developer.baidu.com/map/webservice.htm)和静态图API(http://developer.baidu.com/map/static-1.htm),前提是我们需要注册百度帐号,毕竟免费用人家的东西嘛...
下面进行详细讲解:
1、一个API的事例,设置城市为北京,检索关键字是“银行”
2、接口参数
返回的结果为:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<PlaceSearchResponse>
<status>0</status>
<message>ok</message>
<results>
<result>
<name>中国银行(前门支行)</name>
<location>
<lat>39.908395</lat>
<lng>116.401507</lng>
</location>
<address>东城区西交民巷17号</address>
<uid>9077bab3ea018f6a7dc876e1</uid>
</result>
<result>
<name>中国工商银行(自动柜员机店)</name>
<location>
<lat>39.92203</lat>
<lng>116.40349</lng>
</location>
<address>西城区景山前街4号故宫景运门</address>
<uid>8ae8bed1a027af62705e8077</uid>
</result>
<result>
<name>中国工商银行(华龙街分理处)</name>
<location>
<lat>39.915002</lat>
<lng>116.413638</lng>
</location>
<address>东城区南河沿华龙街北京天安大厦贵宾楼饭店</address>
<uid>8d0f865a1c57ef4e76e5b6ff</uid>
</result>
<result>
<name>中国工商银行(长安和平门内支行)</name>
<location>
<lat>39.90742</lat>
<lng>116.390732</lng>
</location>
<address>北京市西城区北新华街东松树胡同甲31号</address>
<telephone>(010)66055708,(010)66057768</telephone>
<uid>a74481d691a0bf46f503b838</uid>
</result>
<result>
<name>中国农业银行长安支行</name>
<location>
<lat>39.910138</lat>
<lng>116.41365</lng>
</location>
<address>北京市东城区正义路3号卫戍区正义路物业楼</address>
<telephone>(010)65250432</telephone>
<uid>37d60a4657d8ce601e1d11c9</uid>
</result>
<result>
<name>中国工商银行(北池子储蓄所)</name>
<location>
<lat>39.921698</lat>
<lng>116.409168</lng>
</location>
<address>东城区东华门大街87号</address>
<uid>9577afcbeb7f4c1ae812e46c</uid>
</result>
<result>
<name>中国工商银行北京东交民巷分理处</name>
<location>
<lat>39.908091</lat>
<lng>116.413558</lng>
</location>
<address>北京市东城区正义路东交民巷30-6号</address>
<telephone>010-65266185</telephone>
<uid>5e53af1accd7a25c4151c026</uid>
</result>
<result>
<name>中国工商银行东长安街支行</name>
<location>
<lat>39.91588</lat>
<lng>116.418675</lng>
</location>
<address>北京市东城区东长安街1号东方广场W3座</address>
<telephone>(010)85181650</telephone>
<uid>24d05508ea8ccbd2128824de</uid>
</result>
<result>
<name>中国工商银行新东安支行</name>
<location>
<lat>39.919304</lat>
<lng>116.417906</lng>
</location>
<address>北京市东城区王府井大街138号一层</address>
<telephone>010-65256818</telephone>
<uid>8e96d243973dc4bfc51b75e5</uid>
</result>
<result>
<name>中国工商银行北京王府井金街支行</name>
<location>
<lat>39.921006</lat>
<lng>116.417403</lng>
</location>
<address>北京市市辖区东城区北京市东城区王府井大街237号</address>
<telephone>(010)65246520</telephone>
<uid>7d5f3a0afc6a944b2cb908c9</uid>
</result>
</results>
</PlaceSearchResponse>
http://api.map.baidu.com/lbsapi/staticmap/staticmap-helper.html
4、下面是demo:获取用户定位信息
//地理位置纬度
$location_X = $xmlArr['Location_X'];
//地理位置经度
$location_Y = $xmlArr['Location_Y'];
5、调用百度接口,并设置接收数据为json格式,进行json字符串编码
//百度圆形区域地图调用接口
$strUrl = "http://api.map.baidu.com/place/v2/search?&query=".$forName."&location=".$location_X.",".$location_Y."&radius=1500&output=json&ak=ekpxLUyfp8Lv7W1gdj57Oji6";
//接受json数据
$jsonStr = file_get_contents($strUrl);
//进行json字符串编码
$jsonArr = json_decode($jsonStr,TRUE);
6、生成静态地图图片,获取该图片的二进制编码,将图片保存在服务器
//获取百度地图生成图片
$pic_640 = "http://api.map.baidu.com/staticimage?width=640&height=320¢er=".$location_Y.",".$location_X."&zoom=13&markers=".$location_Y.",".$location_X."&markerStyles=l,";
$pic_80 = "http://api.map.baidu.com/staticimage?width=80&height=80¢er=".$location_Y.",".$location_X."&zoom=13&markers=".$location_Y.",".$location_X."&markerStyles=l,";
//获取图片的二进制编码
$p_640 = file_get_contents($pic_640);
file_put_contents("./images/640_".$xmlArr['FromUserName'].".png",$p_640);
$p_80 = file_get_contents($pic_80);
file_put_contents("./images/80_".$xmlArr['FromUserName'].".png",$p_80);
7、组装成xml字符串,返回给用户
$xmlPic = "<xml>
<ToUserName><![CDATA[".$xmlArr['FromUserName']."]]></ToUserName>
<FromUserName><![CDATA[".$xmlArr['ToUserName']."]]></FromUserName>
<CreateTime>".time()."</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>".count($arr)."</ArticleCount>
<Articles>";
//遍历地理位置信息
foreach($arr as $key => $val)
{
if($key == 0)
{
$picUrl = "http://weixin.duapp.com/images/640_".$xmlArr['FromUserName'].".png";
}
else
{
$picUrl = "http://weixin.duapp.com/images/80_".$xmlArr['FromUserName'].".png";
}
$xmlPic .="<item>
<Title><![CDATA[".$val['name']." 地址:".$val['address']." 电话:".$val['telephone']."]]></Title>
<Description><![CDATA[".$val['name']." 地址:".$val['address']." 电话:".$val['telephone']."]]></Description>
<PicUrl><![CDATA[".$picUrl."]]></PicUrl>
<Url><![CDATA[http://api.map.baidu.com/place/detail?uid=".$val['uid']."&output=html&src=".$val['name']."&output=html]]></Url>
</item>";
}
$xmlPic .= " </Articles></xml>";
echo $xmlPic;
8、事例样式图片:
特此分享,如有错误,欢迎大家指出,嘿嘿~~~
(完)