Android之百度地图集成
Android之百度地图集成
注册和获取密钥
注册百度账号
注册链接:点击进行百度账号注册
创建应用
1.应用名称
2.应用类型(Android SDK)
3.发布版SHA1(详见:)
4.包名 (AndroidManifest.xml文件中)
5.提交生成AK
下载开发包并进行配置
1.开发包下载链接:点击下载开发包
2.解压下载的压缩包
3.复制libs文件夹下的所有文件至项目libs文件夹下,并将jar包添加到应用中。
4.build.gradle文件中说明so的路径为该libs路径,关联所有地图SDK的so文件
android {sourceSets {main {jniLibs.srcDir 'libs'//说明so的路径为该libs路径,关联所有地图SDK的so文件}}
}
5.AndroidManifest.xml中加入相关配置及权限。
<meta-data
android:name="com.baidu.lbsapi.API_KEY"android:value="创建应用后得到的AppKey" /><service
android:name="com.baidu.location.f"android:enabled="true"android:process=":remote" />
使用
1.创建地图
- xml文件中添加地图组件
<com.baidu.mapapi.map.TextureMapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true" />
- 代码中获取地图组件,并设置地图显示图层
//获取地图控件引用mMapView = (TextureMapView) findViewById(R.id.bmapView);//获取地图控制器对象mBaiduMap = mMapView.getMap();// 设置地图图层mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); // 默认地图(2D,3D ),还有卫星地图(BaiduMap.MAP_TYPE_SATELLITE),空白地图(BaiduMap.MAP_TYPE_NONE)
- 显示定位
// 定位参数配置option = new LocationClientOption();option.setOpenGps(true); // 打开gpsoption.setCoorType("bd09ll"); // 设置坐标类型option.setScanSpan(1000); // 定位次数option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备option.setIsNeedAddress(true);// 可选,设置是否需要地址信息,默认不需要option.setIsNeedLocationPoiList(true);// 可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到// 开启定位图层mBaiduMap.setMyLocationEnabled(true);// 自定义定位图标mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);// 自定义精度圈填充颜色int accuracyCircleFillColor = 0x556EE1F4;//自定义精度圈填充颜色// 自定义精度圈边框颜色int accuracyCircleStrokeColor = 0xFF116DDD;//自定义精度圈边框颜色// 定位图层的配置(定位模式,是否允许方向信息,用户自定义定位图标)MyLocationConfiguration myLocationConfiguration = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker,accuracyCircleFillColor, accuracyCircleStrokeColor);//打开室内图,默认为关闭状态mBaiduMap.setIndoorEnable(true);// 设定定位图层配置mBaiduMap.setMyLocationConfiguration(myLocationConfiguration);// // 当不需要定位图层时关闭定位图层
// mBaiduMap.setMyLocationEnabled(false);// // 设置定位跟随状态(使用默认图标)
// mBaiduMap.setMyLocationConfigeration(
// new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, mCurrentMarker));// 定位初始化mLocClient = new LocationClient(this);// 定位监听MyLocationListener myLocListener = new MyLocationListener();// 定位监听mLocClient.registerLocationListener(myLocListener);// 设置定位参数mLocClient.setLocOption(option);// 开启定位mLocClient.start();/*** 定位SDK监听函数*/public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {// map view 销毁后不在处理新接收的位置if (location == null || mMapView == null) {return;}// 此处设置开发者获取到的方向信息,顺时针0-360MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())// 此处设置开发者获取到的方向信息,顺时针0-360.direction(100).latitude(location.getLatitude()).longitude(location.getLongitude()).build();// 设置定位数据mBaiduMap.setMyLocationData(locData);if (isFirstLoc) {isFirstLoc = false;// 经纬度获取latitude = location.getLatitude();longitude = location.getLongitude();// 移动定位图标至定位点上latLngLocation = new LatLng(latitude, longitude);builder = new MapStatus.Builder();builder.target(latLngLocation).zoom(18.0f);mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));Toast.makeText(MainActivity.this, "当前所在位置:" + location.getAddrStr(), Toast.LENGTH_LONG).show();tvAtvtMainHeatingPower.setText(location.getCity());}}}
2.与地图交互
- 地图单击事件
// TODO: 2018/3/27 0027 地图单击事件 mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {/*** 地图单击事件回调函数* @param point 点击的地理坐标*/public void onMapClick(LatLng point) {Log.e("onMapClick", "获取到点击坐标 = " + point);}/*** 地图内 Poi 单击事件回调函数* @param poi 点击的 poi 信息*/public boolean onMapPoiClick(MapPoi poi) {Log.e("onMapPoiClick", " 地图poi的信息 name = " + poi.getName()+ " uid = " + poi.getUid() + " latlng = " + poi.getPosition());return true;}});
- 地图长按事件
// TODO: 2018/3/27 0027 地图长按事件 mBaiduMap.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {@Overridepublic void onMapLongClick(LatLng latLng) {Log.e("onMapLongClick", "长按事件 latLng = " + latLng);}});
- 地图定位点点击事件
// TODO: 2018/3/27 0027 地图定位点点击事件mBaiduMap.setOnMyLocationClickListener(new BaiduMap.OnMyLocationClickListener() {/*** 地图定位图标点击事件监听函数*/public boolean onMyLocationClick() {Log.e("onMyLocationClick", "定位图标点击事件");return false;}});
- 地图覆盖物点击事件
// TODO: 2018/3/27 0027 覆盖物单击事件 mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {/*** 地图 Marker 覆盖物点击事件监听函数* @param marker 被点击的 marker*/public boolean onMarkerClick(Marker marker) {Log.e("onMarkerClick", "覆盖物点击事件监听 = " + marker);return false;}});
- 地图覆盖物拖拽事件
// TODO: 2018/3/27 0027 地图上覆盖物拖拽的监听 mBaiduMap.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() {public void onMarkerDrag(Marker marker) {//拖拽中Log.e("onMarkerDrag", "拖拽中 marker = " + marker);}public void onMarkerDragEnd(Marker marker) {//拖拽结束Log.e("onMarkerDragEnd", "拖拽结束 marker = " + marker);}public void onMarkerDragStart(Marker marker) {//开始拖拽Log.e("onMarkerDragStart", "开始拖拽 marker = " + marker);}});
- 地图触摸事件
// TODO: 2018/3/27 0027 地图触摸事件 mBaiduMap.setOnMapTouchListener(new BaiduMap.OnMapTouchListener() {/*** 当用户触摸地图时回调函数* @param event 触摸事件*/public void onTouch(MotionEvent event) {Log.e("onTouch","触摸事件 event = " + event );}});
- 地图滑动事件
// TODO: 2018/3/27 0027 地图滑动监听 mBaiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {@Overridepublic void onMapStatusChangeStart(MapStatus mapStatus) {}@Overridepublic void onMapStatusChangeStart(MapStatus mapStatus, int i) {Log.e("onMapStatusChangeStart","地图滑动开始 + 2 mapStatus = " + mapStatus + " i = " + i);}@Overridepublic void onMapStatusChange(MapStatus mapStatus) {Log.e("onMapStatusChange","地图滑动中 mapStatus = " + mapStatus );}@Overridepublic void onMapStatusChangeFinish(MapStatus mapStatus) {Log.e("onMapStatusChangeFinish","地图滑动完成 mapStatus = " + mapStatus );}});
3.在地图上绘制
- 绘制线
// TODO: 2018/3/27 0027 绘制多段线 //构建折线点坐标LatLng p1 = new LatLng(39.97923, 116.357428);LatLng p2 = new LatLng(36.94923, 113.397428);LatLng p3 = new LatLng(33.97923, 119.437428);List<LatLng> points = new ArrayList<LatLng>();points.add(p1);points.add(p2);points.add(p3);//绘制折线OverlayOptions ooPolyline = new PolylineOptions().width(10).color(0xAAFF0000).points(points);Polyline mPolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline);// mPolyline.setDottedLine(true); //设置是否虚线绘制// TODO: 2018/3/27 0027 绘制多段分色线 // 构造折线点坐标List<LatLng> pointss = new ArrayList<LatLng>();pointss.add(new LatLng(39.965, 116.404));pointss.add(new LatLng(39.925, 116.454));pointss.add(new LatLng(39.955, 116.494));pointss.add(new LatLng(39.905, 116.554));pointss.add(new LatLng(39.965, 116.604));//构建分段颜色索引数组List<Integer> colors = new ArrayList<>();colors.add(Integer.valueOf(Color.BLUE));colors.add(Integer.valueOf(Color.RED));colors.add(Integer.valueOf(Color.YELLOW));colors.add(Integer.valueOf(Color.GREEN));OverlayOptions oooPolyline = new PolylineOptions().width(10).colorsValues(colors).points(pointss);// 添加在地图中mPolyline = (Polyline) mBaiduMap.addOverlay(oooPolyline);
- 绘制面
// TODO: 2018/3/27 0027 绘制圆 LatLng llCircle = new LatLng(39.90923, 116.447428);Stroke stroke = new Stroke(5, 0xAA000000);OverlayOptions ooCircle = new CircleOptions().fillColor(0x000000FF).center(llCircle).stroke(stroke).radius(1400);// 设置颜色和透明度,均使用16进制显示,0xAARRGGBB,如 0xAA000000 其中AA是透明度,000000为颜色mBaiduMap.addOverlay(ooCircle);// TODO: 2018/3/27 0027 绘制多边形 //定义多边形的五个顶点LatLng pt1 = new LatLng(39.93923, 116.357428);LatLng pt2 = new LatLng(39.91923, 116.327428);LatLng pt3 = new LatLng(39.89923, 116.347428);LatLng pt4 = new LatLng(39.89923, 116.367428);LatLng pt5 = new LatLng(39.91923, 116.387428);List<LatLng> pts = new ArrayList<LatLng>();pts.add(pt1);pts.add(pt2);pts.add(pt3);pts.add(pt4);pts.add(pt5);//构建用户绘制多边形的Option对象OverlayOptions polygonOption = new PolygonOptions().points(pts).stroke(new Stroke(5, 0xAA00FF00)).fillColor(0xAAFFFF00);//在地图上添加多边形Option,用于显示mBaiduMap.addOverlay(polygonOption);
- 绘制文字
//定义文字所显示的坐标点LatLng llText = new LatLng(39.86923, 116.397428);//构建文字Option对象,用于在地图上添加文字OverlayOptions textOption = new TextOptions().bgColor(0xAAFFFF00) // 背景色.fontSize(24) // 文字大小.fontColor(0xFFFF00FF) // 文字颜色.text("绘制文字") // 文字内容.rotate(-30) // 文字旋转角度.position(llText); // 文字显示位置//在地图上添加该文字对象并显示mBaiduMap.addOverlay(textOption);
4.检索地图数据
// 地图poi检索配置private void poiSearchSet(){// 1.创建POI检索实例mPoiSearch = PoiSearch.newInstance();// 初始化建议搜索模块,注册建议搜索事件监听mSuggestionSearch = SuggestionSearch.newInstance();// 2.创建POI检索监听者;//获取POI检索结果//获取Place详情页检索结果poiListener = new OnGetPoiSearchResultListener() {@Overridepublic void onGetPoiResult(PoiResult poiResult) {//获取POI检索结果Log.e("onGetPoiResult", "POI检索结果 poiResult = " + poiResult);List<PoiInfo> poiInfoList = poiResult.getAllPoi();Log.e("onGetPoiResult", "POI检索结果 poiInfoList = " + poiInfoList);if (poiInfoList != null && poiInfoList.size() > 0) {PoiInfo poiinfo = poiInfoList.get(0);Log.e("onGetPoiResult", "POI检索结果 describeContents = " + poiinfo.describeContents() +" name = " + poiinfo.name + " address = " + poiinfo.address + " city = " + poiinfo.city + " " +" phoneNum = " + poiinfo.phoneNum + " postCode = " + poiinfo.postCode + " uid = " + poiinfo.uid +" hasCaterDetails = " + poiinfo.hasCaterDetails + " isPano = " + poiinfo.isPano + " location = " + poiinfo.location +" type = " + poiinfo.type + " ");for (int i = 0; i < poiInfoList.size(); i++) {PoiInfo poiInfo = (PoiInfo) poiInfoList.get(i);Log.e("poiInfo ", " poiInfo = " + poiInfo.address + " " + poiInfo.name);}}List<PoiAddrInfo> poiAddrInfoList = poiResult.getAllAddr();Log.e("onGetPoiResult", "POI检索结果 poiAddrInfoList = " + poiAddrInfoList);if (poiAddrInfoList != null && poiAddrInfoList.size() > 0) {for (int i = 0; i < poiAddrInfoList.size(); i++) {PoiAddrInfo poiAddrInfo = poiAddrInfoList.get(i);Log.e("onGetPoiResult", "POI检索结果 location = " + poiAddrInfo.location +" name = " + poiAddrInfo.name +" address = " + poiAddrInfo.name );}}List<CityInfo> suggestCityList = poiResult.getSuggestCityList();Log.e("onGetPoiResult", "POI检索结果 suggestCityList = " + suggestCityList);if (suggestCityList != null && suggestCityList.size() > 0) {for (int i = 0; i < suggestCityList.size(); i++) {CityInfo cityInfo = suggestCityList.get(i);Log.e("onGetPoiResult", "POI检索结果 describeContents = " + cityInfo.describeContents() +" num = " + cityInfo.num +" city = " + cityInfo.city );}}}@Overridepublic void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {//获取Place详情页检索结果Log.e("onGetPoiDetailResult", "Place详情页检索结果 poiDetailResult = " + poiDetailResult.toString());}@Overridepublic void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {Log.e("onGetPoiIndoorResult", "Indoor POI检索结果 poiIndoorResult = " + poiIndoorResult.toString());List<PoiIndoorInfo> poiIndoorInfoList = poiIndoorResult.getmArrayPoiInfo();if (poiIndoorInfoList != null && poiIndoorInfoList.size() > 0) {for (int i = 0; i < poiIndoorInfoList.size(); i++) {PoiIndoorInfo poiIndoorInfo = (PoiIndoorInfo) poiIndoorInfoList.get(i);Log.e("onGetPoiResult", "POI检索结果 describeContents = " + poiIndoorInfo.latLng +" name = " + poiIndoorInfo.name + " address = " + poiIndoorInfo.address +" bid = " + poiIndoorInfo.bid + " " + " uid = " + poiIndoorInfo.uid +" cid = " + poiIndoorInfo.cid + " floor = " + poiIndoorInfo.floor +" tag = " + poiIndoorInfo.tag + " isGroup = " + poiIndoorInfo.isGroup +" discount = " + poiIndoorInfo.discount + " groupNum = " + poiIndoorInfo.groupNum +" phone = " + poiIndoorInfo.phone + " floor = " + poiIndoorInfo.floor +" isTakeOut = " + poiIndoorInfo.isTakeOut + " isWaited = " + poiIndoorInfo.isWaited +" price = " + poiIndoorInfo.price + " starLevel = " + poiIndoorInfo.starLevel );}}}};OnGetSuggestionResultListener onGetSuggestionResultListener = new OnGetSuggestionResultListener() {@Overridepublic void onGetSuggestionResult(SuggestionResult suggestionResult) {}};// 3.设置POI检索监听者;mPoiSearch.setOnGetPoiSearchResultListener(poiListener);mSuggestionSearch.setOnGetSuggestionResultListener(onGetSuggestionResultListener);}// 条件搜索private void poiConditionSearch() {// 4.发起检索请求;if (!TextUtils.isEmpty(etAtvtMainCity.getText().toString().trim()) && !TextUtils.isEmpty(etAtvtMainText.getText().toString().trim())) {mPoiSearch.searchInCity((new PoiCitySearchOption()).city(etAtvtMainCity.getText().toString().trim()).keyword(etAtvtMainText.getText().toString().trim()).pageNum(10));/*** 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新*/mSuggestionSearch.requestSuggestion((new SuggestionSearchOption()).keyword(etAtvtMainText.getText().toString()) // 搜索关键字.city(etAtvtMainCity.getText().toString())); // 搜索城市}}// 周边搜索private void poiAmbitusSearch() {// 4.发起检索请求;if (!TextUtils.isEmpty(etAtvtMainCity.getText().toString().trim()) && !TextUtils.isEmpty(etAtvtMainText.getText().toString().trim())) {LatLng center = new LatLng(34.29923570837169, 108.95409189492081);mPoiSearch.searchNearby(new PoiNearbySearchOption().keyword(etAtvtMainText.getText().toString().trim()).sortType(PoiSortType.distance_from_near_to_far).location(center).radius(100).pageNum(10));}}// 矩形搜索private void poiRectangleSearch() {// 4.发起检索请求;LatLng southwest = new LatLng( 39.92235, 116.380338 );LatLng northeast = new LatLng( 39.947246, 116.414977);LatLngBounds searchbound = new LatLngBounds.Builder().include(southwest).include(northeast).build();mPoiSearch.searchInBound(new PoiBoundSearchOption().bound(searchbound).keyword("餐厅"));}
5.工具
计算两点之间的直线距离(单位:米):
DistanceUtil. getDistance(p1, p2);
代码已上传至:github ,欢迎指正修改。
Android之百度地图集成相关推荐
- linux 百度地图离线sdk,Android开放百度地图集成
1.创建应用 获取AK (我理解为Application key) 通过百度账号登录百度地图开放平台,进入API控制台 http://lbsyun.baidu.com/apiconsole/key 创 ...
- 基于Android的百度地图开发
参考资料: android studio获得SHA1的值,然后在百度地图移动版API官网申请key Android Studio怎么查看程序的安全码获取SHA1值? http://www.codese ...
- 百度地图集成(一):百度地图简单实现
百度地图集成概要 百度地图集成(一):百度地图简单实现 百度地图集成(二):百度定位以及反编译地理位置 百度地图集成(三):检索功能的实现 百度地图集成(四):零散 百度地图集成第一篇: 百度地图简单 ...
- 用android studio测量距离,Android studio 百度地图开发(6)Marker绑定事件、计算两点距离...
Android studio 百度地图开发(6)Marker绑定事件.计算两点距离 email:chentravelling@163.com 开发环境:win7 64位,Android Studio, ...
- android 百度地图闪退,Android使用百度地图出现闪退及定位时显示蓝屏问题的解决方法...
使用百度地图出现闪退 一般情况下出现闪退是在AndroidManifest.xml文件中未在application标签中配置 android:name="com.baidu.lbsapi.A ...
- Android studio 百度地图SDK之地图定位与运动轨迹绘制
百度地图定位与运动轨迹 Android开发的前期准备 地图图层显示与定位 运动轨迹的简单绘制 Android开发的前期准备 Android配置在百度地图SDK官网上有详细的说明.具体可以参考官网的教程 ...
- Android开发——百度地图定位
Android开发--百度地图定位 项目需求 项目内容 注册和获取秘钥 获取项目SHA1码 获取项目AK码 AS依赖配置 AS源码 AndroidManifest文件 布局文件 DemoApplica ...
- Android studio 百度地图开发(5)查询周边服务(加油站)
Android studio 百度地图开发(5)查询周边服务(加油站) email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是An ...
- qt for android开发百度地图(一步步带图详解)
qt for android开发百度地图 前言:qt for android开发百度地图,其实找了很多资料,基本上没有,就自己折磨弄了出来,这个过程还是很曲折的,折磨了一两个星期,没有资料,就两个字' ...
最新文章
- python pipe stdout 实现cat|grep 功能
- 教你从0到1搭建秒杀系统-防超卖
- 显示一个屏幕,隐藏其他屏幕
- 原生ajax如何执行,原生ajax调用数据实例讲解
- 使用ASM 4处理Java类文件–第一部分:世界,您好!
- c语言代码测试电脑性能,【图片】今天写几个性能测试,为什么C语言跑得这么慢呢??【c语言吧】_百度贴吧...
- Oracle 10g、11g :RAC关闭、启动、重启步骤
- nodejs路由信息
- python 表名代码编码格式_14行代码示例讲解:教你解决python上传图片限制格式问题...
- 《数据结构》陈越课件重点总结
- Nuget如何管理本地的包
- 机器学习笔记--基本概念
- activiti6教程四
- Python资源索引 【转载】
- yylabel支持html ios,iOS简单高性能标签TagView(巧用YYLabel)
- mPaaS客户端基线升级踩坑先升到10.1.32再升到10.1.60(iOS)
- word中图片为嵌入式格式时显示不全_word嵌入图片显示不全-不同类型文档中图片设置的几个小技巧...
- python中的函数及面向对象的知识点
- html5如何实现无序排列,无序列表让li横排
- c语言职工工资信息表,C语言职工工资理系统.doc
热门文章
- java 自定义注解以及注解的实现原理
- 数据仓库——数据仓库架构、维度数据建模、雪花模型和星型模型
- aix mysql启动_aix mysql | 学步园
- RAPIDIO(SRIO)动态调节速率设计方案
- oracle查询数据泵状态,PLSQL_数据泵导入进度查看Impdp/Expdp Status(案例)
- 技术员教你如何在PE下重装系统(包含win10和win7)
- 阿里数学竞赛决赛名单公布:北大人数是清华4倍 | 最小仅14岁
- matlab导入las格式点云,LAS 点云数据格式
- SSRF漏洞JAVA解决方案
- 透射电镜测试样品的制备要求和方法