想在自己的app中集成百度地圖,你該這么做

一.地圖的基本展示

1.地圖可以用一個(gè)MapView控件來(lái)展示

  • 注意:要導(dǎo)入MKMapKit框架

2.地圖的展示類型,可以通過(guò)屬性 mapType設(shè)置

  • 地圖分為:標(biāo)準(zhǔn)地圖,衛(wèi)星地圖,混合地圖 ios9之后新出了: 三維混合/三維衛(wèi)星地圖

3.地圖上可以展示哪些的內(nèi)容

  • 比例尺,指南針,交通狀況,標(biāo)志建筑,顯示用戶位置(后面詳細(xì)介紹)

4.可以對(duì)地圖進(jìn)行哪些操作

  • 縮放:zoomEnabled
  • 旋轉(zhuǎn):rotateEnabled
  • 滾動(dòng):scrollEnabled

二.顯示用戶的位置

1.怎么顯示用戶的位置?

1.1 設(shè)置地圖的一個(gè)屬性即可mapView.showsUserLocation = true

1.2 注意:一定要設(shè)置請(qǐng)求授權(quán)

1.21 創(chuàng)建 CLLocationManager對(duì)象
1.22 調(diào)用方法授權(quán) requestWhenInUseAuthorization 或 always
1.23 在info文件中添加對(duì)應(yīng)的key值

2.獲取用戶的位置

2.1 設(shè)置地圖的代理

2.2 實(shí)現(xiàn)代理方法

在代理方法中通過(guò)userLocation.location?.coordinate 拿到經(jīng)緯度

3.跟蹤用戶的位置

3.1 首先要獲取用戶的位置

3.2 設(shè)置屬性即可

mapView.userTrackingMode = .FollowWithHeading/. Follow

4.設(shè)置地圖的顯示區(qū)域

4.1 通過(guò)一個(gè)屬性就可以設(shè)置(一般在代理方法中設(shè)置)

 mapView.setRegion(<#T##region: MKCoordinateRegion##MKCoordinateRegion#>, animated: <#T##Bool#>)

4.2 需要傳入MKCoordinateRegion參數(shù),那么就需要?jiǎng)?chuàng)建這個(gè)參數(shù)

  MKCoordinateRegion(center: <#T##CLLocationCoordinate2D#>, span: <#T##MKCoordinateSpan#>)

4.3 創(chuàng)建MKCoordinateRegion又需要傳入CLLocationCoordinate2DMKCoordinateSpan參數(shù)

4.4 創(chuàng)建CLLocationCoordinate2D參數(shù)(經(jīng)緯度) 可以在代理方法中獲得

4.5 創(chuàng)建MKCoordinateSpan參數(shù) 1緯度 = 111km

let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)

5.點(diǎn)擊按鈕,回到用戶的位置

5.1 當(dāng)用戶拖動(dòng)地圖時(shí),想讓地圖回到自己的位置,如果還需要拖動(dòng)回來(lái)就太麻煩了

可以設(shè)置一個(gè)按鈕:點(diǎn)擊按鈕,立刻讓地圖的中心點(diǎn)就是自己的位置

5.2 怎么實(shí)現(xiàn)?

獲取用戶的位置(經(jīng)緯度coordinate) ,將這個(gè)位置設(shè)置為地圖的中心點(diǎn)即可

三.在地圖上展示大頭針

1.添加大頭針

1.1 創(chuàng)建大頭針對(duì)象 addAnnotation(annotation: MKAnnotation)

1.11 需要?jiǎng)?chuàng)建一個(gè)MKAnnotation
1.12 進(jìn)去頭文件,發(fā)現(xiàn)MKAnnotation 是一個(gè)協(xié)議, 也就是需要傳一個(gè)遵守該協(xié)議的對(duì)象
1.13 自定義一個(gè)模型,遵守協(xié)議 , 協(xié)議里面只有三個(gè)計(jì)算屬性
也就是說(shuō),只需要實(shí)現(xiàn)這三個(gè)屬性(在模型中定義這三個(gè)屬性 注意:要定義為普通屬性)
1.14 創(chuàng)建模型對(duì)象

1.2 將大頭針對(duì)象添加到mapView中

 addAnnotation(annotation: MKAnnotation)

2.點(diǎn)擊屏幕,在點(diǎn)擊位置添加大頭針

2.1 獲取用戶點(diǎn)擊的位置

2.2 將點(diǎn)擊的點(diǎn)轉(zhuǎn)成經(jīng)緯度

2.3 根據(jù)經(jīng)緯度創(chuàng)建大頭針模型

2.4 將大頭針模型添加到mapView中

