我的位置定位地图图片(地图怎么定位自己的位置)

我们成功获取到动态定位的权限之后,需要进一步获取到手机当前的定位信息,并在地图上能够显示出来。而鸿蒙APP的界面中要显示高德地图的当前定位,可以通过“小蓝点”这个图标来进行标记,让手机用户很明显地知道自己在哪里。

我的位置定位地图图片(地图怎么定位自己的位置)

手机定位-小蓝点

如上图,我们在高德地图中看到了一个“小蓝点”图标。引入高德地图SDK后,我们的鸿蒙APP要实现手机当前定位的“小蓝点”,需要以下4个步骤:

(1).打开华为手机中的【位置信息】开关,激活定位器Locator;

(2).开启Locator的定位,通过RequestParam选择手机的精确定位类型,获取LocatorCallback接口中实时发送的定位坐标值;

(3).通过高德地图SDK提供的Amap对象,在自己的slice类中创建全局变量,获取LocatorCallback接口类的onLocationReport()方法中输出的定位值location;

(4).获取到定位坐标数据后,通过LocationSource接口提供的监听器OnLocationChangedListener去触发“小蓝点”在高德地图上显示,我们还可以继续使用高德地图提供的MyLocationStyle对象来改变定位图标的样式风格,最后仍需要绑定到Amap对象中。

为了能够实现此功能,我们还是一起来敲下代码去实现它。

一. 从系统中获取到动态权限的支持后,我们首先打开华为手机中的【位置信息】开关,激活定位器Locator。

在激活Locator这个对象之前,我们一定获取到相应的位置权限,比如ohos.permission.LOCATION 和 ohos.permission.LOCATION_IN_BACKGROUND。

没有这两个权限,我们的手机定位数据会显示null, Locator这个对象也无法激活。如果你还没有实现“获取位置权限”的过程,可以搜索我上一篇的内容:鸿蒙开发版高德地图SDK-手机定位(一):获取手机的「位置」权限。

当位置权限能够进行动态的选择之后,我们要激活定位器Locator代码如下:

// 定位器private Locator locator;/** * 激活"位置信息"的locator开关 */public void isOpenLocationSwitch(){ HiLog.info(hilog,"获取定位器" ); locator = new Locator(getContext()); //判断“位置信息”开关是否已开启 if(locator.isLocationSwitchOn()){ HiLog.info(hilog,"[位置信息]开关已开启" ); //onLocationChangeListener(); } else { //结束定位 locator.stopLocating(mylocatorCallBack); } }

二.通过RequestParam选择设备的精确定位方式,让LocatorCallback接口能够实现定位数据的获取,并通过定位器locator的startLocating()方法开启定位。

我们需要选择设备的定位类型,可以使用RequestParam来选择更精确的定位方式,并通过LocatorCallback接口类去共同实现定位数据的获取,代码如下:

//上报设备定位信息private MylocatorCallBack mylocatorCallBack = new MylocatorCallBack();/** * 手机定位器开启后,获取定位实时数据 */public void onLocationChangeListener() {HiLog.info(hilog,"定位功能开始" ); // 定位类型,选择"导航场景" RequestParam requestParam = new RequestParam(RequestParam.SCENE_NAVIGATION); //实现 mylocatorCallBack 接口对象 mylocatorCallBack = new MylocatorCallBack(); HiLog.info(hilog,"开启定位" ); // 开启定位,获取定位数据 locator.startLocating(requestParam,mylocatorCallBack);}

三.通过LocatorCallBack接口类提供的onLocationReport()方法,获取实时的定位数据内容,并同时绑定到高德地图提供的Amap对象里面。

//地图控制器 private AMap aMap;//日志信息private static final HiLogLabel hilog = new HiLogLabel(HiLog.DEBUG, 0x0000, "APP_LOG"); /** * 上报设备定位信息 * 需要注意:MylocatorCallBack是“内部类”, * 把封装Amap对象的getLocation(location)方法 * 放到MylocatorCallBack类提供的onLocationReport(location)方法中, * 即可调用并获取到设备实时发送的定位数据信息 */ public class MylocatorCallBack implements LocatorCallback{ //获取定位数据 @Override public void onLocationReport(Location location) { HiLog.info(hilog,"AMap定位,Latitude为:" + location.getLatitude()+",Longitude为:" + location.getLongitude()); //绑定高德地图提供的Amap对象 getLocation(location); }@Override public void onStatusChanged(int i) { } @Override public void onErrorReport(int i) { } }/** * 获取当前坐标的经纬度值 */ public void getLocation(Location location){//通过高德地图提供的Amap对象,获取实时定位数据 LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude()); aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,16)); }

