百度、高德地图功能进一步探索之—地图显示和定位功能(一)

 一直以来感觉地图功能的开发是个难点,我通常做法都是Copy之前的项目中的地图功能,根据UI需要改一下。如果有其他的需求再去百度一下,这也无可厚非。平时项目对地图的使用就是定位,poi搜索啊这些功能,一般不会涉及其他功能。但最近公司有一个项目,涉及到地图上添加假覆盖物,说以这就难道了我,查阅多资料结果都不是很理想没办法你能去看开发平台的Api文档,再两天的探索下降百度地图和高德地图的,Marker覆盖物 Polyline(折线)  Polygon(多边形)  Circle(圆形)的使用有了一定的了解,一下对这些覆盖物的实际使用做一下描述,一些仅为 个人项目实际运用后的总结不一定 准确

  • Marker覆盖物:主要做位置的标注,如共享单车软件中车子的位置就是通过Marker覆盖物做的
  • Polyline(折线):主要再地图上话轨迹,例如通过共享单车的行车记录我们看到某一次行程的轨迹
  • Polygon(多边形),Circle(圆形):这两个个一般做电子围栏划定和位置判断使用的

准备工作:

百度、高德地图应用平台账号申请,应用创建这些大家都清楚就不详细介绍了,关于SHA1的获取高德地图开发者平台查看

高德地图:需要使用2D地图和定位模块,高德地图可以直接使用 依赖,这比较好,也是现在开发平台通用的方式,集成方便

百度:需要根据用户需要下线集成包,使用的功能也是地图基础包和定位模块

 

开始集成

为了详细先介绍一下地图的基本配置和定位功能

1.高德地图

引入依赖:

implementation 'com.amap.api:map2d:5.2.0'
           implementation 'com.amap.api:location:4.2.0'  //根据用户需要考虑是否需要定位功能

清单文件配置:

权限:
























其他配置:


 

布局中添加如下代码,这个地地图的显示控件

注意使用地图需要添加如下代码,及在onResume(),onSaveInstanceState(),onPause(),onDestroy()方法中调用MapView的对应方法,不然会导致地图绘制的错了,尤其是onDestroy()缺少调用会引起内存泄漏:

百度、高德地图功能进一步探索之—地图显示和定位功能(一)_第1张图片

高德地图的操作主要使用的是 com.amap.api.maps2d.AMap(点击查看api) 对象

通过mapView.getMap();可以获取当前地图视图的操作对象AMap

地图的基础配置:   

 aMap.setOnMapClickListener(this);

 aMap.moveCamera(CameraUpdateFactory.zoomTo(16f)) //设置地图的缩放级别(一般1-32)
// 设置默认定位按钮是否显示 true表示地图自有定位按钮死显示
 aMap.getUiSettings().setMyLocationButtonEnabled(true);
// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默
aMap.setMyLocationEnabled(true);

   

认是false,根据需要设置     

 aMap.setTrafficEnabled(true);// 是否显示实时交通信息,默认不显示

  aMap.setMapType(AMap.MAP_TYPE_NORMAL);// 设置地图的样式 MAP_TYPE_NORMAL:普通地图,MAP_TYPE_SATELLITE:卫星地图

如果定位成需要显示小蓝点需要添加如下配置:

val myLocationStyle = MyLocationStyle()
myLocationStyle.myLocationIcon(BitmapDescriptorFactory
        .fromResource(Color.BLACK))// 设置小蓝点的图标
myLocationStyle.strokeColor(Color.BLACK)// 设置圆形的边框颜色
myLocationStyle.radiusFillColor(Color.argb(100, 0, 0, 180))// 设置圆形的填充颜色
myLocationStyle.strokeWidth(2.0f)// 设置圆形的边框粗细
aMap.setMyLocationStyle(myLocationStyle) // 将自定义的 myLocationStyle 对象添加到地图上

代码写到这来你运行代码就能看到高德地图的面目了,但是到目前这样对我们来说毫无用处,最少加上定位才像个地图

定位配置如下:

aMap.setLocationSource(this)// 设置定位监听需要实现LocationSource接口

接口中的两个方法如下

百度、高德地图功能进一步探索之—地图显示和定位功能(一)_第2张图片

AMapLocationClient对象官方文档的描述是定位服务类,我的理解就是一个定位客户端
AMapLocationClientOption对象主要是定位具体参数的设置
mlocationClient.setLocationListener(AMapLocationListener var1);该监听的设置是为了获取定位结果 onLocationChanged(AMapLocation var1);方法中会获取到定位结果:

