Android Studio+百度地图API实现简单gis移动端App
实习说明:
由于很多内容网上都是详细说明,但是我在帮助同学们解决问题过程遇到许多奇怪的问题,花了很多时间去解决,网上查不到,所以值得我记录下来,让后面的学弟学妹节省大部分时间!!同时我也会将该文章发布到我的csdn账号中,大家也可以直接查找噢。涉及到的代码文件下载链接我放在文末了。
1.Android Studio环境配置
下载地址:
Download Android Studio and SDK tools | Android Developers
Android Studio环境配置具体教程:
Android Studio安装教程(AS教程)(超级全,包括JDK,SDK,AVD虚拟机的下载安装)_是阿熊呀的博客-CSDN博客_as安装教程
as安装结尾中有一个时勾选下载android SDK的选项无法勾选!!!!但是一样可以安装完,只不过后面打开as根本无法点击运行程序,所以这个sdk必须下载。
在那个页面等待5分钟后再点击即可勾选下载对应SDK!!!!
其他方法,比如卸载重装as多次或者参考网上的方法另外安装android SDK后打开as配置sdk指定到安装android SDK的文件夹也没有用。
2.Android Studio模拟器/真机选择
2.1模拟器
由于是安卓开发,要查看开发效果需要手机支撑,可以选择安装夜神模拟器,下载链接:
夜神安卓模拟器-安卓模拟器电脑版下载_安卓手游模拟器_手机模拟器_官网
即使打开了夜神模拟器,有时候AS也不会自动连接上夜神模拟器,如下图所示:
2.1.1解决方法
1.需要我们找到夜神模拟器安装路径中的bin文件夹路径,如下图所示:
nox_adb.exe connect 127.0.0.1:62001
命令行出现如下信息,这时候as会自动连接到夜神模拟器,如果等了10秒钟还不行就在复制代码运行一遍,如下图所示:
2.2手机真机
当然也可以使用通过手机原装充电线连接到电脑进行真机测试,不同手机打开开发者模式不同,具体可百度查找,我的是VIVO双击【关于手机】->【版本信息】->【软件版本号】,这时候开发者选项就会出现,将【开发者选项】和【USB调试】都打开,这时候手机会弹出【允许USB调试吗?】,点击允许即可。这时候as会自动连接到你的手机,如下图所示:
有的同学手机(比如华为)在测试时安装app即使无视风险也无法安装,但我的手机(vivo)权限开完可无视风险完成安装,如下图所示:
解决方法:
参考这个链接:AirtestIDE连接安卓真机及常见问题 - ☆星空物语☆ - 博客园,实在不行就用夜神模拟器吧。
3.实习内容
如下图所示,主要是利用Android Studio结合百度地图SDK开发一款简单的GIS移动端App,基本功能包括地图显示,地图切换,定位和路线规划。具体可参考Android 地图SDK官网:https://lbsyun.baidu.com/index.php?title=androidsdk。
3.1开发准备
3.1.1获取密钥(遇到非常多问题,最耗时,最复杂!)
如何获取看下图:
我由于已经申请成功,跳转界面如下所示:
具体申请这个AK的方法在下面这个链接:
Android 百度地图SDK 自动定位、标记定位_初学者-Study的博客-CSDN博客_地图定位标记
1.如果在这个申请过程中终端命令行出现
请输入申请密钥库口令:
这个时候你输入的东西是不会显示的,确保输入正确后直接点回车键即可。
2.输入的命令行出现如下报错(很多同学遇到这个问题):
'keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
这个你首先复制到百度参考网上的方法,绝大部分是因为同学们电脑没有安装好java运行环境jdk,所以下载安装好这个jdk,并且主要到电脑环境变量中配置好相关环境这个务必做到位,不然还是会出现那个报错!!!!
3.1.2下载SDK本地依赖
注意选择基础定位,基础地图,检索(用于poi检索),开发包格式:JAR,应用发布平台:标准开发。
3.1.3 Android Studio配置
参考官网即可,如下图所示:
注意:第二步中添加so文件建议使用第二种方式:
3.2正式实现功能
代码粘贴进去肯定很多报错,都是红色,把鼠标放上去导入类即可。
3.2.1显示地图
跟着官网进行即可。
注意:这里第三步地图初始化中意思是在MainActivity类同级目录下新建一个名为DemoApplication的java类,如下图所示:
遇到的问题5:
代码没有任何问题,但地图显示运行起来闪退!!!
解决方法:
在DemoApplication类中添加如下一行代码,官网没有直接写出来,但是没有这行app运行起来会闪退(问题困扰我很久,请教了其他同学知道这个方法的)。
官网在【开发注意事项】中提到了,但我们没在意。
3.2.2地图定位
注意确保前面的地图显示可以正常显示的情况下进行地图定位功能的开发,地图定位的代码除了第1、2步配置.xml文件外的其他代码都放在MainActivity类中!!!!
1.配置AndroidManifest.xml文件
//加入如下权限使用声明<!-- 这个权限用于进行网络定位 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- 这个权限用于访问GPS定位 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
2.在AndroidManifest.xml的Application标签中中声明定位的service组件
<service android:name="com.baidu.location.f"android:enabled="true"android:process=":remote"/>
3.在MainActivity类中定义如下变量:
private MapView mMapView=null;private BaiduMap mBaiduMap =null;private LocationClient mLocationClient=null;private boolean isFirstLocate = true;private boolean isFirstLoc=true;
4.在MainActivity类onCreate函数中填写以下代码:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);LocationClient.setAgreePrivacy(true);mMapView = (MapView) findViewById(R.id.bmapView);mBaiduMap = mMapView.getMap();mBaiduMap.clear();try{//定位方法InitLocation();}catch (Exception e){e.printStackTrace();}}
5.上述代码中,InitLocation()函数设置为如下(放在onCreate函数外面):
public void InitLocation() throws Exception {mBaiduMap.setMyLocationEnabled(true);//定位初始化mLocationClient = new LocationClient(this);MyLocationListener myListener = new MyLocationListener();mLocationClient.registerLocationListener(myListener);//通过LocationClientOption设置LocationClient相关参数LocationClientOption option = new LocationClientOption();option.setOpenGps(true); // 打开gpsoption.setCoorType("bd09ll"); // 设置坐标类型option.setScanSpan(1000);//设置locationClientOptionmLocationClient.setLocOption(option);//开启地图定位图层mLocationClient.start();}
6.紧接着InitLocation()函数后面新建MyLocationListener类通过继承抽象类BDAbstractListener并重写其onReceieveLocation方法来获取定位数据,并将其传给MapView。
public class MyLocationListener extends BDAbstractLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {// MapView 销毁后不在处理新接收的位置if (location == null || mMapView == null) {return;}MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())// 设置定位数据的精度信息,单位:米.direction(location.getDirection()) // 此处设置开发者获取到的方向信息,顺时针0-360.latitude(location.getLatitude()).longitude(location.getLongitude()).build();latitude = locData.latitude;longitude = locData.longitude;// 设置定位数据, 只有先允许定位图层后设置数据才会生效mBaiduMap.setMyLocationData(locData);if (isFirstLoc) {isFirstLoc = false;LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());MapStatus.Builder builder = new MapStatus.Builder();builder.target(latLng).zoom(18.0f);mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));}}
}
遇到的问题6:
即使是手机真机或者夜神模拟器都打开了定位,但还是定位到几内亚湾或者国内其他地方。
解决方法:
在夜神模拟器定位中搜索湖南科技大学,主动定位到真实位置。
3.2.3地图切换
1.在activity_main.xml中声明地图切换监听器组件
<RadioGroupandroid:id="@+id/mapleixing0"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:orientation="horizontal"android:background="@color/teal_200"><RadioButtonandroid:id="@+id/mapleixing2"android:layout_width="134dp"android:layout_height="match_parent"android:text="卫星地图" /><RadioButtonandroid:id="@+id/mapleixing1"android:layout_width="140dp"android:layout_height="wrap_content"android:text="普通地图" /></RadioGroup>
2.在MainActivity类中定义局部变量用于切换地图监听器:
private RadioGroup mapleixing;
3.在MainActivity类onCreate函数中填写以下代码:
mapleixing = findViewById(R.id.mapleixing0);
setListeners();
4.上述代码中,setListeners()监听器切换地图方法设置为如下(放在onCreate函数外面):
protected void setListeners() {mapleixing.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@SuppressLint("NonConstantResourceId")@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int i) {switch (i) {case R.id.mapleixing1:mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);break;case R.id.mapleixing2:mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);break;}}});
}
3.2.4 POI检索
1.MainActivity类中定义如下变量:
private String cityName;private EditText keyWords_et;private PoiNearbySearchOption nearbySearchOption;private PoiCitySearchOption citySearchOption;private PoiSearch mPoiSearch = null;private Button nearsearch = null;private Button citysearch = null;private double latitude;private double longitude;2地图定位
2.在activity_main.xml中使用线性布局POI点击按钮
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><EditTextandroid:id="@+id/keywords_et"android:layout_width="150dp"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/nearsearch"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="城内搜索" /><Buttonandroid:id="@+id/citysearch"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="附近搜索" /></LinearLayout>
3.把PoiOverlay.java、OverlayManager.java拷贝到项目中如下位置:
4.将POI图标拷贝放到如下位置:
5.在之前定位功能中的InitLocation()函数添加如下一行代码,用于查找周围POI:
option.setIsNeedAddress(true);
6.在之前定位功能中的MyLocationListener类添加如下一行代码,用于查找所属城市名称
cityName = location.getCity();
7.在MainActivity类onCreate函数中填写以下代码:
//这是所需变量citysearch = findViewById(R.id.citysearch);nearsearch = findViewById(R.id.nearsearch);keyWords_et = findViewById(R.id.keywords_et);//mPoiSearch是检索的执行对象,这里将它实例化mPoiSearch = PoiSearch.newInstance();//为poi检索注册监听器#####################OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {@Overridepublic void onGetPoiResult(PoiResult poiResult) {if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {Toast.makeText(MainActivity.this, "未搜索到结果", Toast.LENGTH_SHORT).show();return;}if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {mBaiduMap.clear();PoiOverlay overlay = new PoiOverlay(mBaiduMap);overlay.setData(poiResult);overlay.addToMap();overlay.zoomToSpan();return;}}@Overridepublic void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {}@Overridepublic void onGetPoiDetailResult(PoiDetailSearchResult poiDetailResult) {if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();} else {Toast.makeText(MainActivity.this, "成功,查看详情界面", Toast.LENGTH_SHORT).show();}}@Overridepublic void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {}};//注册附近搜索检索poi按钮点击事件nearsearch.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mPoiSearch.setOnGetPoiSearchResultListener(poiListener);searchNearBy(keyWords_et.getText().toString());}});//注册城内搜索检索poi按钮点击事件citysearch.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mPoiSearch.setOnGetPoiSearchResultListener(poiListener);searchInCity(keyWords_et.getText().toString());}});
8.在MainActivity类onCreate函数外写按钮的时间回调函数:
//城内搜索POI方法#########################public void searchInCity(String keyWord) {citySearchOption = new PoiCitySearchOption();citySearchOption.city(cityName).keyword(keyWord).pageNum(10);mPoiSearch.searchInCity(citySearchOption);}//搜索附近POI方法#########################public void searchNearBy(String keyWord) {nearbySearchOption = new PoiNearbySearchOption();nearbySearchOption.keyword(keyWord).location(new LatLng(latitude, longitude)).radius(500) //半径 米.pageCapacity(50);//默认条数mPoiSearch.searchNearby(nearbySearchOption);}
遇到的问题7:
代码完全正确,可以运行出来,但是无论点击城内搜索还是附近搜索按钮都没有结果显示。
解决方法:
打开运行选项,可以看到这个报错,其实在实现POI搜索这个功能之前,地图显示、定位和地图切换也都出现过这个错误对吧,但是没有影响功能的实现,外面也就没有搭理它,但是现在不行了,需要解决它,不然poi搜索功能无法实现!!把下面这个sha1代码复制:
打开之前申请的AK界面,点击设置:
将开发版SHA1替换为刚才复制的sha1代码后点击提交,这时候再运行App发现poi检索按钮可以实现对应的功能了。
3.2.5 路线规划
1.将WalkingRouteOverlay.java文件拖进项目如下位置中:
2.在布局文件中添加一个路径规划按钮(紧接着之前的POI查询按钮)
<Buttonandroid:id="@+id/routeplan"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="路线规划" />
3.在MainActivity类中定义如下路径规划变量:
private RoutePlanSearch mRoutePlanSearch = null;
private Button routeplan = null;
4.在MainActivity类onCreate函数中填写以下代码:
//路径规划routeplan = findViewById(R.id.routeplan);mRoutePlanSearch = RoutePlanSearch.newInstance();//创建路径规划结果监听器#####################################OnGetRoutePlanResultListener routePlanResultListener = new OnGetRoutePlanResultListener() {@Overridepublic void onGetWalkingRouteResult(WalkingRouteResult result) {if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {if (result == null) {System.out.println("error1");}if (result.error != SearchResult.ERRORNO.NO_ERROR) {System.out.println("error2");}Toast.makeText(MainActivity.this, "抱歉未找到结果", Toast.LENGTH_SHORT).show();return;}if (result.error == SearchResult.ERRORNO.NO_ERROR) {if (result.getRouteLines().size() >= 1) {try {RouteLine route = result.getRouteLines().get(0);mBaiduMap.clear();WalkingRouteOverlay overlay = new WalkingRouteOverlay(mBaiduMap);overlay.setData((WalkingRouteLine) route);overlay.addToMap();overlay.zoomToSpan();} catch (Exception e) {e.printStackTrace();}}}}@Overridepublic void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {}@Overridepublic void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {}@Overridepublic void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {}@Overridepublic void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {}@Overridepublic void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {}};//为路线规划按钮注册点击事件routeplan.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {PlanNode stNode = PlanNode.withLocation(new LatLng(latitude, longitude));PlanNode edNode = PlanNode.withLocation(new LatLng(27.88291, 112.85986));/**/mRoutePlanSearch.setOnGetRoutePlanResultListener((OnGetRoutePlanResultListener) routePlanResultListener);mRoutePlanSearch.walkingSearch(new WalkingRoutePlanOption().from(stNode).to(edNode));}});
activity_main.xml文件截图
MainActivity类变量的截图
功能实现效果图
其他功能可以自己实现,比如我实现绘制科大地图,但是由于百度地图坐标系特殊,我采集的坐标点是WGS84的经纬度,所以会出现整体的偏差。
Android Studio+百度地图API实现简单gis移动端App相关推荐
- Android如何实现地图定位?Android studio+百度地图API+Android6.0系统实现地图显示、地址设置、点击地图定位功能(详细)
文章说明:本文初衷是为了记录毕设学习过程,避免忘记操作流程.该功能是毕业设计的Android软件端的功能之一,本文将从获取百度地图密钥(AK)开始,详细地对地图定位配置和相关代码进行说明,文末将附上实 ...
- Android studio 百度地图开发(5)查询周边服务(加油站)
Android studio 百度地图开发(5)查询周边服务(加油站) email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是An ...
- Android studio 百度地图开发(3)地图导航
Android studio 百度地图开发(3)地图导航 email:chentravelling@163.com 工程下载地址:http://blog.csdn.net/chentravelling ...
- 用android studio测量距离,Android studio 百度地图开发(6)Marker绑定事件、计算两点距离...
Android studio 百度地图开发(6)Marker绑定事件.计算两点距离 email:chentravelling@163.com 开发环境:win7 64位,Android Studio, ...
- android 调用百度地图规划,Android 调用百度地图API
一.到 百度地图开发平台下载SDK 1.点击自定义下载 2.下载自己想要的功能包我这里选了三个 3.获取密钥 获取密钥之前我们要新建一个应用 填写好相关的信息 二. 新建一个项目工程 1. 把下载好的 ...
- Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息
本文主要介绍了Android项目集成百度地图API,使用AlarmManager定时调用Service,在Service中请求坐标更新,并通过坐标得到省.市和县三级地理位置信息的方法. 程序结构很简单 ...
- 通过百度地图api实现简单经纬度输入定位(安卓端)
老师居然检查作业了!因为之前做过一点,熬夜做了一下,太久没搞安卓了,感觉之前学的全忘了:(. 功能演示 老师的要求是实现输入经纬度,在地图中显示该坐标位置信息 通过网上经纬度查询系统查得桥楼餐厅经纬度 ...
- Android利用百度地图API实现定位功能(记录)
本篇主要介绍一下如何使用百度地图API来实现定位以及地图的基本使用. 效果图如下: 步骤如下: 一.申请APIKey. (1)注册百度账号并申请开发者资质:http://developer.baidu ...
- Android studio 百度地图SDK之地图定位与运动轨迹绘制
百度地图定位与运动轨迹 Android开发的前期准备 地图图层显示与定位 运动轨迹的简单绘制 Android开发的前期准备 Android配置在百度地图SDK官网上有详细的说明.具体可以参考官网的教程 ...
最新文章
- golang reflect
- 乔春洋:网上品牌战略
- fatal: unable to access ‘‘: TCP connection reset by peer
- 六级范文背诵50篇_清华附小校长:小学生日记写作训练,附经典范文50篇,家长收藏...
- python3 最基本且简单的实现组合设计模式
- Java-eclipse快捷键及设置
- 开发本无趣,看 Unity 如何为其绽放精彩!
- vue使用three.js 第一人称移动。与cs控制角色移动一样(第一人称旋转相机+控制相机移动)
- linux安装网卡驱动make报错,linux 安装网卡驱动详解
- 蒋鑫鸿:9.7国际黄金、纸白银行情走势分析、原油操作建议
- Ubuntu的shell脚本踩keng-unexpected operator
- 【电影推荐】风吹麦浪
- [NSSRound#8 Basic]MyDoor
- 用C#编写一个图片浏览器,实现鼠标控制图片的平移缩放与图片的灰度化
- 【IoU loss】IoU损失函数理解
- 不需要登录微信,发送消息python
- 【实例】使用 PHPExcel 读取excel 文件
- 软考高项论文写作要求有哪些
- 利用python实现 CAD STEP格式转化为STL格式
- HTML5中div布局的float属性