蘋果內建地圖進行定位,蘋果內建地圖

來源:互聯網
上載者:User

蘋果內建地圖進行定位,蘋果內建地圖

  最近項目中遇到了關於地圖定位的需求,考慮到用三方庫的話項目會變大,還是用了官方內建的地圖。

  這是結果圖:

  

  一、CoreLocation.frame是iPhone SDK中用來檢測使用者位置的架構。

  1.要實現定位功能,首先引入這個架構。然後添加兩個類和一個協議(CLLocationManager、CLLocation、CllocationManagerDelegate)。

    精確度層級是通過位置管理器的desiredAccuracy屬性來設定的,它的取值可以參照下表。精確層級越高,手機消耗的電越多。

desiredAccuracy屬性值 描述
kCLLocationAccuracyBest 精確度最好
kCLLocationAccuracyNearestTenMeters 精確到10米以內
kCLLocationAccuracyHundredMeters 精確到100米以內
kCLLocationAccuracyKilometer 精確到1000米以內
kCLLocationAccuracyThreeKilometers 精確到3000米以內

 

  2.啟動位置管理器進行定位。[locManager startUpdatingLocation](也可以停止檢測位置更新[locManager stopUpdatingLocation])

  3.擷取位置資訊

    coordinate用來儲存地理位置的latitude和longitude,分別代表地理位置的緯度和經度。

    location是CLLocation類的一個執行個體對象。

    altitude屬性工作表示某個位置的海拔高度,傳回值為浮點型,實際定位時極不準確。

    horizontalAccuracy屬性工作表示水平準確度,傳回值為浮點型。它是以coordinate為圓心的圓的半徑,半徑越小定位越準確,如果horizontalAccuracy為負值,表示Core Location定位失敗。

    verticalAccuracy屬性工作表示垂直水平準確度,傳回值為浮點型。它的取值和海拔的取值altitude有關係,與實際情況相差很大。

  4.CLLocationManagerDelegate協議 

   - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{ }- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ NSString * errorMessage; if ([error code] == kCLErrorDenied) { errorMessage = @"訪問被拒絕!"; } if ([error code] == kCLErrorLocationUnknown) { errorMessage = @"無法定位到你的位置!"; }}協議

 

  二、使用MapKit顯示地圖

  1.使用MapKit.framework架構可以很輕鬆地在應用程式中嵌入一幅地圖。

    region屬性用來設定地圖的哪一部分被顯示,它是一個結構體類型。

    center就是coordinate的取值,包括經緯度資訊,此處用來表示地圖的中心位置。

    span表示地圖的一個跨度,它包括了該地區的經度和緯度變化度資訊,即縮放地圖的比例。

    MapType屬性設定地圖的類型,它的取值見下表。

MapType屬性值 描述
MKMapTypeStandard 表示標準的街道級地圖
MKMapTypeSatellite 表示衛星圖
MKMapTypeHybrid 表示以上兩種類型的混合

    

  2.建立一個MKMapView物件檢視添加到當前控制器view上,然後在兩個位置管理器代理裡面設定一下map的region和span,此外還可以設定latitudeDelta和longitudeDelta可實現縮放。

  3.添加地表徵圖注,在項目中添加一個MapAnnotations類。該類繼承於NSObject,遵循MKAnnotation協議。

  

  詳細代碼:

1 #import <UIKit/UIKit.h>2 3 @interface ViewController : UIViewController4 5 6 @endViewController.h 1 #import "ViewController.h" 2 #import <CoreLocation/CoreLocation.h> 3 #import <MapKit/MapKit.h> 4 5 #import <MapKit/MKAnnotation.h> 6 #import "MapAnnotations.h" 7 8 @interface ViewController ()<CLLocationManagerDelegate, MKMapViewDelegate> 9 {10 CLLocationManager * locManager;11 CLLocationCoordinate2D loc;12 UITextView * textView;13 14 MKMapView * map;15 16 MapAnnotations * mapAnnotations;17 }18 @end19 20 @implementation ViewController21 22 - (void)viewDidLoad {23 [super viewDidLoad];24 // Do any additional setup after loading the view, typically from a nib.25 //建立位置管理器26 locManager = [[CLLocationManager alloc] init];27 locManager.delegate = self;28 if ([CLLocationManager locationServicesEnabled]) {29 locManager.desiredAccuracy = kCLLocationAccuracyBest; //精確度最好30 locManager.distanceFilter = 300; //距離篩選器 300米31 [locManager startUpdatingLocation]; //啟動位置管理器進行定位32 [locManager requestAlwaysAuthorization];33 }34 35 map = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];36 map.showsUserLocation = YES;37 [self.view addSubview:map];38 39 UIButton * addPanBtn = [UIButton buttonWithType:UIButtonTypeContactAdd];40 addPanBtn.center = CGPointMake(40, 40);41 [addPanBtn addTarget:self action:@selector(addPin:) forControlEvents:UIControlEventTouchUpInside];42 [self.view addSubview:addPanBtn];43 }44 45 #pragma mark - 代理方法46 //這是位置更新方法,當我們的移動範圍大於距離篩選器的值時,位置管理器會調用此方法進行重新置放47 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{48 CLLocation * location = [locations firstObject];49 50 NSLog(@"latitude:%f, longitude:%f",location.coordinate.latitude, location.coordinate.longitude);51 52 MKCoordinateRegion region;53 MKCoordinateSpan span;54 span.latitudeDelta = 1;55 span.longitudeDelta = 1;56 region.span = span;57 region.center = location.coordinate;58 [map setRegion:region animated:YES];59 [map regionThatFits:region];60 61 mapAnnotations = [[MapAnnotations alloc] initWithCoordinate:location.coordinate];62 mapAnnotations.title = @"TEST";63 mapAnnotations.subtitle = @"Just For Test";64 [map addAnnotation:mapAnnotations];65 }66 67 - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{68 NSString * errorMessage;69 if ([error code] == kCLErrorDenied) {70 errorMessage = @"訪問被拒絕!";71 }72 if ([error code] == kCLErrorLocationUnknown) {73 errorMessage = @"無法定位到你的位置!";74 }75 }76 77 - (void)dealloc{78 //停止檢測位置更新79 [locManager stopUpdatingLocation];80 }81 82 - (void)addPin:(id)sender{83 mapAnnotations = [[MapAnnotations alloc] initWithCoordinate:map.region.center];84 mapAnnotations.title = [NSString stringWithFormat:@"%f",map.region.center.latitude];85 mapAnnotations.subtitle = [NSString stringWithFormat:@"%f",map.region.center.longitude];86 [map addAnnotation:mapAnnotations];87 }88 89 - (void)didReceiveMemoryWarning {90 [super didReceiveMemoryWarning];91 // Dispose of any resources that can be recreated.92 }93 94 @endViewController.m 1 #import <Foundation/Foundation.h> 2 #import <CoreLocation/CoreLocation.h> 3 #import <MapKit/MapKit.h> 4 5 @interface MapAnnotations : NSObject<MKAnnotation> 6 7 @property (nonatomic, copy) NSString * title; 8 @property (nonatomic, copy) NSString * subtitle; 9 @property (nonatomic, assign) CLLocationCoordinate2D coordinate;10 11 - (instancetype)initWithCoordinate:(CLLocationCoordinate2D)c;12 13 @endMapAnnotations.h 1 #import "MapAnnotations.h" 2 3 @implementation MapAnnotations 4 5 - (instancetype)initWithCoordinate:(CLLocationCoordinate2D)c{ 6 _coordinate = c; 7 return self; 8 } 9 10 @endMapAnnotation.m

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.