定位点

地图 SDK 提供了定位点控件,帮助开发者方便地实现地图上的定位点绘制需求。


展示定位点

再打开定位点展示开关前,用户必须配置为地图设置定位源(LocationSource),定位源的作用就是为定位点提供要放置的位置。作为地图 SDK 的一个接口类,用户应实现这个接口,这个类中提供了以下功能:


接口 功能
activate( LocationSource.OnLocationChangedListener var1) 当用户开启展示定位点时,SDK 会回调这个方法,并将 SDK 内部的位置监听器返回给用户,用户可以通过这个位置监听器设置定位点的坐标、精度等位置信息
deactivate() 当用户关闭定位点展示时会回调这个方法,用户应在此时销毁监听位置时申请的所有资源

下面我们使用腾讯定位 SDK 作为定位源演示定位点的展示功能。

1、配置腾讯定位SDK

 Location location = new Location(“LongPressLocationProvider”);
/**
* 定位的一些初始化设置
*/
private void initLocation(){
    //用于访问腾讯定位服务的类, 周期性向客户端提供位置更新
    locationManager = TencentLocationManager.getInstance(this);
    //创建定位请求
    locationRequest = TencentLocationRequest.create();
    //设置定位周期(位置监听器回调周期)为3s
    locationRequest.setInterval(3000);
}

/**
* 腾讯定位SDK位置变化回调
*/
@Override
public void onLocationChanged(TencentLocation tencentLocation, int i, String s) {
    //其中 locationChangeListener 为 LocationSource.active 返回给用户的位置监听器
    //用户通过这个监听器就可以设置地图的定位点位置
    if(i == TencentLocation.ERROR_OK && locationChangedListener != null){
        //设置经纬度
        location.setLatitude(tencentLocation.getLatitude());
        location.setLongitude(tencentLocation.getLongitude());
        //设置精度,这个值会被设置为定位点上表示精度的圆形半径
        location.setAccuracy(tencentLocation.getAccuracy());
        //设置定位标的旋转角度,注意 tencentLocation.getBearing() 只有在 gps 时才有可能获取
        //location.setBearing((float) tencentLocation.getBearing());
        //设置定位标的旋转角度,注意 tencentLocation.getDirection() 返回的方向,仅来自传感器方向,如果是gps,则直接获取gps方向
        location.setBearing((float) tencentLocation.getDirection());
        //将位置信息返回给地图
        locationChangedListener.onLocationChanged(location);
    }
}

2、实现LocationSource

@Override
 public void activate(OnLocationChangedListener onLocationChangedListener) {
     //这里我们将地图返回的位置监听保存为当前 Activity 的成员变量
     locationChangedListener = onLocationChangedListener;
     //开启定位
     int err = locationManager.requestLocationUpdates(
         locationRequest, this, Looper.myLooper());
     switch (err) {
         case 1:
             Toast.makeText(this,
                 "设备缺少使用腾讯定位服务需要的基本条件",
                 Toast.LENGTH_SHORT).show();
             break;
         case 2:
             Toast.makeText(this,
                 "manifest 中配置的 key 不正确", Toast.LENGTH_SHORT).show();
             break;
         case 3:
             Toast.makeText(this,
                 "自动加载libtencentloc.so失败", Toast.LENGTH_SHORT).show();
             break;
         default:
             break;
     }
 }

 @Override
 public void deactivate() {
     //当不需要展示定位点时,需要停止定位并释放相关资源
     locationManager.removeUpdates(this);
     locationManager = null;
     locationRequest = null;
     locationChangedListener=null;
 }

3、设置定位源并打开位置显示开关

//地图上设置定位数据源
tencentMap.setLocationSource(this);
//设置当前位置可见
tencentMap.setMyLocationEnabled(true);



修改定位点样式

通常开发者希望展示自己的定位点样式以满足自己 APP 的整体设计,我们的地图 SDK 通过 MyLocationStyle 这个类提供了定制化定位点样式的能力,下面列出了部分定制化能力,更多内容请参考接口文档

接口 功能
anchor(float u, float v) 定位图标的锚点位置,默认为 (0.5f, 0.5f)
icon(BitmapDescriptor myLocationIcon) 定位点的图标
fillColor(int fillColor) 以圆形表示的定位精度的填充颜色
strokeColor(int strokeColor) 以圆形表示的定位精度的描边颜色
strokeWidth(int strokeWidth) 以圆形表示的定位精度的描边宽度



定位点模式

在地图的各种应用场景中,用户对定位点展示时也希望地图能跟随定位点旋转、移动等多种行为。在腾讯地图 SDK 中开发者可以通过 MyLocationStyle.myLocationType(int myLocationType) 接口设置定位点展示时地图的行为模式:

模式 说明
LOCATION_TYPE_FOLLOW_NO_CENTER 连续定位,但不会移动到地图中心点,并且会跟随设备移动
LOCATION_TYPE_LOCATION_ROTATE 连续定位,且将视角移动到地图中心,定位点依照设备方向旋转,并且会跟随设备移动,默认是此种类型
LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER 连续定位,但不会移动到地图中心点,定位点依照设备方向旋转,并且跟随设备移动
LOCATION_TYPE_MAP_ROTATE_NO_CENTER 连续定位,但不会移动到地图中心点,地图依照设备方向旋转,并且会跟随设备移动



内置定位标点击回调监听

//SDK版本4.3.5新增内置定位标点击回调监听
        tencentMap.setMyLocationClickListener(new TencentMap.OnMyLocationClickListener() {
            @Override
            public boolean onMyLocationClicked(LatLng latLng) {
                Toast.makeText(LocationLayerActivity.this, "内置定位标点击回调", Toast.LENGTH_SHORT).show();
                return true;
            }
        });

效果图




注意事项

 请注意,地图 SDK 只提供地图的展示效果,定位能力需要接入 定位SDK
 定位蓝点层级是最高的,如果使用定位蓝点的同时设置了图层会被蓝点压盖,此时可以通过定位结果拿到旋转角度传给marker的rotation替代蓝点功能

这篇文章对您解决问题是否有帮助?

已解决
未解决