Skip to main content

地图显示功能实现

1. 引言

UX SDK提供的功能包括:

  • 地图: 基本设置,绘制标记点、线段、圆、多边形,地图上的事件回调等

  • 定位: 支持定位,后台定位,更新方向等功能

  • 搜索: 目前苹果只支持了Geocode搜索,尚不支持POI搜索

2.整体框架

地图框架主要分为地图、搜索、定位三部分。三者互相独立,可分别使用不同的地图SDK支持。

2.1 地图,也是该组件的最主要部分

  • 一些基本设置: 缩放等级、显示区域、地图类型等
  • 地图上的绘制: 标记点、线段、圆、多边形等
  • 地图上事件回调: 标记点击拖拽、点击地图等

mapView

2.2 搜索和定位

searchAndGeocode

3.接口与对应类文件表

ProviderApple
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)
}
}

显示的地图如下图所示:

AutelMapView

4.2 设置显示禁飞区、限高区、授权区

调用ATMapDrawManager地图绘制管理类提供的showNoFlyZones方法,在地图上设置显示禁飞区、限高区、授权区

func showNoFlyZones(_ level: ATNoFlyZoneAreaLevel, show: Bool)

示例代码如下所示:

ATMapManager.manager.drawManager.showNoFlyZones(level, show: isSelected)

4.3 飞行轨迹展示功能

设置飞行轨迹展示功能代码如下所示:

ATMapManager.manager.setting.isShowFlightRoute = true

显示飞行轨迹时,飞行轨迹如下图绿色线条所示:

showFlightPath

隐藏飞行轨迹时,绿色线条将隐藏,如下图所示:

hideFlightPath

清除飞行轨迹代码如下所示:

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为飞行器位置

location

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()
}