百度地图定位设计
百度地图定位设计
实现功能
使用百度地图SDK实现定位功能。
前期工作
在实现定位功能之前,需要进行一些资源的申请和对Android Studio的配置。
SDK申请
首先需要在百度地图开发平台申请百度地图SDK的使用权限(具体过程见官方文档),申请成功之后,可以获得一个应用密钥AK。

Android Studio配置
首先需要下载百度地图开发所需的第三方库(下载地址),选择标准版jar开发包。将解压后的所有文件添加到申请AK时使用的项目文件中的lib目录中。然后在app目录下的build.gradle文件中android块中配置sourceSets标签,内容如下:
sourceSets {main {jniLibs.srcDir 'libs'}}
此时就能将部分目录添加到项目视图中,现在需要将jar文件添加到项目视图中。在app目录的build.gradle的dependencies块中添加以下代码,然后右键目标jar文件,选择Add as library,就能将其加入到项目视图中。
implementation files('libs\\BaiduLBS_Android.jar')
完成以上步骤之后,就能进行接口的配置。首先配置AndroidManifest.xml文件。在
<application> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="这里填AK" />
application>
在
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
显示地图
要实现定位功能,首先要把地图显示出来。为了页面的简洁,在布局文件中仅添加地图容器。
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" />
然后我们需要初始化地图,在SDK各功能组件使用之前都需要调用SDKInitializer.initialize(getApplicationContext())方法,因此建议在应用创建时初始化SDK引用的Context为全局变量。我们创建一个初始化Application,在其onCreate方法中完成SDK的初始化:
public class MyLBS extends Application {@Overridepublic void onCreate() {super.onCreate();//在使用SDK各组件之前初始化context信息,传入ApplicationContext SDKInitializer.initialize(this);//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。SDKInitializer.setCoordType(CoordType.BD09LL);}
}
然后在AndroidManifest.xml文件中声明该Application:
完成以上工作之后,就能够创建地图的实例MyMap,之后的所有方法几乎都是基于MyMap对象来实现的:
mapView = findViewById(R.id.bmapView);
MyMap = mapView.getMap();
打开地图看一眼:

显示定位
在实现定位之前,首先需要配置AndroidManifest.xml文件。
一是加入权限声明:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
二是在Application标签中声明定位的service组件:
<service android:name="com.baidu.location.f"android:enabled="true"android:process=":remote"/>
要想实现定位功能,首先需要构造地图的定位数据。首先从百度SDK中继承一个定位数据的抽象类LocationListener。由于该类需要监听整个地图,所以需要写为MainActivity的内置类:
public class MyLocationLinstener extends BDAbstractLocationListener{@Overridepublic void onReceiveLocation(BDLocation location) {//mapView 销毁后不在处理新接收的位置if (location == null || MyMap == null){return;}MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())// 此处设置开发者获取到的方向信息,顺时针0-360.direction(location.getDirection()).latitude(location.getLatitude()).longitude(location.getLongitude()).build();MyMap.setMyLocationData(locData);if (isFirstLoc) {isFirstLoc = false;LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());MapStatus.Builder builder = new MapStatus.Builder();builder.target(ll).zoom(18.0f);MyMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();// 利用SDK中提供的报错信息进行引导性弹窗输出 } else if (location.getLocType() == BDLocation.TypeServerError) {Toast.makeText(MainActivity.this, "服务器错误,请检查", Toast.LENGTH_SHORT).show();} else if (location.getLocType() == BDLocation.TypeNetWorkException) {Toast.makeText(MainActivity.this, "网络错误,请检查", Toast.LENGTH_SHORT).show();} else if (location.getLocType() == BDLocation.TypeCriteriaException) {Toast.makeText(MainActivity.this, "手机模式错误,请检查是否飞行", Toast.LENGTH_SHORT).show();}}}}
在OnCreate方法中,首先打开位置监听:
MyMap.setMyLocationEnabled(true);
创建一个客户端定位实例:
MyLocationClient = new LocationClient(this);
设置定位参数:
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开GPS
option.setCoorType("bd0911"); // 设置坐标类型
option.setScanSpan(1000);
MyLocationClient.setLocOption(option);
使用刚才定义的内置类创建一个监听对象,并且注册该监听器:
MyLocationLinstener linstener = new MyLocationLinstener();
MyLocationClient.registerLocationListener(linstener);
最后打开定位功能,就能显示定位。
MyLocationClient.start();
MyLocationClient.requestLocation();
最后运行项目文件,查看定位(由于使用了虚拟机,所以这里需要导入一个kml或文件来设置虚拟机的位置信息)

Github链接:https://github.com/masterluoh/BaiduMapLocationShared.git
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
