Mapbox v10如何获取用户精确位置及实现相机平滑定位到用户位置
Mapbox Maps v10.0.1 位置获取与用户跟踪模式实现方案
正确获取用户坐标实现相机平滑移动
原代码无法生效的两个核心原因:
- 未对可选值
latestLocation做安全解包,调用时位置未完成初始化导致传入空值,构造了无效相机参数 - 未指定相机缩放级别,默认缩放层级极低,视觉上会出现相机未移动的错觉
所谓弧度制坐标为误区,Location.coordinate返回的确实是标准CLLocationCoordinate2D格式(十进制度数),仅Mapbox内部的私有Coordinate2D结构体使用弧度存储,不影响上层调用。
正确实现代码如下:
// 提前申请位置权限,获得用户授权后再执行以下逻辑 // 可选配置:显示用户位置标点 mapView.location.options.puckType = .puck2D() // 监听位置更新回调,拿到有效坐标后再执行相机移动 mapView.location.onLocationChange.observe { [weak self] newLocations in guard let self = self, let userCoordinate = newLocations.last?.coordinate else { return } // 构造相机参数,可根据需求调整zoom、padding等参数 let cameraOptions = CameraOptions( center: userCoordinate, padding: .zero, zoom: 16, bearing: nil, pitch: nil ) // 执行平滑移动动画 self.mapView.camera.ease(to: cameraOptions, duration: 1.0) // 仅执行一次移动的话,监听完成后移除回调避免重复触发 self.mapView.location.onLocationChange.cancel() }
实现旧版mapView.setUserTrackingMode(.follow, animates: true)效果
Mapbox v10版本已经将用户跟踪能力整合到Viewport模块中,直接调用系统封装好的跟随状态即可实现相同效果:
// 构造跟随用户标点的viewport状态 let followState = mapView.viewport.makeFollowPuckViewportState( options: FollowPuckViewportStateOptions( zoom: 16, bearing: .heading, // 跟随设备朝向,传入.constant(0)则固定朝北 pitch: 0 ) ) // 切换到跟随状态,带平滑过渡动画 mapView.viewport.transition(to: followState, transition: DefaultViewportTransition(duration: 1.0))
如果需要退出跟随模式(比如用户手动滑动地图后自动取消跟随),调用以下代码即可:
mapView.viewport.idle()
内容的提问来源于stack exchange,提问作者Jan L
相关产品推荐
相关产品推荐

