微信公眾號開發之用戶地理位置坐標轉百度坐標(搜狗、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/>"
