地图显示功能实现
1. 引言
UX SDK提供的功能包括:
地图: 基本设置,绘制标记点、线段、圆、多边形,地图上的事件回调等
定位: 支持定位,后台定位,更新方向等功能
搜索: 目前苹果只支持了Geocode搜索,尚不支持POI搜索
2.整体框架
地图框架主要分为地图、搜索、定位三部分。三者互相独立,可分别使用不同的地图SDK支持。
2.1 地图,也是该组件的最主要部分
- 一些基本设置: 缩放等级、显示区域、地图类型等
- 地图上的绘制: 标记点、线段、圆、多边形等
- 地图上事件回调: 标记点击拖拽、点击地图等
2.2 搜索和定位
3.接口与对应类文件表
Provider | Apple |
---|---|
AutelMapView: 地图 | AutelAppleMapView |
AutelAnnotationOptions:标记点配置 | |
AutelAnnotation: 标记点 | AutelAppleAnnotation |
AutelAnnotationView: 标记点视图 | AutelAppleAnnotationView |
AutelCustomAnnotationView:自定义标记点 | |
AutelOverlay:图形 | |
AutelPolyline:线段 | AutelApplePolyline |
AutelCircle:圆形 | AutelAppleCircle |
AutelPolygon:多边形 | AutelApplePolygon |
AutelOverlayOptions:图形配置 | |
AutelPolylineOptions:线段配置 | |
AutelCircleOptions:圆形配置 | |
AutelPolygonOptions:多边形配置 | |
AutelOverlayRenderer:图形绘制 | |
AutelPolylineRenderer:线段绘制 | AutelApplePolylineRenderer |
AutelCircleRenderer:圆形绘制 | AutelApplePolylineRenderer |
AutelPolygonRenderer:多边形绘制 | AutelApplePolygonRenderer |
ATCustomRenderer:自定义绘制 | |
AutelLocationManager:定位 | AutelAppleLocationManager |
AutelGeocoder:搜索 | AutelAppleGeocoder |
AutelPlacemark:位置 |
4. 功能模块
下面介绍SDK提供的一些地图核心功能模块,包括:
设置显示禁飞区、限高区、授权区
飞行轨迹展示功能
街道地图、GPS及混合地图展示功能
定位到我的位置或home点功能
4.1 创建AutelMapView
AutelMapView由ATMapManager 地图管理类创建,创建其对象代码如下所示:
lazy var mapManager: ATMapManager = {
let manager = ATMapManager.manager
manager.mapView.isPitchEnabled = false
manager.drawDelegate = self
manager.startLocationAndUpdate()
return manager
}()
lazy var mapView: AutelMapView {
return mapManager.mapView
}
在控制器中添加AutelMapView并设置其约束,这样就能显示地图界面,代码如下所示:
view.addSubview(mapView)
mapView.snp.makeConstraints { (make) in
make.edges.equalToSuperview()
}
实现ATMapDrawDelegate代理,代码如下所示:
extension ATBaseMapViewController: ATMapDrawDelegate{
func mapIsMainVC() -> Bool {
return true
}
func unitSystem() -> UnitSystem {
return ATSettings.shared.unitSystem
}
func maxFlightRadius() -> Float?{
return FlightLimitationService.shared.maxFlightRadius
}
func updateHomeLocation(coordinate: CLLocationCoordinate2D?){
let message = "ATMapHomePointRefresh".fLocal("ATFly")
ToastManager.shared.show(title: message)
ATSpeechManager.shared.speak(text: message, clear: false)
}
}
显示的地图如下图所示:
4.2 设置显示禁飞区、限高区、授权区
调用ATMapDrawManager地图绘制管理类提供的showNoFlyZones方法,在地图上设置显示禁飞区、限高区、授权区
func showNoFlyZones(_ level: ATNoFlyZoneAreaLevel, show: Bool)
示例代码如下所示:
ATMapManager.manager.drawManager.showNoFlyZones(level, show: isSelected)
4.3 飞行轨迹展示功能
设置飞行轨迹展示功能代码如下所示:
ATMapManager.manager.setting.isShowFlightRoute = true
显示飞行轨迹时,飞行轨迹如下图绿色线条所示:
隐藏飞行轨迹时,绿色线条将隐藏,如下图所示:
清除飞行轨迹代码如下所示:
ATMapManager.manager.cleanFlightPath()
4.4 设置地图类型
地图类型包括标准、卫星、混合地图,枚举值如下所示:
public enum AutelMapType : Int {
case standard
case satellite
case hybrid
}
如下代码将地图类型设置为标准类型:
var mapType = AutelMapType.standard
ATMapManager.manager.setting.mapType = mapType
4.5 定位功能
能够定位到我、返航点、飞行器的位置,设置定位代码如下所示:
ATMapManager.manager.mapLocateAround(.aircraft)
如下图所示,1为我的位置、2为返航点位置、3为飞行器位置
4.6 更新飞行器机头方向
在飞行过程中,飞行器机头方向要与飞行方向保持一致,在以下情况下需要更新飞行器机头方向:
1.实现MainControllerProtocol协议,在updateDroneLocation方法中调用更新机头方向的方法,代码如下:
@objc extension ATBaseMapViewController: MainControllerProtocol {
func updateDroneLocation(coordnidate: CLLocationCoordinate2D) {
mapManager.drawManager.updateDroneLocation(coordnidate)
upDroneHeading()
}
}
刷新地图上飞行器图标的机头方向代码如下所示:
func upDroneHeading() {
if let annotation = mapManager.drawManager.aircraftAnnotation, let annotationView: ATAircraftAnnotationView = annotation.customAnnotationView as? ATAircraftAnnotationView {
annotationView.updateHeading(heading: (AutelMCState.shared.attitude.yaw) + Float(-mapView.cameraHeading.radian))
}
}
2.订阅headingUpdateObservable序列,参考代码如下所示:
mapManager.headingUpdateObservable.subscribe(onNext: {[weak self] (newHeading: CLHeading) in
if newHeading.headingAccuracy < 0 {
return
}
self?.updateHeading(newHeading)
}).disposed(by: bag)
func updateHeading(_ newHeading: CLHeading) {
if mapView.cameraHeading != 0 {
mapView.cameraHeading = 0
}
upDroneHeading()
}