百度、高德地图功能进一步探索之—地图显示和定位功能(一)_第3张图片

根据自己的需求对定位成功后做处理,具体就不详细介绍了,以上为高德地图的地图显示+定位功的实现,一般用户会根据定位结果进行poi检索

1.百度地图

导入SDK(百度没有自动集成的依赖只能手动导入SDK):

选择相关服务打包下载

百度、高德地图功能进一步探索之—地图显示和定位功能(一)_第4张图片导入sdk百度开发指南

清单文件配置:

权限同上

其他配置:


布局中添加如下代码,这个地地图的显示控件

注意:使用了该控件的布局文件在setContentView(layout.activity_bd_map)之前一定要进行初始化(调用SDKInitializer.initialize(getApplicationContext());代码)

同样要在控件的activity的onResume(),onSaveInstanceState(),onPause(),onDestroy()方法中调用控件对应的方法

百度地图使用com.baidu.mapapi.map.BaiduMap(点击查看api)对象操作地图BaiduMap对象可以通过bd_MapView.getMap()获取,有没有时曾相识的感觉,没错和高德地图的控件名称,获取地图操作类的名称都一样,后面还有更多相识的api

地图的基础配置:

//设置地图的模式
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); //MAP_TYPE_NORMAL:普通地图,MAP_TYPE_SATELLITE:卫星地图 

//开启定位图层
mBaiduMap.setMyLocationEnabled(true);
//设置地图的缩放级别
mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(16f));
/**
 * 设置地图允许所有的手势操作,根据需要可以去设置那些打开那些关闭
 * 使用的类为:java.lang.Object
 *                  com.baidu.mapapi.map.UiSettings
 * 参考Api:http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v5.2.0/index.html
 */
mBaiduMap.uiSettings.setAllGesturesEnabled(true)

基础配置完成,到这来你就看看到百度地图样子了

定位功能配置:

mLocationClient = LocationClient(getApplicationContext());     //声明LocationClient类

//注册监听函数
MyLocationListener myLocationListener = MyLocationListener();
initLocation()
mLocationClient.registerLocationListener(myLocationListener);
//开启定位
mLocationClient.start();
//图片点击事件,回到定位点
mLocationClient.requestLocation();

MyLocationListener类为是BDAbstractLocationListener抽象类的实现主要为定位成功的回调(如下代码我是通过kotlin实现的)

//实现BDLocationListener接口,BDLocationListener为结果监听接口,异步获取定位结果
    inner class MyLocationListener : BDAbstractLocationListener() {

        override fun onReceiveLocation(location: BDLocation) {

            //根据定位到的经纬度做响应的操作
            latLng = LatLng(location.latitude, location.longitude)
            setLocationData(latLng!!)
        }

        override fun onConnectHotSpotMessage(s: String?, i: Int) {

        }
    }

initLocation方法具体内容如下:主要是定位参数的设置和高德有点大同小异有详细的注解就不一一详说了

//配置定位SDK参数
private fun initLocation() {
    val option = LocationClientOption()
    option.locationMode = LocationClientOption.LocationMode.Hight_Accuracy//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
    option.setCoorType("bd09ll")//可选,默认gcj02,设置返回的定位结果坐标系
    option.setScanSpan(1000)//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
    option.setIsNeedAddress(true)//可选,设置是否需要地址信息,默认不需要
    option.isOpenGps = true//可选,默认false,设置是否使用gps
    option.isLocationNotify = true//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
    option.setIsNeedLocationDescribe(true)//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation
    // .getLocationDescribe里得到,结果类似于“在北京天安门附近”
    option.setIsNeedLocationPoiList(true)//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
    option.setIgnoreKillProcess(false)
    option.isOpenGps = true // 打开gps

    //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
    option.SetIgnoreCacheException(false)//可选,默认false,设置是否收集CRASH信息,默认收集
    option.setEnableSimulateGps(false)//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
    mLocationClient.locOption = option
}

给地图设置定位数据,让地图将定位的的当前地址显示到可是区域代码如下(kotlin代码实现):

//让地图将小圆点显示到定位位置 
mBaiduMap.setMyLocationData( MyLocationData.Builder()
                // 此处设置开发者获取到的方向信息,顺时针0-360
                .direction(100f).latitude(latLng.latitude)
                .longitude(latLng.longitude).build())

//让地图将制定的地址显示大可是区域
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(latLng))

 

到这里百度地图的基础使用也实现完成了。

百度地图和高德地图的基础实现到这里已经全部完成,希望对您有帮助,编写文章为以后查找资料方便

 

你可能感兴趣的:(地图,Android)