3.自定義大頭針(修改大頭針的子類)

3.1 系統(tǒng)給定的大頭針樣式單一,我們想要其它樣式的大頭針,需要自定義大頭針

3.2 怎么自定義大頭針?
大頭針能添加到view上,一定是一個(gè)控件,只要拿到這個(gè)控件,就可以進(jìn)行修改

3.3 怎么拿到大頭針的view?
在代理方法中會(huì)把大頭針添加到mapView上,這個(gè)時(shí)候就可以拿到

3.4 修改完大頭針,發(fā)現(xiàn)點(diǎn)擊大頭針看不到title和subTitle了 為什么?
需要設(shè)置一個(gè)屬性才可以看到annoView?.canShowCallout = true

3.5 設(shè)置大頭針的樣式,發(fā)現(xiàn)標(biāo)記用戶位置的圖標(biāo)也變?yōu)榱舜箢^針, 不想讓標(biāo)記位置的圖標(biāo)變?yōu)榇箢^針,怎么辦?
判斷大頭針是否為用戶值得大頭針 MKUserLocation是的話就返回nil (返回nil就是系統(tǒng)默認(rèn)的大頭針樣式)

3.6 對(duì)大頭針進(jìn)行性能優(yōu)化(重用)
和設(shè)置tableView的重用步驟差不多

4.自定義大頭針(修改大頭針,自定義大頭針的image)

4.1 系統(tǒng)自帶的大頭針只能顯示一個(gè)大頭針,我們想讓大頭針顯示圖片,只能自定義
新建一個(gè)類,繼承自 MKAnnotationView 用的時(shí)候,直接創(chuàng)建這個(gè)類即可

4.2 怎么設(shè)置大頭針顯示的圖片?
只需要設(shè)置Image屬性即可

4.3 如何讓大頭針顯示不同的圖片?
對(duì)大頭針類型進(jìn)行判斷 ,給不同類型大頭針設(shè)置不同的圖片即可

4.4 大頭針?lè)浅6?判斷的話很麻煩,也沒技術(shù)含量,怎么解決?
給大頭針對(duì)象添加一個(gè)屬性: iconName 屬性里面保存對(duì)應(yīng)的照片名稱即可
設(shè)置的時(shí)候,只需要取出屬性的值,設(shè)置給UIImageView即可

4.5 想在title左右兩邊也顯示圖片,怎么辦?
設(shè)置兩個(gè)屬性即可 leftCalloutAccessoryView rightCalloutAccessoryView

5.代碼重構(gòu)

5.1 為什么要進(jìn)行代碼重構(gòu)?
把自定義大頭針的操作全部寫在控制器中,控制器太臃腫

5.2 怎么對(duì)控制器進(jìn)行”瘦身"
把自定義大頭針的代碼抽取到一個(gè)view中

5.3 怎么抽取?
自定義大頭針的view ,把相關(guān)代碼封裝到view里面

5.4 抽取代碼要用到模型和mapView怎么辦?
在自定義view中定義模型屬性 把mapView當(dāng)成參數(shù)傳進(jìn)去

5.5 注意: 父類中已經(jīng)存在這個(gè)模型屬性了,在子類中不允許重復(fù)定義,怎么辦?
重復(fù)定義屬性的時(shí)候,重寫屬性監(jiān)聽器方法即可


6.給大頭針添加動(dòng)畫

6.1 系統(tǒng)自帶的大頭針可以設(shè)置墜落動(dòng)畫,自定義的大頭針怎么設(shè)置動(dòng)畫?
我們只要拿到大頭針view的frame就能實(shí)現(xiàn)墜落動(dòng)畫

6.2 怎么拿到大頭針的frame
只需要獲取大頭針的view即可

6.3 在代理方法中可以拿到view

6.4 執(zhí)行動(dòng)畫步驟

6.41 保存大頭針的y值
6.42 設(shè)置大頭針的y值為0
6.43 再設(shè)置大頭針的y值為原來(lái)的值,并執(zhí)行動(dòng)畫

Paste_Image.png

四.實(shí)現(xiàn)導(dǎo)航功能(了解)

1.利用系統(tǒng)的地圖實(shí)現(xiàn)導(dǎo)航

1.1 在自己app中打開系統(tǒng)地圖,實(shí)現(xiàn)導(dǎo)航

openMapsWithItems(mapItems: [MKMapItem], launchOptions: [String : AnyObject]?) -> Bool

1.2 需要在方法中傳入一個(gè)數(shù)組MKMapItem 和一個(gè)字典 [String : AnyObject] (導(dǎo)航的參數(shù):駕車還是步行等)

