国际经纬度坐标标准为WGS-84(世界通用的经纬度坐标系),通常gps获取到的就是该坐标,在我国,这个坐标是不能直接应用在互联网服务上的,至少要经过国家测绘局的加密。
国测局试用的加密坐标系就是GCJ-02(被称为火星坐标系)。中国google地图,soso地图就是进行了GCJ-02的加密。
百度坐标在GCJ-02的基础上,进行了BD-09(百度坐标系)二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。
百度的坐标转换接口:
http://api.map.baidu.com/ag/coord/convert?from=2&to=4&x=30.531313&y=114.372717
返回结果 {"error":0,"x":"MzAuNTM4MTI0NDE4NjEz","y":"MTE0LjM3ODY0NjY1NTAy"} x是纬度,y是经度,php可用base64_decode()解密
http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=114.372717&y=30.531313
返回结果 {"error":0,"x":"MTE0LjM4NDcxNTA2OTI=","y":"MzAuNTM1MjA0NjQ0Nzg="} x经度,y是纬度,也是用base64加密过的
参数说明:
from 源坐标系 。to 要转换坐标系。0表示gps坐标系(WGS-84),2表示谷歌坐标系(GCJ-02),4表示百度坐标系(BD-09)
这里有一点要注意的是GPS对应的坐标x表示经度,y表示纬度。而google对应的坐标x表示纬度,y表示经度。
经测试只能从gps或者谷歌坐标系转到百度,而不能逆向,而且也可以从gps到谷歌,也就是只能进行加密的过程而不能解密。
from=0&to=4 ,from=0&to=2 ,from=2&to=4 只有这三个是可用的。
微信平台获得一定权限的服务号,有一个功能是自动获取地理位置,如果开启该功能并且用户同意获取地理位置信息,那么微信为隔一段时间给微信服务器发送包含用户当前位置信息的xml数据。格式如下:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[LOCATION]]></Event> <Latitude>23.137466</Latitude> <Longitude>113.352425</Longitude> <Precision>119.385040</Precision> </xml>
值得注意的是,该消息是一个事件消息,Event是LOCATION,位置信息的参数名是Latitude,Longitude,经测试该坐标是属于GPS通用坐标。
而另外一个与位置想关的服务是用户可以主动发送地理位置信息。微信对话框中+点开选择位置,会打开soso地图,点击发送,这是微信也会发送一个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>
而此消息的类型就直接是location了,而包含位置信息的参数名也变成了Location_X,Location_Y。此处的坐标属于soso地图的坐标系,也就是GCJ-02,与谷歌坐标系一样。