百度地图_api
这一天主要讲的是百度地图api的使用,由于百度有很详细的开发文档了,所以我这里只做一个大概的笔记
百度地图API的使用
1,入门
1.1,三大核心
①SDKInitializer 整个百度的初始化工具类,引擎
②MapView 用来显示地图的控件
③baiduMap 相当于控制器,缩放,旋转,移动
1.2,准备工作(到百度地图LBS开放平台上查看)
获取API Key,按网上的帮助文档走步骤
获取SHA1码
百度地图的Key和应用是相互绑定的,一个Key对应一个应用.
1.3,创建工程拷贝jar包
拷贝的时候注意要拷贝文件夹,这个jar包必须用arme处理器的模拟器和手机
X86的手机这个应用是跑不起来的(百度限定的,无法解决)
V7a的运算速度比不带V7a的速度要快一些,手机会自动匹配
添加权限 ,拷贝对应的权限文件即可.
1.4 使用步骤(下载的依赖包中有帮助文档):
①布局文件添加MapView百度的自定义控件.
额外:两套jar包,可以只留下一个不带v7a的包,运行速度会快一些
报错: have not supplyed the global app context info from SDKInitializer.........(没有对百度引擎进行初始化,需要校验一下上面申请的api key)
//不知道怎么搜搜就百度查找一下
>>>Android SHA1与Package获取方式
keytool -list -v -keystore debug.keystore
②清单文件中,Application 中的创建子标签<meta-data,name,value(key)/>
③在使用Map的 activity中,
调用sdkInitializer.initialize(getApplication(必须全局的context))
这里的返回结果是通过广播来实现了,所以要写一个广播接收者来判断结果
//通过接收到的广播intent.getAction的值来判断结果(无网络,校验失败等)
代码注册的时候通过sdkInitializer.XXXX可以设定意图过滤器的action
1.5缩放级别,设置中心点
缩放级别的设置:
①缩放级别是3-19(V2.X以前是3-18)的.
2.x与1.x的区别
修改了地图文件的格式,1.x的地图采用栅格版,2.x的地图采用矢量版,优化了数据
例如:北京地图110M>>>15M
增加了一个级别(18>>19带有3D效果)
②baiduMap控制器:管理具体的某一个MapView:选择,缩放,移动
BaiduMap baiduMap = mapView.getMap();//根据mapView控件的对象找到控制器
baiduMap.setMapStatus(MapStatusUpdate)//改变当前地图状态
//设置缩放到15级,百度地图默认12级
MapStatusUpdate update = MapStatusUpdateFactory.zoomTo(15);
③设置中心点:默认是天安门
baiduMap.setMapStatus(MapStatusUpdate)
MapStatusUpdate update = MapStatusUpdateFactory.newLateLng(latlng)
LatLng latlng =new LatLng(经度,维度);//百度地图使用的是经纬度
2,三个核心类(MVC)
2.1 SDKInitializer中有两个方法
①初始化全局,②初始化全局并指定存储的位置
2.2 MapView 显示地图的视图,必须按照它的生命周期进行操控.
①必须绑定Activity的生命周期,不然最小化再返回来的话可能会出BUG
②onResume(),onPause(),onDestory()与activity对应的生命周期方法进行绑定.
它是继承ViewGroup的,有ViewGroup的方法.
可以指定比例尺控件的位置,设置缩放控件的位置,是否显示比例尺,缩放控件等,查看API即可.
2.3 BaiduMap
① 有一堆接口进行回调,监听地图的各种事件
②方法:加载热地图,更新地图状态(带动画的,可以指定动画的耗时)等,查看API即可..
③主要操作:
缩放级别:baiduMap.setMapStatus(mapStatus(通过工厂指定返回的对象信息,增加减少缩放级别))
旋转:以自身为中心,顺时针旋转.
以XYZ轴的3D立体图(俯视,仰视的旋转,本质是以一条坐标轴进行旋转);
//以一个点为中心进行旋转
Mapstatus = baiduMap.getMapStatus()//拿到当前地图状态
Float rotate = mapstatus.rotate;//拿到地图的旋转角度
//更新旋转角度
baiduMap.setMapStatus(rotateMapstatu);
MapStatusUpdate rotateMapstatu = MapStatusUpdateFactory.newMapStatus(rotateStatus)
MapStatus rotateStatus = new MapStatus.builder().rotate(0-360°).build();
//以一条直线为轴旋转(OverLooking)
Mapstatus = baiduMap.getMapStatus()//拿到当前地图状态
Mapstatus.overlook//0~45°
更新轴旋转与点旋转的效果类似.
//移动,类似参考设置中心点(带动画就有过程,不带过程就是直接跳过去的)
baiduMap.animateMapStatus(通过工厂.new Latlang(纬度,经度));
3,百度地图入门总结:
三大核心类的使用
获取APIKEY,获取SHA1值:通过DOS命令,通过Eclipse
拷贝JAR包和权限,X86处理器不能使用.
加载MapView控件,记得进行初始化操作,校验key(在setContentView(view)之前调用)
在清单文件中配置百度地图APIKEY节点
控制管理:缩放比例,中心位置,移动,旋转角度,
指南针的设置:UiSettings().setCompassEnabled(false)//设置不可见
Uisettings()可以通过BaiduMap.getUiSettings()//获取
也可以更换位置,查看API即可.
处理地图事件:baiduMap核心类的各种事件监听器(双击,截图,覆盖物,单击等).
4,百度地图的加强(地图图层,覆盖物,搜索,离线地图)
4.1 地图图层
分类:底图(显示基本的地图信息),实时交通信息图,卫星图(真实的地理面貌)
4.1.1 地图图层实现步骤(底图,交通图,卫星图)
①校验key(如果不关心返回广播可以不接收广播),初始化,获取baiduMap,绑定生命周期
②设置3个键位:onKeyDown(int keyCode,KeyEvent event)//也可以用按钮设置
//切换图层:
baiduMap.setMapType(BaiduMap.xxxx) //设置对应的图层即可.卫星图,普通图
baiduMap.setTrafficEnadbled(true)//设置交通图
4.2 覆盖物-绘制图(地图上的一切叠加或覆盖到地图的内容(如路线))
OverlayOptions基类,这个基类并没有公开的方法,它代表都操作同一个地图.
1,创建自己的覆盖物
2,给覆盖物设置数据(不同覆盖物的数据设置)
3,添加覆盖物
4.2.1 覆盖物Demo示例
创建BaseActivity把所有地图的基本信息加载(校验key,绑定生命周期,获取baiduMap等)进去,不然每个小Demo都要再写一次.
CircleOptionsDemo//圆形覆盖物,名字随意
①绘制圆的条件:绘制圆,圆心+半径,是否填充+颜色+如果不填充 圆边框粗细,样式
②执行步骤:
创建自己的对象
CircleOptions circleoptions = new CircleOptions();
设置数据;
Circleoptions.center(hmPos)//设置圆心,返回当前对象,可以用链式编程.
.radius(1000)//半径,单位米.
.fillColor(0x00(透明度)00(红)00(绿)00(蓝))//设置颜色16进制,透明度,红绿蓝
.stroke(new Stroke(5(宽度),颜色))//设置边框
添加到地图中:
baiduMap.addOverlay(circleoptions);//只有当这个圆能完全显示的时候才会完整显示圆.
TextOptionsDemo
①创建对象TextOptions.
②设置数据,按API上的方法,设置自己想要设置的效果即可.
安卓下的字体:三种对称的,非对称的,等宽的(不满意的话可以自定义)
③添加到地图中baiduMap.addOverlay(textOptions)
MarkerOptions(类似与一种标注,如周边的超市,银行,订钉子,显示同一类型的东西)
①创建对象
②设置数据:设置刷新时间,图标(或图标集合可以用来切换)等
Marker.icon(BitmapDescriptor)//设置显示的图片
通过BitmapDescriptorFactory 可以通过获取各种位置的资源反馈对象(SD卡,ID都可以获得)
③添加到地图中baiduMap.addOverlay(markeroptions);
//可以添加多个markeroptions标记,因为可能会需要插入多个标记
//再new一次MarkerOptions对象,重复操作即可.(坐标不一样)
icons(BitMapDescriptor的集合)//可以设置多个图片,会自动切换,也有方法可以设置间隔.
.draggable(true)//可以拖动
泡泡显示:需求:点击覆盖物时,弹出泡泡
实现步骤①预加载pop,设置为隐藏
②点击的时候,更新位置,设置为显示
这样用户体验更好.
mapView.addView(pop的布局文件,params)
这里的params是MapViewLayoutParams.builder()//通过百度提供的参数类的方法获取参数.
.layoutMode(MapViewXXX.ElayoutMode.mapMode)//设置模式,经纬度或是地图模式
//地图模式会随着地图移动而移动,经纬度会固定位置
.position(hmpos)//设置位置,不能为null
.width(MapViewXXX.WRAP_CONTENT).height(XXXXX)//设置宽高
.build();
//设置点击事件
baiduMap.setOnMarkerClickListener();可以通过重写方法的参数获取坐标
BUG:如果在地图上有一个marker设置了多个图片,就有可能把泡泡抢走
泡泡的位置也有方法可以设置偏移量(Y轴向上是负数,向下是正数).
其它覆盖物:略,使用到时候直接查看百度的帮助文档即可(中文的,容易理解)
4.2.2 搜索覆盖物
一,搜索服务的核心类分两类
①位置搜索,周边搜索,范围搜索
②公交检索,驾乘检索,步行检索
它们响应的结果:OverlayManager(搜索覆盖物的核心类)
POI(Poing of Interest兴趣点)
根据范围和检索词发起范围检索
周边检索
城市poi检索
Poi详细信息检索
结果的展示:PoiOverlay
示例:矩形范围内搜索,关键类:
PoiSearch poiSearch = PoiSearch.newInstance();//获取发起POI搜索请求的对象
poiSearch.setOnGetPoiSearchResultListener(new XXX)
poiSerarch.searchInBound(new xxx)//发起请求的方法
这个XXX是用来设置参数,new出来查看API即可,每页容量,分页编号等
需要什么参数就new什么参数,再查看帮助文档找到需要的方法即可.
//因为百度地图的使用主要是API接口的调用,所以就不做详细笔记了,大部分功能查看百度提供的开发者文档就能使用了,有需要特别标注的会做下笔记.
特别标注:
第一次点击矩形范围搜索没有出现数据,第二次才出来:
检验KEY和发起搜索请求的代码两者是异步的,可能会出现检验KEY未完成,就发起请求的情况.
范围内搜索,并不是只搜索范围内的被搜索物,而是以这个范围内的被搜索物为中心进行搜索.
需要返回结果就需要自己去写一个类继承PoiOverlay,重写onPoiClick()方法
在这个方法里创建PoiReuslt对象,poiResult.getAllPoi()//获取返回来的所有POI,通过方法上的参数可以获得用户具体点击的PoiInfo
PoiNearBy周边搜索,步骤都类似,不过它检索的是一个圆形.
周边搜索只搜索圆心以内的数据
城市内检索,步骤类似poiSearch.searchInCity(xxx);
//需要设置城市
//设置分页信息
不希望两页信息相互叠加,每次清空之前的数据baiduMap.clear()//清除上一次的数据
详情检索:poiSearch.searchPoiDetail(PoiDetailSearchOption option)
设置uid option.poiuid(poiInfo.uid)
驾车路线的结果处理
①创建覆盖物,它有自己的覆盖物DrivingRouteOverlay
②设置数据setData(result.getRouteLines().get(0)//如果有多条数据就选第0条);
③添加到数据overlay.addToMap();
overlay.zommToSpan();//全部显示在屏幕中
驾车路线更改图标和添加途径点
Options.passBy(nodes);//nodes就是途经界面的集合
创建类继承DrivingRouteOverlay,重写两个方法就可以修改图标
公交换乘的其它内容:
地址解析服务GeoCoder.XXX(可以根据地址名或地理坐标点获取地址信息)
公交信息的详细检索通过poiInfo.uid(可以根据Type来判断是否是公交兴趣点,然后传给另外一个方法poiSearchInCity查询公交线路详细信息)
联想词检索:把联想词发给服务器,服务器会返回对应的联想词汇
离线地图:下载百度提供的地图包,不同版本放在不同的SD卡目录下,最后需要一系列方法进行load.
5.定位(GPS定位,基站定位(cellid,loc),WIFI定位(mac地址,通过GPS或基站定位的信息上传到百度服务器中,以后就可以直接通过该路由器的mac地址获取定位信息,国内百度做的比较好)):
获取的经纬度是在火星坐标的基础上再次进行加密的(在别的地图应用上就可能不准确了)
定位信息在离线帮助文档找不到,在线的才能看到
拷贝在线文档中的示例代码,该改的改,该复制的复制
定位模式:①高精度的 网络定位和GPS定位都使用
②低功耗的,不使用GPS
③仅使用设备定位模式,不需要连接网络,只使用GPS定位,不支持室内环境
baiduMap中setMyLocationData(MyLocationData data)//设置定位数据,参考帮助文档
//注意开始定位之后要及时停掉(失去焦点就停掉)
定位的时候把焦点移动到定位的位置