1.3 創(chuàng)建MKMapItem類型的起點(diǎn)和終點(diǎn)

1.4 起點(diǎn)通過(guò)的一個(gè)方法就能實(shí)現(xiàn),終點(diǎn)要利用地理編碼獲得

      @IBAction func startNavigating() {
    // 1.獲取用戶輸入的地址
    guard let address = destinationTextField.text else {
        return
    }
    // 2.地理編碼
    geocoder.geocodeAddressString(address) { (placemarks : [CLPlacemark]?, error : NSError?) in
        // 3.對(duì)錯(cuò)誤進(jìn)行校驗(yàn)
        if error != nil {
            return
        }
        // 4.獲取placemark
        guard let clpm = placemarks?.first else {
            return
        }
        // 5.創(chuàng)建終點(diǎn)的item
        let mkpl = MKPlacemark(placemark: clpm)
        let destinationItem = MKMapItem(placemark: mkpl)

        // 6.獲取起點(diǎn)的item
        let sourceItem = MKMapItem.mapItemForCurrentLocation()

        // 7.調(diào)用對(duì)應(yīng)的導(dǎo)航方法
        self.startNavigationWithSoureItem(sourceItem, destionationItem: destinationItem)
    }
}

private func startNavigationWithSoureItem(soureItem : MKMapItem, destionationItem : MKMapItem) {
    // 1.獲取起點(diǎn)和終點(diǎn)的item,并且放入到數(shù)組中
    let items = [soureItem, destionationItem]
    // 2.設(shè)置導(dǎo)航的參數(shù)
    /*
     MKLaunchOptionsDirectionsModeKey: 步行/駕車
     MKLaunchOptionsMapTypeKey: 地圖類型
     MKLaunchOptionsShowsTrafficKey: 是否顯示交通狀況
    */
    var launchOptions = [String : NSObject]()
    launchOptions[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving
    launchOptions[MKLaunchOptionsMapTypeKey] = MKMapType.Hybrid.rawValue
    launchOptions[MKLaunchOptionsShowsTrafficKey] = true

    // 3.開始導(dǎo)航
    MKMapItem.openMapsWithItems(items, launchOptions: launchOptions)
}
}

2.請(qǐng)求整個(gè)導(dǎo)航線路,在自己app中把線路畫出來(lái)

2.1 可以通過(guò) MKDirections對(duì)象的一個(gè)方法實(shí)現(xiàn)

2.2 首先要?jiǎng)?chuàng)建 MKDirections對(duì)象

 MKDirections(request: <#T##MKDirectionsRequest#>)

2.3 還需要?jiǎng)?chuàng)建MKDirectionsRequest對(duì)象

2.4 創(chuàng)建MKDirectionsRequest對(duì)象,并設(shè)置屬性(起點(diǎn)位置和終點(diǎn)位置)

2.5 通過(guò)MKDirections對(duì)象方法calculateDirectionsWithCompletionHandler請(qǐng)求路線

2.6 獲取所有路線,并把路線通過(guò) addOverlay方法添加到mapView上

五.集成百度地圖

1.如何使用第三方SDK

1.1 搜索想要集成的SDK

1.2 進(jìn)入官方下載SDK開發(fā)包

1.3 查看demo程序(運(yùn)行看看有哪些功能)

1.4 根據(jù)API一步步集成(官方一般有文檔教程)

詳情可以查看:http://lbsyun.baidu.com/index.php?title=iossdk

2.基本集成

2.1 先將需要集成的功能的框架導(dǎo)入到項(xiàng)目

2.2 創(chuàng)建橋接文件(根據(jù)需求創(chuàng)建, 只有開發(fā)包是oc 自己代碼是swift才需要?jiǎng)?chuàng)建)

2.3 在橋接文件中導(dǎo)入頭文件(官方文檔一般會(huì)給需要導(dǎo)入的頭文件)

2.4 配置橋接文件
不會(huì)配置請(qǐng)查看之前的文章

3.請(qǐng)求授權(quán)

3.1 如何授權(quán)?
在AppDelegate文件中進(jìn)行授權(quán)

3.2 授權(quán)完,運(yùn)行直接報(bào)錯(cuò),為什么?
百度一些框架依賴系統(tǒng)的一些框架,還需要導(dǎo)入系統(tǒng)的一些框架

4. BMKMapView的展示

4.1 創(chuàng)建 BMKMapView對(duì)象
4.2 設(shè)置frame,添加到屏幕上

5.定位功能的實(shí)現(xiàn)

通過(guò)代理就可以實(shí)現(xiàn)

6.POI檢索功能(查找功能)

注意:發(fā)起檢索一定要在地圖添加到view上之后

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容