下面先了解坐标体系的相关知识。目前,国内外主要有以下几种不同的坐标体系。
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 }
这样就能实时收集到很多用户的实际位置。将这些信息保存到数据库中,还可以对用户进行大数据分析。