从上面的代码块中,我们通过日志对象hilog来获取到onLocationReport(Location location)方法中对参数Location实时输出的设备定位值,如下图:

我的位置定位地图图片(地图怎么定位自己的位置)

通过Hilog来打印设备当前的位置数据

获取到onLocationReport(Location location)方法中的定位数据后,我们要把这些实时定位数据都绑定到高德地图SDK提供的对象Amap中,让Amap来实现高德地图的当前定位,在上面我是通过自己定义的getLocation(Location location)方法来实现。

四.通过实现LocationSource接口,创建监听器OnLocationChangedListener这个对象,让监听器去触发当前位置-“小蓝点”的图标在地图上的显示,实现手机当前定位功能。

/** * MainAbilitySlice要实现LocationSource接口,获取OnLocationChangedListener监听器 */public class MainAbilitySlice extends AbilitySlice implements LocationSource{//定位监听器 private OnLocationChangedListener mListener = null;. . . /** * 获取当前坐标的经纬度值 */ public void getLocation(Location location){LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude()); aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,16)); HiLog.info(hilog,"AMap定位,Latitude为:" + location.getLatitude()+",Longitude为:" + location.getLongitude()); //绘制定位图标-小蓝点的样式 getMyLocationStyle(); //通过监听器OnLocationChangedListener,触发小蓝点在地图上的出现 mListener.onLocationChanged(location); } /** * 绘制定位点 */ private void getMyLocationStyle(){ HiLog.info(hilog,"绘制定位小蓝点" ); MyLocationStyle locationStyle = new MyLocationStyle();//初始化定位蓝点样式 locationStyle.anchor(0.0f,1.0f); aMap.setMyLocationStyle(locationStyle); locationStyle.interval(1000);//设置连续定位模式下的的定位间隔,值在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒// locationStyle.showMyLocation(true); locationStyle.strokeColor(Color.BLUE); //圆圈的边框颜色为蓝色 locationStyle.radiusFillColor(Color.LTGRAY); //圆圈的填充颜色 locationStyle.strokeWidth(400); aMap.setMyLocationStyle(locationStyle); //设置定位蓝点的style aMap.getUiSettings().setMyLocationButtonEnabled(false); // 设置默认定位按钮是否显示,非必须设置 aMap.setLocationSource(this); aMap.setMyLocationEnabled(true);//设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false } /** * 激活定位器 * @param onLocationChangedListener * LocationSource接口实现方法 */ @Override public void activate(OnLocationChangedListener onLocationChangedListener) { mListener = onLocationChangedListener; } /** * 关闭定位器 * LocationSource接口实现方法 */ @Override public void deactivate() { mListener = null; }}

在上面的代码中,我们自己的silice类需要通过LocationSource类来获取监听器OnLocationChangedListener,让监听器OnLocationChangedListener的onLocationChanged(location)方法去触发设备当前定位的图标-小蓝点在地图上能够显示,效果图如下:

我的位置定位地图图片(地图怎么定位自己的位置)

地图显示“小蓝点”

如果你感觉这个小蓝点不是自己喜欢的样式风格,我们可以通过上面代码块中提供的MyLocationStyle这个对象来继续改变定位图标的样式风格,效果图如下:

我的位置定位地图图片(地图怎么定位自己的位置)

使用MyLocationStyle这个对象,去改变小蓝点图标的样式

当然,MyLocationStyle这个对象也必须绑定到高德地图提供的Amap对象里面,只有Amap对象才能让小蓝点在高德地图中进行显示。

结语:

想要让鸿蒙版开发环境中的APP项目实现高德地图的当前定位-带箭头的“小蓝点”,需要先获取到手机当前定位的数据信息,然后再通过高德地图提供的Amap对象来绑定当前定位的数据信息,让高德地图能够显示我们所在的附近信息。

而定位图标“小蓝点”想要在高德地图上进行显示,必须要有监听器OnLocationChangedListener来进行触发,触发的结果仍需要绑定Amap对象,这样才能让“小蓝点”真正标记我们的当前位置。

注意:以上关于鸿蒙版高德地图的定位“小蓝点”的实现,本人并没有进行相关定位“坐标偏移量”的处理,和实际上的定位功能仍有差异,需要你们自己去进一步进行功能优化。

(0)
网赚圈子的头像网赚圈子注册用户

相关推荐

发表回复

登录后才能评论