1. 1.地图显示
1.1.1. 参考链接
- 百度地图SDK
- 百度定位SDK
- 高德地图SDK
- 高德定位SDK
- 高德地图Doc
- 用高德地图API 通过详细地址获得经纬度
- Web服务API简介
- IOS高德3D地图画多边形,以及判断某一经纬度是否在该多边形内
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())
}
}
}