当前位置:首页 > 技术文档 > 正文内容

php利用百度地图API进行IP定位和GPS定位

admin10年前 (2015-07-18)技术文档1877

最 近在做一个手机端的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']
  );
 }
}

调用方法就不说了。稍微看一下源代码就可以知道的


分享到:

扫描二维码推送至手机访问。

版权声明:本文由云河空间发布,如需转载请注明出处。

本文链接:https://yuyunhe.cn/index.php/post/80.html

分享给朋友:

“php利用百度地图API进行IP定位和GPS定位” 的相关文章

安卓刷机教程

 安卓手机刷机教程,体验不一样的新系统。    一:刷机准备与介绍  首先简单介绍下刷机吧,所谓的刷机,不纯指刷新的系统,其中还包括刷Recovery(也叫CWM或者工程模式),基带(你可以理解为电脑驱动 类),ROM(系统哦),SPL(你...

php简单分页类

<?php class page{            public $page; //当前页     publi...

dz中“QQ互联”出现Discuz! Database Error解决办法

dz中“QQ互联”出现Discuz! Database Error解决办法

dz中QQ登陆出现Discuz! Database Error解决办法dz站长朋友相信肯定有人遇到做的QQ互联登录,根本没法用,这让网站的社交登录性能大打折扣,这么解决?下面就看大神的神操作!...

ThinkPHP分页的实现

分页类需要和查询相结合,我们可以使用ThinkPHP自带的limit方法或者page方法,目的就是为了获取当前分页的数据(也有先获取完整数据然后前端分页显示的方法,不在本文描述内容中,也不建议)。使用limit方法或者page方法是和数据库类型无关的。我们首先在数据库里面创建一个think_data...

wamp虚拟主机配置

1、首先打开apache的配置文件httpd.conf,并去掉#Include conf/extra/httpd-vhosts.conf前面的#,启用虚拟主机功能2、先把localhost配置好,免得以后访问localhost出现问题,我的wamp项目根目录是D:\wamp\www。将下面信息添加到...

ThinkPHP实现多数据库连接的解决方法

这篇文章主要介绍了ThinkPHP实现多数据库连接的解决方法,需要的朋友可以参考下ThinkPHP实现连接多个数据的时候,如果数据库在同一个服务器里的话只需要这样定义模型:?123class MembersModel extends Model{protected $trueTableName =...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。