iOS | 地圖定位

在IOS開(kāi)發(fā)中,最常見(jiàn)的功能之一就是地圖定位功能,不單單是百度地圖,高德地圖等專業(yè)的地圖導(dǎo)航軟件,還有美團(tuán),咕咚等一些美食購(gòu)物類和運(yùn)動(dòng)類也需要這樣的功能,所以學(xué)會(huì)這項(xiàng)技能是一名IOS開(kāi)發(fā)工程師必須的.


百度地圖

咕咚

?美團(tuán)
分享一些比較基礎(chǔ)的關(guān)于定位方面的小知識(shí).

關(guān)于定位有兩個(gè)框架
1.CoreLocation ---->用于地理定位
2.Map Kit ---->用于地圖展示

兩個(gè)熱詞:

LBS: location based service
SLM: social local mobile

使用CoreLocation定位

首先在之前需要導(dǎo)入corelocation框架,然后在頭文件導(dǎo)入corelocation.h頭文件.
注意:coordinate是坐標(biāo),latitude是緯度,longitude是經(jīng)度.

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 1.創(chuàng)建位置管理者
    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    self.locationManager = locationManager;
    // 在iO8之前,只要導(dǎo)入CoreLocation 會(huì)自動(dòng)申請(qǐng)權(quán)限
    // 在iOS8之后需要程序員手寫(xiě)
    
    // 2.請(qǐng)求用戶授權(quán)    必須要配置info.plist文件
    //在info里面配置NSLocationAlwaysUsageDescription或者
    //NSLocationWhenInUseUsageDescription
    // 請(qǐng)求app始終授權(quán)  無(wú)論程序在前臺(tái)還是在后臺(tái)運(yùn)行  都可以使用定位
//    [locationManager requestAlwaysAuthorization];
    // 請(qǐng)求app在使用期間授權(quán)   在前臺(tái)使用時(shí)才可以使用定位
    [locationManager requestWhenInUseAuthorization];
    
    if ([UIDevice currentDevice].systemVersion.floatValue >= 9.0) {
        // 臨時(shí)開(kāi)啟后臺(tái)定位  配置info.plist文件  不配置直接崩潰
        locationManager.allowsBackgroundLocationUpdates = YES;
    }
    // 3.設(shè)置屬性(兩個(gè)屬性是為了讓程序可以持續(xù)的進(jìn)行定位)
//    // 距離篩選  單位:米  當(dāng)用戶移動(dòng)100.5米后調(diào)用定位方法
//    locationManager.distanceFilter = 100.5;
//    // 期望精度  單位:米  系統(tǒng)默認(rèn)將100米范圍內(nèi)作為一個(gè)位置
//    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    // 4.設(shè)置代理
    locationManager.delegate = self;
    // 5.開(kāi)啟定位
    [locationManager startUpdatingLocation];
    // 開(kāi)始更新移動(dòng)方向
//    [locationManager startUpdatingHeading];


//代理方法,一旦開(kāi)啟定位,會(huì)自動(dòng)調(diào)用這個(gè)代理方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
    // 獲取數(shù)據(jù)
//    NSLog(@"%@",locations);
    // 停止定位  省電
//    [manager stopUpdatingLocation];
}



// 比較位置的距離  比較的是兩點(diǎn)之間的直線距離
- (void)compareDistance
{
    // 北京的位置
    CLLocation *location = [[CLLocation alloc] initWithLatitude:39 longitude:115];
    // 上海的位置
    CLLocation *location1 = [[CLLocation alloc] initWithLatitude:30 longitude:120];
    // 比較北京到上海的位置(直線距離)
    double distance = [location distanceFromLocation:location1];
    // 單位:米
    NSLog(@"%f",distance / 1000);
}
    
使用MapKit定位

修改地圖類型 mapView.mapType
地圖實(shí)時(shí)交通狀態(tài) mapView.showsTraffic
設(shè)置用戶跟蹤模式 mapView.userTrackingMode
代理方法,
//顯示在地圖中用戶定位的位置

-(void)mapView:(MKMapView\*)mapView didUpdateUserLocation:(MKUserLocation \*)userLocation

//獲取實(shí)時(shí)地圖變化的區(qū)域變化(中心點(diǎn),區(qū)域跨度)

-(void)mapView:(MKMapView \*)mapView regionDidChangeAnimated:(BOOL)animated

注意:這里需要導(dǎo)入的是MapKit框架和MapKit.h頭文件.

