Skip to main content

Realization of map function

1. Introduction​

UX SDK provides the following functionalities:

  • Map: Configure basic settings, create points, draw lines, circles, and polygons on the map, and implement event callbacks

  • Location tracking: Support location tracking, backend location tracking, and direction updating

  • Search: Currently, only Geocode search is supported for Apple Map. The POI search is not supported.

2. Entire Framework​

The map framework consists of three parts: map, search, and location tracking. The three parts are independent from each other and implemented using different map SDKs.

2.1 Map (Primary)​

  • Basic settings: Zoom level, display area, map type
  • Drawings on the map: Points, lines, circles, and polygons
  • Event callbacks: Callback of point clicking, point dragging, and map clicking events

mapView

2.2 Search and Location Tracking​

searchAndGeocode

searchAndGeocode

3. APIs and Corresponding Class Files​

ProviderApple
AutelMapView: MapAutelAppleMapView
AutelAnnotationOptions: point configuration
AutelAnnotation: Marking pointsAutelAppleAnnotation
AutelAnnotationView: Marking point viewAutelAppleAnnotationView
AutelCustomAnnotationView: point customization
AutelOverlay: graph
AutelPolyline: lineAutelApplePolyline
AutelCircle: circleAutelAppleCircle
AutelPolygon: polygonAutelApplePolygon
AutelOverlayOptions: graphic configuration
AutelPolylineOptions: line configuration
AutelCircleOptions: circle configuration
AutelPolygonOptions: polygon configuration
AutelOverlayRenderer: graphic drawings
AutelPolylineRenderer: line drawingsAutelApplePolylineRenderer
AutelCircleRenderer: circle drawingsAutelApplePolylineRenderer
AutelPolygonRenderer: polygon drawingsAutelApplePolygonRenderer
ATCustomRenderer: customized drawings
AutelLocationManager: location trackingAutelAppleLocationManager
AutelGeocoder: searchAutelAppleGeocoder
AutelPlacemark: location

4. Function Modules​

The following describes core map functionalities provided by the SDK, including:

  • Display No Fly Zones, Restricted Altitude Zones, and Authorized Zones

  • Display flight paths

  • Display street views, GPS live maps, and hybrid maps

  • Find my current location or Home point

4.1 Create AutelMapView​

Create a map view named AutelMapView using ATMapManager. The following shows the code for creating the view:

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
}

Add AutelMapView to the controller and configure the constraint. In this way, the map UI can be shown. The code is shown below:

view.addSubview(mapView)
mapView.snp.makeConstraints { (make) in
make.edges.equalToSuperview()
}

Implement ATMapDrawDelegate. The code is shown below:

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

The displayed map is shown below:

AutelMapView

4.2 Display No Fly Zones, Restricted Altitude Zones, and Authorized Zones​

Call the showNoFlyZones method provided by ATMapDrawManager to display No Fly Zones, Restricted Altitude Zones, and Authorized Zones.

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

The code example is shown below:

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

4.3 Display Flight Paths​

The code for displaying flight paths is shown below:

ATMapManager.manager.setting.isShowFlightRoute = true

When you configure to display flight paths, the map uses green lines to represent these paths, as shown in the following picture:

showFlightPath

When you configure to hide flight paths, the green lines are hidden accordingly, as shown in the following picture:

hideFlightPath

The code for clearing flight paths is shown below:

ATMapManager.manager.cleanFlightPath()

4.4 Set the Map Type​

Maps are classified into three types: Standard, Satellite, and Hybrid. The enumeration values are shown below:

public enum AutelMapType : Int {
case standard
case satellite
case hybrid
}

The following code sets the map type to Standard:

var mapType = AutelMapType.standard
ATMapManager.manager.setting.mapType = mapType

4.5 Location Tracking​

You can use this functionality to find your current location, Home point, and aircraft location. The code for enabling this functionality is shown below:

ATMapManager.manager.mapLocateAround(.aircraft)

As shown in the following picture, 1 indicates your current location, 2 indicates the Home point, and 3 indicates the aircraft position.

location

4.6 Update the Head Direction of the Aircraft​

During the flight, the head direction should be the same as the direction the aircraft will being flying. Perform the following steps to update the head direction:

1. Implement MainControllerProtocol and call a method in the updateDroneLocation method to update the head direction. The corresponding code is shown below:

@objc extension ATBaseMapViewController: MainControllerProtocol {
func updateDroneLocation(coordnidate: CLLocationCoordinate2D) {
mapManager.drawManager.updateDroneLocation(coordnidate)
upDroneHeading()
}
}

The code for updating the head direction of the aircraft icon on the map is shown below:

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. Subscribe to the headingUpdateObservable sequence. The reference code is shown below:

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