下面先瞭解坐標體系的相關知識。目前,國內外主要有以下幾種不同的坐標體系。
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 }
這樣就能實時收集到很多用戶的實際位置。將這些信息保存到數據庫中,還可以對用戶進行大數據分析。