中山大学数据科学与计算机学院本科生实验报告

(2018年秋季学期)

项目源码:Github传送门


第十七周任务

一、实验题目

地图

第十七周实验目的

  1. 接入百度地图API
  2. 掌握少量的百度地图API接口

二、实现内容

基于之前的应用,初始界面仍为摇一摇

跳转后的界面为百度地图 地图定位在目前的经纬度,需要可以动态改变
界面中心为箭头,指向是目前的朝向,可以利用上周代码得到的朝向,也需要动态改变 左下角是一个按钮,当移动地图时需要变为空心,可以点击,点击后变为实心同时回到定位到目前位置
当拖动地图时,左下角会变为空心 点击左下角按钮,回到目前位置
  • 该项目属于选作项目
  • 需要理解一定的百度地图API
  • 基础内容是显示地图,定位到目前位置,显示目前朝向共计三项,其中后两项可以利用之前的代码
  • 加分项即为左下角的按钮以及相应的事件监听处理。对流程还不清晰的可以查看demo
  • 需要的图片资源在manual里

三、课堂实验结果

(1)实验截图

1.地图初始页面

2.改变经纬度

3.移动地图,左下方图标变化

4.点击左下方图标,显示回原位置

5.摇动手机,marker改变方向

(2)实验步骤以及关键代码

a.引入百度地图的资源包

网上教程一大把,这里也不再叙述。

主要步骤

  • 下载开发包
  • 复制so文件至src/main/jniLibs目录
  • 复制jar包至libs目录
  • 增加sourceSets
  • 增加依赖
  • 添加密钥
  • 添加权限
  • 使用地图

b.添加地图到xml布局

这里的页面仅需要显示一个地图的组件加上自己的一张图片即可,后面通过点击这张图片来与地图进行交互。

 <com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="fill_parent"android:layout_height="fill_parent"android:clickable="true" /><ImageButtonandroid:id="@+id/imaage_button"android:layout_width="80dp"android:layout_height="80dp"android:scaleType="fitXY"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:src="@drawable/centerdirection"/>

C.根据经纬度显示地图,并设置marker

这里的经纬度利用的是上周的LocationManager所获得的地址,但是由于百度地图的api的地址计算并不与location的直接一致,故需要进行转换,这一点在百度的api手册也有说明。以下是设置我的当前位置信息,需要设置角度,经度,纬度。

//获取地图控件引用
BaiduMap mBaiduMap = mMapView.getMap();mBaiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);
//普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
mBaiduMap.setMyLocationEnabled(true);
// 转换坐标
CoordinateConverter converter = new CoordinateConverter();
converter.from(CoordinateConverter.CoordType.GPS);
converter.coord(new LatLng(loc.getLatitude(), loc.getLongitude()));
LatLng desLatLng = converter.convert();
// LatLng就是当前的坐标
degree = 90.0f;
mMapView.getMap().setMyLocationEnabled(true);
MyLocationData data = new MyLocationData.Builder().latitude(desLatLng.latitude).longitude(desLatLng.longitude).direction(degree).build();
mMapView.getMap().setMyLocationData(data);

然后,设置marker的图片与位置

Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.pointer), 100, 100, true);
BitmapDescriptor bitmapD = BitmapDescriptorFactory.fromBitmap(bitmap);
MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, bitmapD);
mMapView.getMap().setMyLocationConfiguration(config);

设置地图居中显示

// 设置地图居中
MapStatus mapStatus = new MapStatus.Builder().target(desLatLng).build();
MapStatusUpdate mapStatusUpdate =   MapStatusUpdateFactory.newMapStatus(mapStatus);
mMapView.getMap().setMapStatus(mapStatusUpdate);

这一点很关键,没有设置居中显示,则地图默认显示中心在首都,这一点会导致我的marker看不到,误以为程序出问题,且不符合要求。

d.判断手机转向时,改变marker的转向

这一点与上一周的指针旋转类似,传感器不变,但是需要做的是改变marker的角度,即重新设置direction。

MyLocationData data = new MyLocationData.Builder().latitude(desLatLng.latitude).longitude(desLatLng.longitude).direction(degree).build();

