基于MapView绘制用户运动轨迹

1.新建一个SingleView Application。
2.导入地图框架#import
3.新建一个类RunningViewController,继承自UIViewController,遵守MAMapViewDelegate,该类用来专门展示跑步过程中的地图界面,同时创建RunningViewController.xib文件。

class RunningViewController: UIViewController, MAMapViewDelegate

4.实例化地图和定位相关属性,将一个UIView拖到RunningViewController.xib的视图上,设置四边具体父视图的间距为0,并链接上mapView。

@IBOutlet weak var mapView: MAMapView!
var coordinateArray: [CLLocationCoordinate2D] = []

5.coordinateArray数组用来存储每次获取的定位更新数据,绘制路径时需要用到。
在viewDidLoad的时候进行地图初始化的设置

override func viewDidLoad() {
    super.viewDidLoad()

    initMapView()
}

func initMapView()
{
    mapView.delegate = self
    mapView.zoomLevel = 15.5
    mapView.distanceFilter = 3.0
    mapView.desiredAccuracy = kCLLocationAccuracyBestForNavigation
}

6.将视图控制器设置为mapView的代理,当位置变化更新时通过代理进行回调,绘制路径时也需要通过代理进行属性的设置
zoomLevel为当前地图缩放的比例
distanceFilter为定位的最小更新距离,当移动距离超过设定的值时便会有位置的更新回调
desiredAccuracy为定位精度,默认为最高精度,一般直接用这个就好
当视图显示后,开始进行定位。

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    startLocation()
}

func startLocation()
{
    mapView.showsUserLocation = true
    mapView.userTrackingMode = MAUserTrackingMode.Follow
    mapView.pausesLocationUpdatesAutomatically = false
    mapView.allowsBackgroundLocationUpdates = true
}

showsUserLocation设为true后便开始进行定位,设为false则定位停止。定位本身会比较耗点,应用在不需要定位时记得将定位功能关闭,否则你的手机电量会消耗很快滴。
userTrackingMode为定位的方式,查看接口可知有三种形式,这里采用跟随用户位置移动的定位方式
allowsBackgroundLocationUpdates设置为true表示允许进行后台定位,保证之前有设置过App registers for location updates属性,否则会崩溃。

7.代理的实现
每次有位置更新变会调用mapView(mapView: MAMapView, didUpdateUserLocation userLocation: MAUserLocation, updatingLocation: Bool)函数。

// MARK: MAMapViewDelegate

func mapView(mapView: MAMapView, didUpdateUserLocation userLocation: MAUserLocation, updatingLocation: Bool)
{
    // 地图每次有位置更新时的回调

    if updatingLocation {
        // 获取新的定位数据
        let coordinate = userLocation.coordinate

        // 添加到保存定位点的数组
        self.coordinateArray.append(coordinate)

        updatePath()
    }
}

通过updatePath函数进行路径的绘制

func updatePath () {

    // 每次获取到新的定位点重新绘制路径

    // 移除掉除之前的overlay
    let overlays = self.mapView.overlays
    self.mapView.removeOverlays(overlays)

    let polyline = MAPolyline(coordinates: &self.coordinateArray, count: UInt(self.coordinateArray.count))
    self.mapView.addOverlay(polyline)

    // 将最新的点定位到界面正中间显示
    let lastCoord = self.coordinateArray[self.coordinateArray.count - 1]
    self.mapView.setCenterCoordinate(lastCoord, animated: true)
}

removeOverlays用来移除掉之前的路径。
addOverlay添加重新绘制的路径。
setCenterCoordinate将指定的坐标点显示在地图中间,保证在用户跑了很长的距离之后也不会超出地图的显示范围。

你可能感兴趣的:(基于MapView绘制用户运动轨迹)