最 近在做一个手机端的webapp地图应用,而核心内容当然是定位了,但是定位的话有几种方式,IP定位,GPS定位,基站定位(这个貌似webapp用不 了), 那么剩下核心的gps定位和ip定位了,我们知道,html5有定位API,但是该API拿到的GPS数据是硬件坐标,无法直接显示在地图上。 后来上百度LBS云看到有地图IP定位API和GPS坐标转换API,地址:http://developer.baidu.com/map/ 百度地图API的调用需要申请KEY,这里就不具体介绍了,直接贴上本人写了两个关键方法,为了方便前台调用,返回数据采用以下格式
1 2 3 4 5 6 7 8 9 10 | { address: "北京市海淀区西二旗北路" , province: "北京市" , city: "北京市" , street: "西二旗北路" , street_number: "" , city_code: 131, lng: 116.3207676804, lat: 40.064084055578 } |
核心类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | <?php /** * @author xialei <xialeistudio@gmail.com> */ class map { private static $_instance ; const REQ_GET = 1; const REQ_POST = 2; /** * 单例模式 * @return map */ public static function instance() { if (!self:: $_instance instanceof self) { self:: $_instance = new self; } return self:: $_instance ; } /** * 执行CURL请求 * @author: xialei<xialeistudio@gmail.com> * @param $url * @param array $params * @param bool $encode * @param int $method * @return mixed */ private function async( $url , $params = array (), $encode = true, $method = self::REQ_GET) { $ch = curl_init(); if ( $method == self::REQ_GET) { $url = $url . '?' . http_build_query( $params ); $url = $encode ? $url : urldecode( $url ); curl_setopt( $ch , CURLOPT_URL, $url ); } else { curl_setopt( $ch , CURLOPT_URL, $url ); curl_setopt( $ch , CURLOPT_POST, true); curl_setopt( $ch , CURLOPT_POSTFIELDS, $params ); } curl_setopt( $ch , CURLOPT_REFERER, '百度地图referer' ); curl_setopt( $ch , CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53' ); curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); $resp = curl_exec( $ch ); curl_close( $ch ); return $resp ; } /** * ip定位 * @param string $ip * @return array * @throws Exception */ public function locationByIP( $ip ) { //检查是否合法IP if (!filter_var( $ip , FILTER_VALIDATE_IP)) { throw new Exception( 'ip地址不合法' ); } $params = array ( 'ak' => '百度地图API KEY' , 'ip' => $ip , 'coor' => 'bd09ll' //百度地图GPS坐标 ); $api = 'http://api.map.baidu.com/location/ip' ; $resp = $this ->async( $api , $params ); $data = json_decode( $resp , true); //有错误 if ( $data [ 'status' ] != 0) { throw new Exception( $data [ 'message' ]); } //返回地址信息 return array ( 'address' => $data [ 'content' ][ 'address' ], 'province' => $data [ 'content' ][ 'address_detail' ][ 'province' ], 'city' => $data [ 'content' ][ 'address_detail' ][ 'city' ], 'district' => $data [ 'content' ][ 'address_detail' ][ 'district' ], 'street' => $data [ 'content' ][ 'address_detail' ][ 'street' ], 'street_number' => $data [ 'content' ][ 'address_detail' ][ 'street_number' ], 'city_code' => $data [ 'content' ][ 'address_detail' ][ 'city_code' ], 'lng' => $data [ 'content' ][ 'point' ][ 'x' ], 'lat' => $data [ 'content' ][ 'point' ][ 'y' ] ); } /** * GPS定位 * @param $lng * @param $lat * @return array * @throws Exception */ public function locationByGPS( $lng , $lat ) { $params = array ( 'coordtype' => 'wgs84ll' , 'location' => $lat . ',' . $lng , 'ak' => '百度地图API KEY' , 'output' => 'json' , 'pois' => 0 ); $resp = $this ->async( 'http://api.map.baidu.com/geocoder/v2/' , $params , false); $data = json_decode( $resp , true); if ( $data [ 'status' ] != 0) { throw new Exception( $data [ 'message' ]); } return array ( 'address' => $data [ 'result' ][ 'formatted_address' ], 'province' => $data [ 'result' ][ 'addressComponent' ][ 'province' ], 'city' => $data [ 'result' ][ 'addressComponent' ][ 'city' ], 'street' => $data [ 'result' ][ 'addressComponent' ][ 'street' ], 'street_number' => $data [ 'result' ][ 'addressComponent' ][ 'street_number' ], 'city_code' => $data [ 'result' ][ 'cityCode' ], 'lng' => $data [ 'result' ][ 'location' ][ 'lng' ], 'lat' => $data [ 'result' ][ 'location' ][ 'lat' ] ); } } |
调用方法就不说了。稍微看一下源代码就可以知道的