里面的degree就是我通过之前传感器获取的转向角度。

e.判断位置改变时,改变地图和marker所处位置

与改变角度一样,只不过这次改变的是经纬度。同样经纬度也是通过上周传感器的改变监听函数中获取即可。

MyLocationData data = new MyLocationData.Builder().latitude(desLatLng.latitude).longitude(desLatLng.longitude).direction(degree).build();

f.判断地图的改变状态,以此改变左下角的图片

这里利用的是百度地图的地图状态改变监听器。

我设置当状态改变完毕后,若当前状态与经纬度的状态不一致,则证明偏离了中心,所以改变图片的样式。同样,当点击图片,仅需返回到原来的状态即可,并将图片设置回实心。

// 设置imageButton的点击函数
imageButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 转换坐标CoordinateConverter converter = new CoordinateConverter();converter.from(CoordinateConverter.CoordType.GPS);converter.coord(new LatLng(loc.getLatitude(), loc.getLongitude()));LatLng desLatLng = converter.convert();// 设置地图居中MapStatus mapStatus = new MapStatus.Builder().target(desLatLng).build();MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus);mMapView.getMap().setMapStatus(mapStatusUpdate);// 更改图片imageButton.setImageResource(R.drawable.centerdirection);}
});

以下是百度地图的状态监听器:

// 地图改变的监听函数
onMapStatusChangeListener = new BaiduMap.OnMapStatusChangeListener() {/*** 手势操作地图,设置地图状态等操作导致地图状态开始改变。* @param status 地图状态改变开始时的地图状态*/public void onMapStatusChangeStart(MapStatus status){}/** 因某种操作导致地图状态开始改变。* @param status 地图状态改变开始时的地图状态* @param reason表示地图状态改变的原因,取值有:* 1:用户手势触发导致的地图状态改变,比如双击、拖拽、滑动底图* 2:SDK导致的地图状态改变, 比如点击缩放控件、指南针图标* 3:开发者调用,导致的地图状态改变*/public void onMapStatusChangeStart(MapStatus status, int reason){}/*** 地图状态变化中* @param status 当前地图状态*/public void onMapStatusChange(MapStatus status){}/*** 地图状态改变结束* @param status 地图状态改变结束后的地图状态*/public void onMapStatusChangeFinish(MapStatus status){// 转换坐标CoordinateConverter converter = new CoordinateConverter();converter.from(CoordinateConverter.CoordType.GPS);converter.coord(new LatLng(loc.getLatitude(), loc.getLongitude()));LatLng desLatLng = converter.convert();// 判断两个状态是否一致MapStatus mapStatus = new MapStatus.Builder().target(desLatLng).build();Log.i("change","map has changed");if(!status.equals(mapStatus)){imageButton.setImageResource(R.drawable.definelocation);}}
};

在初始化地图的时候记得设置监听器即可。

mBaiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);

(3)实验遇到的困难以及解决思路

a.地图加载出来后,仅显示在首都,并未根据经纬度改变

这一点是由于我只设置了MyLocationData,并没有设置地图的Status导致的。地图的位置信息已经在经纬度了,但是并没有居中显示。

// 设置地图居中
MapStatus mapStatus = new MapStatus.Builder().target(desLatLng).build();
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus);
mMapView.getMap().setMapStatus(mapStatusUpdate);

四、实验思考及感想

这次的实验也是在之前传感器的基础上添加百度地图功能,传感器部分的功能可以继续使用,只是需要学习一些百度地图的SDK。个人感觉地图与传感器这两个功能在日常的android开发都是离不开的,而想用好别人的地图SDK就要先看懂官方的文档,这一点很重要。我在做实验过程一遇到缺少的功能或者函数,一般官方文档上也会有教程或者方法提供。

最后一次安卓作业也做完了,虽然要求是选做,但是趁着自己有时间空余还是完成一下吧。安卓的学习并没有因此而终止,反而是另一种学习的开始,到此我已经基本掌握android的开发知识,要趁着寒假时间也加强一下自己的水平,期待在安卓开发能有更远的发展。Fighting!

