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之百度地图集成相关推荐

  1. linux 百度地图离线sdk,Android开放百度地图集成

    1.创建应用 获取AK (我理解为Application key) 通过百度账号登录百度地图开放平台,进入API控制台 http://lbsyun.baidu.com/apiconsole/key 创 ...

  2. 基于Android的百度地图开发

    参考资料: android studio获得SHA1的值,然后在百度地图移动版API官网申请key Android Studio怎么查看程序的安全码获取SHA1值? http://www.codese ...

  3. 百度地图集成(一):百度地图简单实现

    百度地图集成概要 百度地图集成(一):百度地图简单实现 百度地图集成(二):百度定位以及反编译地理位置 百度地图集成(三):检索功能的实现 百度地图集成(四):零散 百度地图集成第一篇: 百度地图简单 ...

  4. 用android studio测量距离,Android studio 百度地图开发(6)Marker绑定事件、计算两点距离...

    Android studio 百度地图开发(6)Marker绑定事件.计算两点距离 email:chentravelling@163.com 开发环境:win7 64位,Android Studio, ...

  5. android 百度地图闪退,Android使用百度地图出现闪退及定位时显示蓝屏问题的解决方法...

    使用百度地图出现闪退 一般情况下出现闪退是在AndroidManifest.xml文件中未在application标签中配置 android:name="com.baidu.lbsapi.A ...

  6. Android studio 百度地图SDK之地图定位与运动轨迹绘制

    百度地图定位与运动轨迹 Android开发的前期准备 地图图层显示与定位 运动轨迹的简单绘制 Android开发的前期准备 Android配置在百度地图SDK官网上有详细的说明.具体可以参考官网的教程 ...

  7. Android开发——百度地图定位

    Android开发--百度地图定位 项目需求 项目内容 注册和获取秘钥 获取项目SHA1码 获取项目AK码 AS依赖配置 AS源码 AndroidManifest文件 布局文件 DemoApplica ...

  8. Android studio 百度地图开发(5)查询周边服务(加油站)

    Android studio 百度地图开发(5)查询周边服务(加油站) email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是An ...

  9. qt for android开发百度地图(一步步带图详解)

    qt for android开发百度地图 前言:qt for android开发百度地图,其实找了很多资料,基本上没有,就自己折磨弄了出来,这个过程还是很曲折的,折磨了一两个星期,没有资料,就两个字' ...

最新文章

  1. python pipe stdout 实现cat|grep 功能
  2. 教你从0到1搭建秒杀系统-防超卖
  3. 显示一个屏幕,隐藏其他屏幕
  4. 原生ajax如何执行,原生ajax调用数据实例讲解
  5. 使用ASM 4处理Java类文件–第一部分:世界,您好!
  6. c语言代码测试电脑性能,【图片】今天写几个性能测试,为什么C语言跑得这么慢呢??【c语言吧】_百度贴吧...
  7. Oracle 10g、11g :RAC关闭、启动、重启步骤
  8. nodejs路由信息
  9. python 表名代码编码格式_14行代码示例讲解:教你解决python上传图片限制格式问题...
  10. 《数据结构》陈越课件重点总结
  11. Nuget如何管理本地的包
  12. 机器学习笔记--基本概念
  13. activiti6教程四
  14. Python资源索引 【转载】
  15. yylabel支持html ios,iOS简单高性能标签TagView(巧用YYLabel)
  16. mPaaS客户端基线升级踩坑先升到10.1.32再升到10.1.60(iOS)
  17. word中图片为嵌入式格式时显示不全_word嵌入图片显示不全-不同类型文档中图片设置的几个小技巧...
  18. python中的函数及面向对象的知识点
  19. html5如何实现无序排列,无序列表让li横排
  20. c语言职工工资信息表,C语言职工工资理系统.doc

热门文章

  1. java 自定义注解以及注解的实现原理
  2. 数据仓库——数据仓库架构、维度数据建模、雪花模型和星型模型
  3. aix mysql启动_aix mysql | 学步园
  4. RAPIDIO(SRIO)动态调节速率设计方案
  5. oracle查询数据泵状态,PLSQL_数据泵导入进度查看Impdp/Expdp Status(案例)
  6. 技术员教你如何在PE下重装系统(包含win10和win7)
  7. 阿里数学竞赛决赛名单公布:北大人数是清华4倍 | 最小仅14岁
  8. matlab导入las格式点云,LAS 点云数据格式
  9. SSRF漏洞JAVA解决方案
  10. 透射电镜测试样品的制备要求和方法