iOS之Swift实现调用第三方地图应用导航

iOS之Swift实现调用第三方地图应用导航,第1张

iOS之Swift实现调用第三方地图应用导航 开始的一些话关于坐标系源码调用方法一点注意事项

开始的一些话

作为一个“半路出家”的iOS的程序猿,一直使用OC开发,也想过使用Swift,但一直没有时间和机会;但最近做了一个新的项目,为我提供了机会,整个App大部分使用了Swift进行编写。体会就是Swift是真的很简练,入门也比较容易。
现在开发基本完成,于是准备把这次开发中用到的一些知识总结出来,写的不好,还请见谅!

第二个是Swift实现调用第三方地图应用导航,实现了调用Apple地图、百度地图、腾讯地图和高德地图。

关于坐标系

美国GPS使用的是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置,这种坐标系成为地球坐标。
在我国,出于国家安全考虑,国内所有导航电子地图必须使用国家测绘局制定的加密坐标系统,即将一个真实的经纬度坐标加密成一个不正确的经纬度坐标,称之为火星坐标GCJ02。
此外,百度地图在GCJ02坐标系基础上再次加密,其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。

WGS84:大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
GCJ02:又称火星坐标系,是中国国家测绘局制定的地理坐标系统,由WGS84加密后得到。
BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。

国内主流地图API使用的坐标系统:

百度:百度坐标腾讯:火星坐标高德:火星坐标 源码
import UIKit
import MapKit

class MyNavi: NSObject, MAMapViewDelegate, AMapLocationManagerDelegate {
    // MARK: - 属性
    static let sharedInstance = MyNavi()
    
    // 当前位置或起始位置
    var currentLocation: CLLocationCoordinate2D!
    var currentAddress: String = ""
    
    // 目标位置
    var targetLocation: CLLocationCoordinate2D!
    var targetAddress: String = ""
    
    // MARK: - 导航位置初始化
    func initNavi(currentLoc: CLLocationCoordinate2D! = nil, currentAdd: String = "", targetLoc: CLLocationCoordinate2D!, targetAdd: String) {
        if currentLoc != nil {
            currentLocation = currentLoc
        }
        
        currentAddress = currentAdd
        
        if targetLoc != nil {
            targetLocation = targetLoc
        }
        
        targetAddress = targetAdd
    }
    
    // MARK: - Apple地图导航
    func naviWithAppleMap() {
        if targetLocation == nil {
            return
        }
        
        // 起始位置
        let fromLocation = MKMapItem.forCurrentLocation()
        fromLocation.name = "我的位置"
        
        // 目标位置
        let toCoor = CLLocationCoordinate2D(latitude: targetLocation!.latitude, longitude: targetLocation!.longitude)
        let toLocation = MKMapItem(placemark: MKPlacemark(coordinate: toCoor, addressDictionary: [:]))
        toLocation.name = targetAddress
        
        // 打开地图
        MKMapItem.openMaps(with: [fromLocation, toLocation],
                           launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving, MKLaunchOptionsShowsTrafficKey: NSNumber(true)])
    }
    
    // MARK: - 百度地图导航
    func naviWithBaiduMap() {
        if targetLocation == nil {
            return
        }
        
        /// 请求格式:
        /// baidumap://map/direction?origin=34.264642646862,108.95108518068&destination=40.007623,116.360582&coord_type=bd09ll&mode=driving&src=ios.baidu.openAPIdemo
        
        var urlString: String = "baidumap://map/direction?"
        
        // 起始位置
        let origin: String = "我的位置"
        urlString = urlString + "origin=\(origin)"
        
        // 目标位置
        let destination: String = "\(targetLocation!.latitude),\(targetLocation!.longitude)"
        let name: String = targetAddress
        urlString = urlString + "&destination=name:\(name)|latlng:\(destination)"
        
        /// 可选的坐标系统:
        ///     bd09ll(百度经纬度坐标)
        ///     bd09mc(百度墨卡托坐标)
        ///     gcj02(经国测局加密的坐标)
        ///     wgs84(gps获取的原始坐标)
        urlString = urlString + "&coord_type=gcj02&mode=driving&src=ios.ftsafe.FTSmartSudentCard"

        urlString = urlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!
        
        if #available(iOS 10.0, *) {
            UIApplication.shared.open(URL(string: urlString)!, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(URL(string: urlString)!)
        }
    }
    
    // MARK: - 腾讯地图导航
    func naviWithQqMap() {
        if targetLocation == nil {
            return
        }
        
        /// 请求格式:
        /// qqmap://map/routeplan?type=drive&from=清华&fromcoord=39.994745,116.247282&to=怡和世家&tocoord=39.867192,116.493187&referer=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77
        /// 这里可能需要开发者key,即referer
        
        var urlString: String = "qqmap://map/routeplan?type=drive"
        let origin: String = "我的位置"
        urlString = urlString + "&from=\(origin)&fromcoord=CurrentLocation"
        
        let destination: String = "\(targetLocation!.latitude),\(targetLocation!.longitude)"
        let name: String = targetAddress
        urlString = urlString + "&to=\(name)&tocoord=\(destination)"
        
        urlString = urlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!
        
        if #available(iOS 10.0, *) {
            UIApplication.shared.open(URL(string: urlString)!, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(URL(string: urlString)!)
        }
    }
    
    // MARK: - 高德地图导航
    func naviWithAMap() {
        if targetLocation == nil {
            return
        }
        
        /// 请求格式:
        /// iosamap://path?sourceApplication=applicationName&sid=&slat=39.92848272&slon=116.39560823&sname=A&did=&dlat=39.98848272&dlon=116.47560823&dname=B&dev=0&t=0
        
        var urlString: String = "iosamap://path?sourceApplication=FTSmartSudentCard"
        
        let name: String = targetAddress
        urlString = urlString + "&dlat=\(targetLocation!.latitude)&dlon=\(targetLocation!.longitude)&dname=\(name)&dev=0&t=0"
        
        urlString = urlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!
        
        if #available(iOS 10.0, *) {
            UIApplication.shared.open(URL(string: urlString)!, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(URL(string: urlString)!)
        }
    }
}
调用方法
 class func naviEvent(coor: CLLocationCoordinate2D!, address: String) {
 	MyNavi.sharedInstance.initNavi(targetLoc: coor, targetAdd: address)
 	MyNavi.sharedInstance.naviWithAppleMap()
 	//MyNavi.sharedInstance.naviWithBaiduMap()
 	//MyNavi.sharedInstance.naviWithQqMap()
 	//MyNavi.sharedInstance.naviWithAMap()
 }
一点注意事项

如果要调用Apple地图导航,项目一定记得引入MapKit.framework。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/993911.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存