1. 1.地图显示

1.1.1. 参考链接

1.1.2. 一、集成百度地图

第1步:注册和获取密钥

第2步:CocoaPods 自动配置,在.podspec文件中增加依赖

s.dependency 'BaiduMapKit', '6.3.0'

1.1.3. 二、集成高德地图

第1步:获取Key

第2步:CocoaPods 自动配置,在.podspec文件中增加依赖

s.dependency 'AMap3DMap', '7.9.0'

1.1.4. 三、抽象工厂

特点->比工厂方法产品种类多。

抽象产品 具体产品 抽象工厂 具体工厂
简单工厂 - 1 - N
工厂方法 1 N 1 N
抽象工厂 N N 1 N

1.1.5. 四、地图SDK角色分析

抽象产品:MapViewProtocol、MapLocationProtocol

具体产品:BaiduMapView、GaodeMapView、BaiduMapLocation、GaodeMapLocation

抽象工厂:MapFactoryProtocol

具体工厂:BaiduMapFactory、GaodeMapFactory

地图引擎:MapEngine

1.1.6. 五、显示地图

第1步:抽象地图协议

/// 地图协议
public protocol MapViewProtocol: NSObjectProtocol {
    /// 初始化
    /// - Parameter frame:
    init(frame: CGRect)
    /// 获取地图
    func getView() -> UIView
}

第2步:定义具体地图

高德地图
import MAMapKit

/// 高德地图
class GaodeMapView: NSObject, MapViewProtocol {

    private var mapView: MAMapView!
    /// 初始化
    /// - Parameter frame:
    required init(frame: CGRect) {
        super.init()
        mapView = MAMapView(frame: frame)
    }
    /// 获取地图
    func getView() -> UIView {
        return mapView
    }
}
百度地图
import BaiduMapAPI_Map

/// 百度地图
class BaiduMapView: NSObject, MapViewProtocol {

    private var mapView: BMKMapView!
    /// 初始化
    /// - Parameter frame:
    required init(frame: CGRect) {
        super.init()
        mapView = BMKMapView(frame: frame)
    }
    /// 获取地图
    func getView() -> UIView {
        return mapView
    }
}

第3步:抽象工厂

/// 地图工厂标准
public protocol MapFactoryProtocol: NSObjectProtocol {
    /// 初始化
    /// - Parameter appKey: 第三方地图AppKey
    init(appKey: String)
    /// 获取地图
    /// - Parameter frame: 
    func getMapView(frame: CGRect) -> MapViewProtocol
}

第4步:定义具体地图工厂

高德地图工厂
import MAMapKit

/// 高德地图工厂
class GaodeMapFactory: NSObject, MapFactoryProtocol {
    /// 初始化
    /// - Parameter appKey: 第三方地图AppKey
    required init(appKey: String) {
        super.init()
        AMapServices.shared()?.apiKey = appKey
    }
    /// 获取地图
    /// - Parameter frame:
    func getMapView(frame: CGRect) -> MapViewProtocol {
        return GaodeMapView(frame: frame)
    }
}
百度地图工厂
import BaiduMapAPI_Map

/// 高德地图工厂
class BaiduMapFactory: NSObject, MapFactoryProtocol {
    private let mapManager = BMKMapManager()
    /// 初始化
    /// - Parameter appKey: 第三方地图AppKey
    required init(appKey: String) {
        super.init()
        let result = mapManager.start(appKey, generalDelegate: self)
        if !result {
            print("manager start failed!!!")
        }
    }
    /// 获取地图
    /// - Parameter frame:
    func getMapView(frame: CGRect) -> MapViewProtocol {
        return BaiduMapView(frame: frame)
    }
}
百度地图工厂需要实现下创建协议
extension BaiduMapFactory: BMKGeneralDelegate {

    func onGetNetworkState(_ iError: Int32) {
        if iError == 0 {
            print("联网成功")
        } else {
            print("onGetNetworkState:\(iError)")
        }
    }

    func onGetPermissionState(_ iError: Int32) {
        if iError == 0 {
            print("授权成功")
        } else {
            print("onGetPermissionState:\(iError)")
        }
    }
}

第5步:定义地图引擎

通过读取工厂配置,获取激活的地图工厂。

注意:CQConfigManager可以读取config.xml,获取当前激活的地图工厂,这样可以不修改代码,无缝切换百度/高德地图。

/// 地图引擎
public class MapEngine: NSObject {

    /// 根据配置获取地图工厂
    /// - Returns: 地图工厂
    public func getFactory() -> MapFactoryProtocol? {
        let mapPlatform = CQConfigManager.shared.config.mapPlatform
        if let factoryName = mapPlatform?.factoryName, let appKey = mapPlatform?.appKey {
            // 百度地图工厂
            if factoryName == "BaiduMapFactory" {
                return BaiduMapFactory(appKey: appKey)
            }
            // 高德地图工厂
            if factoryName == "GaodeMapFactory" {
                return GaodeMapFactory(appKey: appKey)
            }
        }
        return nil
    }
}

第6步:显示地图

注意:CQMapSDK是地图SDK,包含以上的源代码,而ViewController则是Demo工程的页面。

import CQMapSDK

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // 显示地图
        let engine = MapEngine()
        let factory = engine.getFactory()
        if let mapView = factory?.getMapView(frame: view.bounds) {
            view.addSubview(mapView.getView())
        }
    }
}

results matching ""

    No results matching ""