1、开发背景
2、开发环境
2.1基础开发环境
2.2百度地图环境
2.3高德地图环境
2.4腾讯地图环境
3、工程配置
3.1 添加jar包
3.2 添加so文件
3.3 AndroidMainfest.xml配置
4.百度地图与定位
5.高德地图与定位
6.腾讯地图与定位
1、开发背景
由于公司在开发安卓项目时,需要用到定位功能,所以需要选择定位精度高的地图SDK。现在将市面上应用最广泛的三家地图服务集成到一个APP上,实现百度地图、高德地图、腾讯地图的对比。现将整个开发步骤进行记录。
2、开发环境
2.1基础开发环境
AndroidStudio 3.4.2
Gradle Version:gradle-5.1.1-all.zip
Gradle plug-in:3.4.2
2.2百度地图环境
百度地图开发者开放平台链接:官网
百度基础地图SDK下载地址 :下载地址
百度地图定位SDK下载地址:下载地址
百度地图开发jar包:BaiduLBS_Android.jar
百度地图开发so文件:
liblocSDK7b.so
libBaiduMapSDK_base_v5_2_1.so
libBaiduMapSDK_map_v5_2_1.so
2.3高德地图环境
高德开放平台:官网
高德基础地图SDK:下载地址
高德地图定位SDK:下载地址
高德地图开发jar包:
AMap_Location_V4.7.0_20190708.jar
Android_Map3D_SDK_V6.9.2_20190709.jar
高德地图开发so文件:不需要
2.4腾讯地图环境
腾讯开放平台:官网
腾讯基础地图SDK:下载地址
腾讯地图定位SDK:下载地址
腾讯地图开发jar包:
tencent-mapsdk-library-MainRelease-4.2.5.15519d1.jar
TencentLocationSdk_v7.1.7_r02c4bb5a_20190523_115148.jar
腾讯地图开发so文件:
libtencentloc.so
libtxmapengine.so
3、工程配置
3.1 添加jar包
使用AndroidStudio创建一个新的项目。然后将下载的jar拷贝到libs目录下。
之后File->Project Structure
点击+号,选择jar Dependency。
添加libs下的jar包。之后,OK。
在app目录下的build.gradle中就可以看到添加的内容。
3.2 添加so文件
在main目录下,创建一个新的文件夹jniLibs。
将下载的so文件拷贝到jniLibs文件夹中。
到此,开发所依赖的环境已做好。
3.3 AndroidMainfest.xml配置
地图开发需要调用手机的权限,在xml文件中添加如下权限。
添加在三个开发平台申请的开发秘钥。
到此开发的基础环境工作也做完。
4.百度地图与定位
在百度地图的xml文件中添加MapView控件
在BaiduActivity.java中编写代码。
添加指南针、比例尺等控件
public void mapSetting(){
if(mBaiduMap==null){
mBaiduMap=mBaiduMapView.getMap();
UiSettings settings=mBaiduMap.getUiSettings();//设置显示定位按钮,并且可以点击
//aMap.setLocationSource(this);//设置了定位的监听,这里实现LocationSource接口
settings.setCompassEnabled(true);//添加指南针
mBaiduMap.setMyLocationEnabled(true);
}
}
开启定位的方法
private void baiDuLocation() {
//定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动
LocationClient locationClient = new LocationClient(getApplicationContext());
//声明LocationClient类实例并配置定位参数
LocationClientOption locationOption = new LocationClientOption();
MyLocationListener myLocationListener = new MyLocationListener();
//注册监听函数
locationClient.registerLocationListener(myLocationListener);
//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
locationOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
locationOption.setCoorType("bd09ll");
//可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
locationOption.setScanSpan(1000);
//可选,设置是否需要地址信息,默认不需要
locationOption.setIsNeedAddress(true);
//可选,设置是否需要地址描述
locationOption.setIsNeedLocationDescribe(true);
//可选,设置是否需要设备方向结果
locationOption.setNeedDeviceDirect(false);
//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
locationOption.setLocationNotify(true);
//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
locationOption.setIgnoreKillProcess(true);
//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
locationOption.setIsNeedLocationDescribe(true);
//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
locationOption.setIsNeedLocationPoiList(true);
//可选,默认false,设置是否收集CRASH信息,默认收集
locationOption.SetIgnoreCacheException(false);
//可选,默认false,设置是否开启Gps定位
locationOption.setOpenGps(true);
//可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
locationOption.setIsNeedAltitude(false);
//设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者,该模式下开发者无需再关心定位间隔是多少,定位SDK本身发现位置变化就会及时回调给开发者
locationOption.setOpenAutoNotifyMode();
//设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者
locationOption.setOpenAutoNotifyMode(3000,1, LocationClientOption.LOC_SENSITIVITY_HIGHT);
//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
locationClient.setLocOption(locationOption);
//开始定位
locationClient.start();
}
定位窗口的移动方法
public void moveTo(double lat,double lon){
LatLng cenpt=new LatLng(lat,lon);
MapStatus mMapStatus=new MapStatus.Builder().target(cenpt)
.zoom(17)
.build();
//定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
//改变地图状态
mBaiduMap.setMapStatus(mMapStatusUpdate);
BitmapDescriptor bitmap= BitmapDescriptorFactory.fromResource(R.mipmap.ic_location);
OverlayOptions option = new MarkerOptions()
.position(cenpt)
.icon(bitmap);
mBaiduMap.addOverlay(option);
}
5.高德地图与定位
在高德地图的xml文件中添加MapView
设置指南针、比例尺等
public void mapSetting(){
if(aMap==null){
aMap=mGaodeMaoView.getMap();
UiSettings settings=aMap.getUiSettings();//设置显示定位按钮,并且可以点击
//aMap.setLocationSource(this);//设置了定位的监听,这里实现LocationSource接口
settings.setCompassEnabled(true);//添加指南针
settings.setMyLocationButtonEnabled(true);
aMap.getCameraPosition();//方法可以获取地图的旋转角度
settings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT);//设置LOGO
settings.setScaleControlsEnabled(true);//设置比例尺
aMap.setMyLocationEnabled(true);
}
}
开启定位方法
private void gaoDeLocation() {
mLocationClient=new AMapLocationClient(getApplicationContext());//初始化定位
mLocationClient.setLocationListener(mLocationListener);//设置定位回调监听
mLocationOption=new AMapLocationClientOption();//初始化AMapLocationClientOption对象 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//选择定位模式
mLocationOption.setOnceLocation(false);//获取多次定位
mLocationOption.setOnceLocationLatest(true);//获取3S内精度最高的一次定位
mLocationOption.setInterval(2000);//设置定位间隔
mLocationOption.setNeedAddress(true);//设置是否需要返回地址信息
mLocationOption.setMockEnable(true);//设置是否允许模拟位置
mLocationOption.setHttpTimeOut(20000);//设置定位超时
mLocationClient.setLocationOption(mLocationOption);//给定位客户端设置定位参数
mLocationClient.startLocation();//启动定位
}
监听回调方法
public AMapLocationListener mLocationListener=new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if(aMapLocation !=null){
if(aMapLocation.getErrorCode()==0){
aMapLocation.getLocationType();//获取当前定位结果来源
double lat=aMapLocation.getLatitude();//获取纬度
double lon=aMapLocation.getLongitude();//获取经度
float accuracy=aMapLocation.getAccuracy();//获取精度信息
String adress=aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
String country=aMapLocation.getCountry();//国家信息
String province=aMapLocation.getProvince();//省信息
String city=aMapLocation.getCity();//城市信息
String district=aMapLocation.getDistrict();//城区信息
String street=aMapLocation.getStreet();//街道信息
String streetNum=aMapLocation.getStreetNum();//街道门牌号信息
String cityCode=aMapLocation.getCityCode();//城市编码
String adCode=aMapLocation.getAdCode();//地区编码
String aoiName=aMapLocation.getAoiName();//获取当前定位点的AOI信息
String buildingId=aMapLocation.getBuildingId();//获取当前室内定位的建筑物Id
String floor=aMapLocation.getFloor();//获取当前室内定位的楼层
int gpsAccuracyStatus=aMapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//获取定位时间
Date date = new Date(aMapLocation.getTime());
String dt=df.format(date);
String add=adress+country+province+city+district+street+streetNum;
loc_gaode.setText("高德定位:纬度:"+lat+"|"+"经度:"+lon+"|"+"精度:"+accuracy+"|"+"地址信息:"+add+"当前GPS状态:"+gpsAccuracyStatus+"|"+"定位时间:"+dt);
if(isFirstLoc){
MyLocationStyle myLocationStyle=new MyLocationStyle();//初始化定位小蓝点样式
myLocationStyle.interval(1000);
myLocationStyle.showMyLocation(true);
aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的style
aMap.setMyLocationEnabled(true);//设置表示启动显示蓝点
aMap.moveCamera(CameraUpdateFactory.zoomTo(zoomlevel));//设置缩放级别
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(),aMapLocation.getLongitude())));//将地图移动到定位点
mListener.onLocationChanged(aMapLocation);//点击按钮,能够将地图的中心移动到定位点
isFirstLoc=false;
}
}else{
//定位失败,可通过ErrCode码信息确定失败的原因
Log.e("AmapError","Location Error,Error:"
+aMapLocation.getErrorCode()
+",errInfo:"+aMapLocation.getErrorInfo());
}
}
}
};
6.腾讯地图与定位
在腾讯地图的xml文件中添加MapView
添加指南针、比例尺等控件
public void userSetting(){
tencentMap.setMapStyle(TencentMap.MAP_TYPE_NORMAL);//设置显示地图的类型:普通、卫星、实时路况
UiSettings mysetting=tencentMap.getUiSettings();
mysetting.setZoomControlsEnabled(true);//设置放大缩小
mysetting.setCompassEnabled(true);//开启指南针
tencentMap.setMyLocationEnabled(true);
}
开启定位
public void tencentLocation(){
TencentLocationRequest request = TencentLocationRequest.create();
request.setInterval(1000);
request.setRequestLevel(4);
request.setAllowCache(true);
Context context=this;
TencentLocationListener tencentLocationListener=this;
TencentLocationManager locationManager=TencentLocationManager.getInstance(context);
int error=locationManager.requestLocationUpdates(request,tencentLocationListener);
if(error==0){
Log.v("this","注册位置监听器成功!");
}else {
Log.v("this","注册位置监听器失败!");
}
}
位置更新时的回调
@Override
public void onLocationChanged(TencentLocation tencentLocation, int i, String s) {
if (TencentLocation.ERROR_OK == i) {
// 定位成功
if(tencentLocation!=null){
double lat=tencentLocation.getLatitude();
double lon=tencentLocation.getLongitude();
double accuracy=tencentLocation.getAccuracy();//精度
String nation=tencentLocation.getNation();//国家
String province=tencentLocation.getProvince();//省份
String city =tencentLocation.getCity();//城市
String district=tencentLocation.getDistrict();//区
String town=tencentLocation.getTown();//镇
String street=tencentLocation.getStreet();//街道
String streetNo=tencentLocation.getStreetNo();//门号
String add=nation+province+city+district+town+street+streetNo;
loc_tencent.setText("腾讯定位:"+"纬度:"+lat+"|"+"经度:"+lon+"|"
+"精度:"+accuracy+"|"+"地址信息:"+add);
moveTo(lat,lon,town,add);
}
} else {
// 定位失败
Log.v("this", "定位失败!");
}
}
定位中心以及窗口的移动
public void moveTo(double lat,double lon,String street,String add){
LatLng centPosition = new LatLng(lat,lon);
CameraUpdate cameraSigma=CameraUpdateFactory.newCameraPosition(new CameraPosition(
centPosition,//新的中心点坐标
17,//新的缩放级别
0,//俯仰角0~45°(垂直地图为0)
0//偏航角0~360°(正北方为0)
));
final Marker marker = tencentMap.addMarker(new MarkerOptions().
position(centPosition).
title(street).
snippet(add));
marker.setIcon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_location));//创建图标
tencentMap.moveCamera(cameraSigma);
}