- (void)viewDidLoad {
    [super viewDidLoad];
     
    // 修改地圖類型
    /*
     MKMapTypeStandard    標(biāo)準(zhǔn)(默認(rèn))
     MKMapTypeSatellite   衛(wèi)星
     MKMapTypeHybrid      混合
     MKMapTypeSatelliteFlyover  在中國(guó)暫時(shí)不能使用
     MKMapTypeHybridFlyover  在中國(guó)暫時(shí)不能使用
     */
    self.mapView.mapType = MKMapTypeStandard;
    
    // 實(shí)時(shí)交通狀況 iOS9新增
    self.mapView.showsTraffic = YES;
    
    // 創(chuàng)建位置管理者
    self.locationManager = [[CLLocationManager alloc] init];
    // 請(qǐng)求用戶授權(quán)  配置info.plist
    [self.locationManager requestWhenInUseAuthorization];
    // 設(shè)置用戶的跟蹤模式
    /*
     MKUserTrackingModeFollow  跟蹤用戶的位置   MKUserTrackingModeFollowWithHeading  跟蹤用戶的位置和方向
     */
    self.mapView.userTrackingMode = MKUserTrackingModeFollow;
    
    // 設(shè)置代理
    self.mapView.delegate = self;
}

// 跟蹤到用戶位置時(shí)調(diào)用
// mapView:地圖
// userLocation:用戶位置的大頭針模型
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    // 1.反地理編碼
    // 1.1創(chuàng)建地理編碼對(duì)象
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    // 1.2反地理編碼
    [geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        // 1.3防錯(cuò)處理
        if (error) {
            NSLog(@"%@",error);
            return ;
        }
        // 1.4獲取地標(biāo)
        CLPlacemark *placemark = [placemarks firstObject];
        // 2.給標(biāo)題和子標(biāo)題賦值
        userLocation.title = placemark.locality;
        userLocation.subtitle = placemark.name;
    }];
}


// 回到當(dāng)前用戶的位置
- (IBAction)backToCurrentLocation
{
    
    // 獲取當(dāng)前的跨度
    MKCoordinateSpan span = MKCoordinateSpanMake(0.024967, 0.015407);
    // 設(shè)置回到用戶剛開(kāi)始的區(qū)域 region(結(jié)構(gòu)體) --1.中心點(diǎn)經(jīng)緯度(結(jié)構(gòu)體)--> 經(jīng)度和緯度  2.經(jīng)緯度跨度(結(jié)構(gòu)體)-->經(jīng)度跨度和緯度跨度
    // 設(shè)置區(qū)域并使用動(dòng)畫(huà)
    [self.mapView setRegion:MKCoordinateRegionMake(self.mapView.userLocation.location.coordinate, span) animated:YES];
}


- (IBAction)biggerMap
{
    // 修改經(jīng)緯度跨度
    CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 0.5;
    CGFloat longitudeDelta = self.mapView.region.span.longitudeDelta * 0.5;
    MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
    // 確定放大地圖后的區(qū)域
    [self.mapView setRegion:MKCoordinateRegionMake(self.mapView.centerCoordinate, span) animated:YES];
}
- (IBAction)smallerMap
{
    // 修改經(jīng)緯度跨度
    CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 2;
    CGFloat longitudeDelta = self.mapView.region.span.longitudeDelta * 2;
    MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
    [self.mapView setRegion:MKCoordinateRegionMake(self.mapView.centerCoordinate, span) animated:YES];
}

演示

效果演示

說(shuō)到底,其實(shí)蘋(píng)果官方的框架已經(jīng)做得不錯(cuò)了,該有的功能基本都具備,而且使用起來(lái)不是怎么困難,掌握起來(lái)也非匙嗪颍快.我這里只是分享一些比較基礎(chǔ)的功能,歡迎工程師們賜教.
另外附上地理編碼的小演示.

地理編碼.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末璃俗,一起剝皮案震驚了整個(gè)濱河市战秋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梁丘,老刑警劉巖绰疤,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艳丛,死亡現(xiàn)場(chǎng)離奇詭異郭计,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)播聪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)朽基,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人犬耻,你說(shuō)我怎么就攤上這事踩晶。” “怎么了枕磁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵渡蜻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)茸苇,這世上最難降的妖魔是什么排苍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮学密,結(jié)果婚禮上淘衙,老公的妹妹穿的比我還像新娘。我一直安慰自己腻暮,他們只是感情好彤守,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著哭靖,像睡著了一般具垫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上试幽,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天筝蚕,我揣著相機(jī)與錄音,去河邊找鬼铺坞。 笑死起宽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的济榨。 我是一名探鬼主播坯沪,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼擒滑!你這毒婦竟也來(lái)了屏箍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤橘忱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后卸奉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钝诚,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年榄棵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凝颇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疹鳄,死狀恐怖拧略,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘪弓,我是刑警寧澤垫蛆,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響袱饭,放射性物質(zhì)發(fā)生泄漏川无。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一虑乖、第九天 我趴在偏房一處隱蔽的房頂上張望懦趋。 院中可真熱鬧,春花似錦疹味、人聲如沸仅叫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诫咱。三九已至,卻和暖如春继找,著一層夾襖步出監(jiān)牢的瞬間遂跟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工婴渡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幻锁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓边臼,卻偏偏與公主長(zhǎng)得像哄尔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柠并,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容