地址:https://blog.csdn.net/self_realian/article/details/77982798
我们常常需要根据地址来获取经纬度,根据经纬度来调取百度地图等。
一、 根据地址获取经纬度类的封装
1, 获取第三方接口
2, 编写map类
3, 测试
1, 获取第三方接口
(1)进入http://lbsyun.baidu.com -> api控制台 ->设置AK
(2)找到geocoding api
进入之后需要注册用户,首先注册,然后找到api控制台
进api控制台之后,点击“创建应用” 会看家下边这个页面
然后填写“应用名称” 启用的服务,全部启用 ip白名单填写你本机的ip,然后点击“提交”就OK了,它会跳转到你的应用列表
下边就是找根据地址获取经纬度的接口,在“开发”=>”Web服务API”
点击进去之后,在左边有一个“geocoding API,点击一下 ( 正逆地理编码)
2, 封装map类库”
那么下边我们就开始封装我们的根据地址获取经纬度的类库
建议将这个类库文件放在你的TP5框架的extend目录下,因为它是一个扩展目录。我这里就叫Map.php
Map.php代码
/**
*百度地图相关业务封装
*/
class Map{
/*
* 根据地址获取经纬度
*/
public static function getLngLat($address){
//去刚才那个geocoding API页面将第三方接口的链接复制过来
//http://api.map.baidu.com/geocoder/v2/?
//callback=renderOption&output=json&address=北京市海淀区上地10街10号&city=北京市&ak=您的ak
//下边我们就开始拼装接口后边的那些参数
/*
这里可以做一个优化,我们可以把这些配置,直接放到配置文件当中去,而TP5给我们提供的方式是,在application
下边有一个config.php,可以在这里写我们的相关配置,但是在这里写会比较繁琐,它不利于我们去做扩展以及维护
,所以就像将其抽离出来,比如说,跟地图相关的配置,我就放在地图相关的配置文件当中去。TP5中又为我们提供
了一个小技巧,就是可以在application目录下创建一个extra目录,然后在里边创建一个map.php(存地图相关配置)
那么下面我们获取AK的方式就变成config('map.ak')(config是获取配置的函数,map是文件名,ak是数组索引名)
*/
if(!$address){
return '';//如果没有传递参数,返回为空
}
$data = [
'address' => $address,
'ak' => config('map.ak'),//这就是刚刚申请的AK
'output' => 'json',
];
//上边我们是将参数先都转换成了数组的形式,下边就是将其转换成上边链接的那种形式
$s = http_build_query($data);//这就可以将其转换成:callback=renderOption&output=json&address=北京市海淀区上地10街10号&city=北京市&ak=您的ak这种形式
//然后就是拼装完整的url
$url = config('map.baidu_map_url').config('map.geocoder').'?'.$s;
//那么现在我们就是获取这个url中的内容(php中有以下几种形式获取)
//1,file_get_contents($url);
//2,curl方式来获取(我们php中的curl方式需要封装一个方法,那么我将这个方法放在common.php中)
$result = doCurl($url);
//print_r($result);exit();//这个是测试一下(我们需要在controller/index.php中来调用它)
return $result;
//注意:如果你要测试一下,将“return $result”这行注释掉,将它的上一行注释去掉即可
}
}
map.php代码
<?php
/*
地图相关配置文件
*/
return [
'ak' => 'LAynLOG9Aozh5iiNzeFbhjkgaxudGmri',
'baidu_map_url' => 'http://api.map.baidu.com/',
'geocoder' => 'geocoder/v2/',
];
common.php代码
function doCurl($url, $type=0, $data=[]){
//初始化curl
$ch = curl_init(); //初始化
//设置选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//这个代表如果成功,只返回结果,不把内容输出来
curl_setopt($ch, CURLOPT_HEADER, 0);
if($type == 1){
//post
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
//执行并获取内容
$output = curl_exec($ch);
//释放curl句柄
curl_close($ch);
return $output;
}
controller/index.php代码
<?php
namespace app\admin\controller;
use think\Controller;
class Index extends Controller
{
public function map(){
\Map::getLngLat('北京昌平沙河地铁');exit;//用来测试的,测试结果是一串Json数据,
//返回的Json数据中的每个参数的含义都可以在geocoding API里边查找
}
}
3,测试结果截图如下:
二、 根据经纬度/地址调取百度地图
1, 获取第三方接口
2, 编写staticimage方法
3, 测试
首先我们要还是进入WebAPI页面,然后点开“静态图API”
小伙伴们可以将这个页面仔细阅读一下,先有一定的了解,调用起来会比较清晰熟练
1, 获取第三方接口
在该页面中找到“服务地址”并将其复制
2, 编写staticimage方法
该方法是写在Map.php中的(也就是说,将下边这个staticimage函数,放在Map.php中)
在extend/Map.php中添加西边这个函数
/*
*根据经纬度/地址调取百度地图
*/
//http://api.map.baidu.com/staticimage/v2
public static function staticimage($center){
if(!$center){
return '';//没有传递参数的时候,返回空
}
$data = [
'ak' => config('map.ak'),
'width' => config('map.width'),
'height' => config('map.height'),
'center' => $center,
'markers' => $center,//这个参数的含义在 静态图API的页面中找
];
$s = http_build_query($data);
$url = config('map.baidu_map_url').config('map.staticimage').'?'.$s;
$result = doCurl($url);
return $result;
/*
注意:在静态图API那个页面中有如何在模板中展示地图的代码
<img style="margin:20px" width="280" height="140" src="" />只需要将这个src的地址修改一下
那么现在我们在controller/index.php中测试一下
*/
}
在extra/map.php中再添加下边三个参数
'width' => 400,
'height' => 300,
'staticimage' => 'staticimage/v2',
- 1
- 2
- 3
在controller/index.php中添加一个test()函数
public function test(){
return \Map::staticimage('北京昌平沙河地铁');
//那么现在我们在任意一个模板中调用一下
}
然后就是在你需要用到百度地图的模板中加入下边这行代码
<img style="margin:20px" width="280" height="140" src="填写你的url地址" />
- 1
我这里是<img style="margin:20px" width="280" height="140" src="{:url('index/test')}" />
3, 测试结果
到这里我们TP5.0封装百度地图就完成了
**大家如果想扩展功能,都可以在“静态图API”页面中调用不同的参数来实现更多的功能