首页 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践全文在线阅读

《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》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 }  

这样就能实时收集到很多用户的实际位置。将这些信息保存到数据库中,还可以对用户进行大数据分析。