讀古今文學網 > 微信公眾平台開發:從零基礎到ThinkPHP5高性能框架實踐 > 6.3.2 轉換坐標到地址 >

6.3.2 轉換坐標到地址

下面先瞭解坐標體系的相關知識。目前,國內外主要有以下幾種不同的坐標體系。

WGS-84(World Geodetic System 1984)坐標系統是一種國際上採用的地心坐標系。坐標原點為地球質心,其地心空間直角坐標系的Z軸指向BIH(國際時間服務機構)1984.0定義的協議地球極(CTP)方向,X軸指向BIH 1984.0的零子午面和CTP赤道的交點,Y軸與Z軸、X軸垂直構成右手坐標系,稱為1984年世界大地坐標系統。該坐標系統俗稱「地球坐標系」,也是目前GPS所採用的坐標系統。

GCJ-02是由中國國家測繪局制定的地理信息系統的坐標系統。它是一種對經緯度數據的加密算法,即加入隨機的偏差。國內出版的各種地圖系統(包括電子形式),都必須至少採用GCJ-02對地理位置進行首次加密。該坐標系統俗稱「火星坐標系」。

百度坐標系統是百度公司的地圖坐標系統,它在國家測繪局的GCJ-02的基礎上進行了BD-09二次加密,更加有助於保護個人隱私。同時,百度地圖支持將WGS-84和GCJ-02坐標轉換成百度坐標。

當微信公眾號獲取到用戶的地理位置坐標後,需要將坐標轉換成用戶的真實所在地(省、市、區等信息),以便更直觀地理解以及進行用戶數據分析。百度地圖Geocoding API提供逆地址解析功能,即由經緯度信息得到地址信息,使用這一功能可以獲得微信用戶的具體所在地。該接口支持上述3種坐標系統的坐標,但在不同的坐標系統中,同一經緯度解析後的地址有一定的偏差。例如,「lat:22.539968,lng:113.954980」在百度坐標系統下解析的結果是「廣東省深圳市南山區高新南七道2號」,而在GCJ-02坐標系統下解析的結果是「廣東省深圳市南山區深南大道9789-2」。

Android版和iPhone版微信上使用的地圖都為騰訊地圖,採用GCJ-02坐標系統。

百度地圖Geocoding API服務地址接口為http://api.map.baidu.com/geocoder/v2/。

該接口的參數說明如表6-10所示。

表6-10 百度地圖Geocoding API的參數說明

該接口的一個請求示例如下。


http:// api.map.baidu.com/geocoder/v2/?ak=B944e1fce373e33ea4627f95f54f2ef9&location=22.
539968,113.954980&output=json&coordtype=gcj02ll
  

上述接口執行後,返回的結果如下。


{
    "status": 0,
    "result": {
        "location": {
            "lng": 113.96151089462,
            "lat": 22.54572267759
        },
        "formatted_address": "廣東省深圳市南山區深南大道9789-2",
        "business": "科技園,大沖,深圳灣",
        "addressComponent": {
            "city": "深圳市",
            "district": "南山區",
            "province": "廣東省",
            "street": "深南大道",
            "street_number": "9789-2"
        },
        "cityCode": 340
    }
}
  

在微信中接收到用戶地理位置事件的時候,將用戶的坐標轉換成國內的省市區地址,核心代碼如下。


 1 private function receiveEvent($object)
 2 {
 3     $content = "";
 4     switch ($object->Event)
 5     {
 6     case "subscribe":
 7         $content = "歡迎關注";
 8         break;
 9     case "unsubscribe":
10         $content = "取消關注";
11         break;
12     case "LOCATION":
13         $url = "http:// api.map.baidu.com/geocoder/v2/?ak=B944e1fce373e33ea4627f9
       5f54f2ef9&location=$object->Latitude,$object->Longitude&output=json&coord
       type=gcj02ll";
14         $output = file_get_contents($url);
15         $address = json_decode($output, true);
16         $content = "位置 ".$address["result"]["addressComponent"]["province"]." ".
      $address["result"]["addressComponent"]["city"]." ".$address["result"]["address
      Component"]["district"]." ".$address["result"]["addressComponent"]["street"];
17         break;
18     default:
19         break;
20     }
21     $result = $this->transmitText($object, $content);
22     return $result;
23 }
  

這樣就能實時收集到很多用戶的實際位置。將這些信息保存到數據庫中,還可以對用戶進行大數據分析。