安卓开发笔记(十二)—— 基于百度地图SDK完成地图中心定位,marker转向,动态定位相关推荐

  1. 【Visual C++】游戏开发笔记十二 游戏输入消息处理(一) 键盘消息处理

    相信大家都熟悉<仙剑奇侠传98柔情版>的人机交互方式,用的仅仅是键盘.在那个物质并不充裕的时代,一台配置并不高的电脑,一款名叫<仙剑奇侠传>的游戏,却能承载一代人对梦想的追逐. ...

  2. 【Visual C 】游戏开发笔记十二 游戏输入消息处理 一 键盘消息处理

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  3. 安卓开发笔记(二十六):Splash实现首页快速开屏功能

    我们在进行安卓开发的时候,首页开有两种方式,一种是利用handler将一个活动进行延时,时间到达之后软件则会跳转到第二个活动当中.而另一种方法则是更加常用的方法,利用splash实现首页的快速开屏,这 ...

  4. 微信小程序开发笔记 支付篇④——基于微信支付SDK实现Java后端接口使用

    文章目录 一.前文 二.微信支付 Java SDK 三.示例 一.前文 微信小程序开发笔记--导读 微信支付-SDK与DEMO下载 先看README.md 二.微信支付 Java SDK 对微信支付开 ...

  5. 安卓开发笔记(二十二):读取本地(内置)html文件并实现和Javascript交互

    实际上我们通常是使用WebView控件对本地html进行读取,这样就可以体会类似web app和安卓原生混合开发的乐趣了.在读取本地html并展示在前台的时候,并不需要在Androidmenifast ...

  6. 安卓开发笔记(二十七):实现轮播文字消息

    仅仅写个xml就够了,太简单了 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xm ...

  7. Kinect for Windows SDK v2.0 开发笔记 (十二) 高清面部帧(3) 面部模型(2D)

     (转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 public preview1409 同前面,因为SDK未完成,不附上函数/方法/接口的超链接. 是的, ...

  8. matlab火星漫游车转向控制,OSG开发笔记(二十四):OSG漫游之平移与转向

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 本文章博客地址:https://blog.csdn.net/qq21497936/ ...

  9. 【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...

  10. 【转】【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI

    原文连接:http://www.cnblogs.com/dyllove98/archive/2012/04/07/2461865.html#commentform 我们常常听闻AI(Artificia ...

最新文章

  1. 两个月番茄组长的收获总结
  2. python3 psutil模块 进程和系统信息
  3. asp.net mvc自动完成
  4. 单机和分布式场景下,有哪些流控方案?
  5. echart仪表盘旋转_使用echart仪表盘
  6. 嵌入式操作系统内核原理和开发(系统中断仿真)
  7. SpringMVC控制器单例和多例
  8. 要注意了!这样使用MyBatis框架,被攻击了!
  9. igxe本地机器人怎么用_RPA 9.0 前瞻系列 - 机器人共享
  10. linux vi 底行命令,Linux下vi命令详解
  11. 随机信号分析实验(matlab仿真实验)
  12. 拿下60亿流量的《惊雷》都是哪些人在听?python帮你统计出来
  13. java堆栈常用排查指令
  14. [BZOJ3503][CQOI2014]和谐矩阵
  15. java项目类型---java新手
  16. 医疗行业容灾备份解决方案
  17. Myeclipse反向工程后造成的SQL syntax
  18. ubuntu20.04修改用户名【保留文件】
  19. Android9.0 完全隐藏导航栏、状态栏
  20. winsock和winsock2冲突

热门文章

  1. 04-02-设计模式 工厂模式
  2. python代码格式化神器_有哪些命令行的软件堪称神器?
  3. KALOS.art AI 作品每周精选 006
  4. WZOI-219短信计费
  5. 大数据服务器租用硬件配置有什么要求,怎么选?
  6. MySQL workbench闪退 解决方法
  7. 人工智能管家离我们已不远
  8. opencv直方图该怎么画
  9. LCD段码液晶屏驱动方法介绍
  10. Flink 官方文档汇总