微信公众号开发之用户地理位置坐标转百度坐标(搜狗、google地图坐标转百度地图坐标)
我们知道,Google地图、soso地图与百度地图的坐标是不一样的,通常会差挺远一段距离。因此我们在微信中使用百度地图导航等百度地图API时,若根据微信获取的用户位置信息的话,得到的结果通常是不准确的。这时我们就需要把微信获取的用户位置坐标转换成百度地图对应的坐标才可以。
下面是我们在微信公众号中获得的用户位置的XML数据包(用户主动发送来的位置,开通高级接口的可以主动获取用户信息,获取结果参考这里):
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[location]]></MsgType> <Location_X>23.134521</Location_X> <Location_Y>113.358803</Location_Y> <Scale>20</Scale> <Label><![CDATA[位置信息]]></Label> <MsgId>1234567890123456</MsgId> </xml>
参数说明:
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | location |
Location_X | 地理位置维度 |
Location_Y | 地理位置经度 |
Scale | 地图缩放大小 |
Label | 地理位置信息 |
MsgId | 消息id,64位整型 |
我们需要做的是把 Latitude 和 Longitude 转换成百度地图对应的坐标(示例):
百度地图坐标转化API组成说明(更多):
- 域名:http://api.map.baidu.com
- 服务名:geoconv
- 服务版本号:v1
服务参数说明
参数 | 含义 | 取值范围 | 是否必须 | 默认取值 |
---|---|---|---|---|
coords | 源坐标 | 格式:经度,纬度;经度,纬度…限制:最多支持100个格式举例:114.21892734521,29.575429778924;114.21892734521,29.575429778924 | 是 | 无 |
ak | 开发者密钥 | 是 | 无 | |
from | 源坐标类型 | 取值为如下:1:GPS设备获取的角度坐标;2:GPS获取的米制坐标、sogou地图所用坐标;3:google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标4:3中列表地图坐标对应的米制坐标5:百度地图采用的经纬度坐标6:百度地图采用的米制坐标
7:mapbar地图坐标; 8:51地图坐标 |
否 | 默认为1,即GPS设备获取的坐标 |
to | 目的坐标类型 | 有两种可供选择:5、6。5:bd09ll(百度经纬度坐标),6:bd09mc(百度米制经纬度坐标); | 否 | 默认为5,即bd09ll(百度坐标) |
output | 返回结果格式 | json或者xml | 否 | json |
返回值说明
名称 | 类型 | 含义 | 取值范围 | |
---|---|---|---|---|
status | init | 状态码 | 正常0,异常非0,详细见状态码说明 | |
result | json或者xml数组 | 转换结果 | 与输入顺序一致 | |
x | float | 横坐标 | ||
y | float | 纵坐标 |
下面上代码:
<?php $postData = "<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[location]]></MsgType> <Location_X>23.134521</Location_X> <Location_Y>113.358803</Location_Y> <Scale>20</Scale> <Label><![CDATA[位置信息]]></Label> <MsgId>1234567890123456</MsgId> </xml> "; $object = simplexml_load_string($postData, 'SimpleXMLElement', LIBXML_NOCDATA); $lat = $object->Location_X; //纬度 $lng = $object->Location_Y; //经度 //这里from参数用1会更加精准。1:GPS设备获取的角度坐标,wgs84坐标; $q = "http://api.map.baidu.com/geoconv/v1/?coords={$lng},{$lat}&from=3&to=5&ak=你的API KEY"; $result = json_decode(file_get_contents($q));
echo "转换前的经度:".$lng."<br/>"; echo "转换后的经度:".$result->result[0]->x."<br/>"; echo "转换前的纬度:".$lat."<br/>"; echo "转换后的纬度:".$result->result[0]->y."<br/>"