700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 百度地图 高德地图 腾讯地图三位一体地图定位开发

百度地图 高德地图 腾讯地图三位一体地图定位开发

时间:2023-03-18 19:01:21

相关推荐

百度地图 高德地图 腾讯地图三位一体地图定位开发

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_0708.jar

Android_Map3D_SDK_V6.9.2_0709.jar

高德地图开发so文件:不需要

2.4腾讯地图环境

腾讯开放平台:官网

腾讯基础地图SDK:下载地址

腾讯地图定位SDK:下载地址

腾讯地图开发jar包:

tencent-mapsdk-library-MainRelease-4.2.5.15519d1.jar

TencentLocationSdk_v7.1.7_r02c4bb5a_0523_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文件中添加如下权限。

<!-- 百度定位权限 --><!-- 这个权限用于进行网络定位 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- 这个权限用于访问GPS定位 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!-- 获取运营商信息,用于支持提供运营商信息相关的接口 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 --><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 访问网络,网络定位需要上网 --><uses-permission android:name="android.permission.INTERNET" /><!-- 高德定位其余权限 --><!-- 用于读取手机当前的状态 --><uses-permission android:name="android.permission.READ_PHONE_STATE" /><!-- 写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 用于申请调用A-GPS模块 --><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /><!-- 用于申请获取蓝牙信息进行室内定位 --><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><!-- 腾讯定位其余权限 --><!-- 访问网络的变化, 需要某些信息用于网络定位 --><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

添加在三个开发平台申请的开发秘钥。

到此开发的基础环境工作也做完。

4.百度地图与定位

在百度地图的xml文件中添加MapView控件

<com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true"/>

在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

<com.amap.api.maps.MapViewandroid:id="@+id/gaodemap"android:layout_width="match_parent"android:layout_height="match_parent"></com.amap.api.maps.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);//设置LOGOsettings.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() {@Overridepublic 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();//获取当前室内定位的建筑物IdString 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);//设置定位蓝点的styleaMap.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

<com.tencent.tencentmap.mapsdk.maps.MapViewandroid:id="@+id/tencentMap"android:layout_width="match_parent"android:layout_height="match_parent"/>

添加指南针、比例尺等控件

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","注册位置监听器失败!");}}

位置更新时的回调

@Overridepublic 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);}

7.DEMO实例

效果展示截图

有兴趣的各位同学,可以点击这里下载源码。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。