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

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目录下。
libs目录
之后File->Project Structure
点击+号
点击+号,选择jar Dependency。
添加jar包
添加libs下的jar包。之后,OK。
在app目录下的build.gradle中就可以看到添加的内容。
依赖项
3.2 添加so文件
在main目录下,创建一个新的文件夹jniLibs。
将下载的so文件拷贝到jniLibs文件夹中。
so文件
到此,开发所依赖的环境已做好。
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.MapView
    android:id="@+id/bmapView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"/>

百度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

<com.amap.api.maps.MapView
    android: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);//设置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

<com.tencent.tencentmap.mapsdk.maps.MapView
    android: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","注册位置监听器失败!");
    }
}

位置更新时的回调

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

7.DEMO实例
效果展示截图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述有兴趣的各位同学,可以点击这里下载源码。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanjumufeng

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值