iOS 系統(tǒng)自帶API地圖開發(fā)相關(guān)(一)

系統(tǒng)自帶API

CoreLocation

 #import <CoreLocation/CoreLocation.h>  用于地理定位

CoreLocation框架使用須知
CoreLocation框架中所有數(shù)據(jù)類型的前綴都是CL
CoreLocation中使用CLLocationManager對象來做用戶定位

1.CLLocationManager

常用操作

- (void)startUpdatingLocation;   //開始用戶定位
- (void) stopUpdatingLocation;  //停止用戶定位

當(dāng)調(diào)用了startUpdatingLocation方法后,就開始不斷地定位用戶的位置,中途會頻繁地調(diào)用代理的下面方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
locations參數(shù)里面裝著CLLocation對象

CLLocationManager的相關(guān)屬性

//每隔多少米定位一次
@property(assign, nonatomic) CLLocationDistance distanceFilter;
//定位精確度(越精確就越耗電)
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

CLLocationManagerDelegate代理方法的簡單講解鏈接-可點(diǎn)擊


2.CLLocationCoordinate2D

是一個(gè)用來表示經(jīng)緯度的結(jié)構(gòu)體,定義如下

typedef struct {
        CLLocationDegrees latitude; // 緯度
        CLLocationDegrees longitude; // 經(jīng)度
} CLLocationCoordinate2D;

一般用CLLocationCoordinate2DMake函數(shù)來創(chuàng)建CLLocationCoordinate2D

CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake([_latitude doubleValue],[_longitude doubleValue]);
//其中_latitude和_longitude是以字符串NSString的形式存在傳遞
3.CLLocation

用來表示某個(gè)位置的地理信息,比如經(jīng)緯度、海拔等等

//經(jīng)緯度
@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
//海拔
@property(readonly, nonatomic) CLLocationDistance altitude;
//路線,航向(取值范圍是0.0° ~ 359.9°,0.0°代表真北方向)
@property(readonly, nonatomic) CLLocationDirection course;
//行走速度(單位是m/s)
@property(readonly, nonatomic) CLLocationSpeed speed;

用下面方法可以計(jì)算2個(gè)位置之間的距離
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location

這個(gè)地方提一點(diǎn)在模擬器上,需要設(shè)置模擬位置 ,最好真機(jī)測試
帝都的經(jīng)緯度是:北緯40°,東經(jīng)116°


模擬器模擬位置.png

當(dāng)然還要注意配置info.plist文件
是否允許xxxxxxxxx訪問你的地理位置
Privacy - Location Always Usage Description //總是使用用戶位置
Privacy - Location When In Use Usage Description//使用應(yīng)用時(shí)定位

為了嚴(yán)謹(jǐn)起見,最好在使用定位功能之前判斷當(dāng)前應(yīng)用的定位功能是否可用
CLLocationManager有個(gè)類方法可以判斷當(dāng)前應(yīng)用的定位功能是否可用

+ (BOOL)locationServicesEnabled;
4.CLGeocoder

使用CLGeocoder可以完成“地理編碼”和“反地理編碼”
地理編碼:根據(jù)給定的地名,獲得具體的位置信息(比如經(jīng)緯度、地址的全稱等)
反地理編碼:根據(jù)給定的經(jīng)緯度,獲得具體的位置信息

地理編碼方法
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;

反地理編碼方法
- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

5.CLPlacemark

CLPlacemark的字面意思是地標(biāo),封裝詳細(xì)的地址位置信息

//地理位置
@property (nonatomic, readonly) CLLocation *location;
//區(qū)域
@property (nonatomic, readonly) CLRegion *region;
//詳細(xì)的地址信息
@property (nonatomic, readonly) NSDictionary *addressDictionary;
//地址名稱
@property (nonatomic, readonly) NSString *name;
//城市
@property (nonatomic, readonly) NSString *locality;
//省/州
@property (nonatomic, readonly, copy, nullable) NSString *administrativeArea;
CLPlacemark.png

注意:
①.四大直轄市的城市信息無法通過CLPlacemark的locality屬性獲得,只能通過訪問administrativeArea屬性來獲得(如果locality為空,則可知為直轄市),代碼參考如下

  NSString *city = placemark.locality;

     if (!city) {

           //四大直轄市的城市信息無法通過locality獲得,只能通過獲取省份的方法來獲得(如果city為空,則可知為直轄市)

          city = placemark.administrativeArea;

     }

②.上面的FormattedAddressLines可通過以下方法輸出:

  NSArray *lines = _placemark.addressDictionary[@"FormattedAddressLines"];

  NSString *addressString = [lines componentsJoinedByString:@"\n"];

  NSLog(@"Address: %@", addressString);

③.星號表示addressDictionary里面可能沒有這個(gè)鍵和值


--------------------------- 華麗的分割線 ----------------------------

MapKit.

 #import <MapKit/MapKit.h>   用于地圖展示
MKMapView

跟蹤顯示用戶的位置
設(shè)置MKMapView的userTrackingMode屬性可以跟蹤顯示用戶的當(dāng)前位置

MKUserTrackingModeNone :不跟蹤用戶的位置
MKUserTrackingModeFollow :跟蹤并在地圖上顯示用戶的當(dāng)前位置
MKUserTrackingModeFollowWithHeading :跟蹤并在地圖上顯示用戶的當(dāng)前位置,地圖會跟隨用戶的前進(jìn)方向進(jìn)行旋轉(zhuǎn)

下圖是跟蹤效果
藍(lán)色發(fā)光圓點(diǎn)就是用戶的當(dāng)前位置
藍(lán)色發(fā)光原點(diǎn),專業(yè)術(shù)語叫做“大頭針”


跟蹤效果.png

地圖的類型
可以通過設(shè)置MKMapView的mapViewType設(shè)置地圖類型

MKMapTypeStandard :普通地圖
MKMapTypeSatellite :衛(wèi)星云圖 
MKMapTypeHybrid :普通地圖覆蓋于衛(wèi)星云圖之上

iOS9的一些新特性

    //顯示指南針
    self.mapView.showsCompass = YES;
    //顯示比例尺
    self.mapView.showsScale = YES;
    //顯示交通狀況
    self.mapView.showsTraffic = YES;
    //顯示建筑物
    self.mapView.showsBuildings = YES;
    //顯示用戶所在的位置
    self.mapView.showsUserLocation = YES;
    //顯示感興趣的東西
    self.mapView.showsPointsOfInterest = YES;
MKMapView的代理

MKMapView可以設(shè)置一個(gè)代理對象,用來監(jiān)聽地圖的相關(guān)行為

常見的代理方法有
//一個(gè)位置更改默認(rèn)只會調(diào)用一次,不斷監(jiān)測用戶的當(dāng)前位置
//每次調(diào)用,都會把用戶的最新位置(userLocation參數(shù))傳進(jìn)來
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation;

//地圖的顯示區(qū)域即將發(fā)生改變的時(shí)候調(diào)用
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;

//地圖的顯示區(qū)域已經(jīng)發(fā)生改變的時(shí)候調(diào)用
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;

MKUserLocation
MKUserLocation其實(shí)是個(gè)大頭針模型,包括以下屬性

//顯示在大頭針上的標(biāo)題
@property (nonatomic, copy) NSString *title;
//顯示在大頭針上的子標(biāo)題
@property (nonatomic, copy) NSString *subtitle;
地理位置信息(大頭針釘在什么地方?) (注意這個(gè)是只讀屬性)
@property (readonly, nonatomic) CLLocation *location;

至于自定義大頭針之后再講

通過MKMapView的下列方法,可以設(shè)置地圖顯示的位置和區(qū)域

//設(shè)置地圖的中心點(diǎn)位置
@property (nonatomic) CLLocationCoordinate2D centerCoordinate;
- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
//設(shè)置地圖的顯示區(qū)域
@property (nonatomic) MKCoordinateRegion region;
- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
MKCoordinateRegion

MKCoordinateRegion是一個(gè)用來表示區(qū)域的結(jié)構(gòu)體,定義如下

typedef struct {
          CLLocationCoordinate2D center; // 區(qū)域的中心點(diǎn)位置
        MKCoordinateSpan span; // 區(qū)域的跨度
} MKCoordinateRegion;

MKCoordinateSpan的定義
typedef struct {
    CLLocationDegrees latitudeDelta; // 緯度跨度
    CLLocationDegrees longitudeDelta; // 經(jīng)度跨度
} MKCoordinateSpan;

    //設(shè)定顯示范圍
    MKCoordinateSpan theSpan;
    theSpan.latitudeDelta=0.01;
    theSpan.longitudeDelta=0.01;
    //設(shè)置地圖顯示的中心及范圍
    MKCoordinateRegion theRegion;
    theRegion.center=theCoordinate;
    theRegion.span=theSpan;
    [_mapView setRegion:theRegion];
    //返回我的位置
    [self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
關(guān)于地圖大頭針基本操作
//添加一個(gè)大頭針
- (void)addAnnotation:(id <MKAnnotation>)annotation;

//添加多個(gè)大頭針
- (void)addAnnotations:(NSArray *)annotations;

//移除一個(gè)大頭針
- (void)removeAnnotation:(id <MKAnnotation>)annotation;

//移除多個(gè)大頭針
- (void)removeAnnotations:(NSArray *)annotations;

(id <MKAnnotation>)annotation參數(shù)是什么東西?
大頭針模型對象:用來封裝大頭針的數(shù)據(jù),比如大頭針的位置、標(biāo)題、子標(biāo)題等數(shù)據(jù)

添加大頭針

MKAnnotation *anno = [[MKAnnotation alloc] init];
anno.title = @"我是一個(gè)大頭針";
anno.subtitle = @"我有一個(gè)小弟叫小頭";
anno.coordinate = CLLocationCoordinate2DMake(40, 116);
[self.mapView addAnnotation:anno];

關(guān)于自定義大頭針有兩種思路:

一.自定大頭針模型MKAnnotation
二.自定義大頭針控件MKAnnotationView

之后專門建一篇文章講解吧

MKAnnotationView

地圖上的大頭針控件是MKAnnotationView

MKAnnotationView的屬性

//大頭針模型
@property (nonatomic, strong) id <MKAnnotation> annotation;
//顯示的圖片
@property (nonatomic, strong) UIImage *image;
//是否顯示標(biāo)注
@property (nonatomic) BOOL canShowCallout;
//標(biāo)注的偏移量
@property (nonatomic) CGPoint calloutOffset;
//標(biāo)注右邊顯示什么控件
@property (strong, nonatomic) UIView *rightCalloutAccessoryView;
//標(biāo)注左邊顯示什么控件
@property (strong, nonatomic) UIView *leftCalloutAccessoryView;
MKPinAnnotationView

MKPinAnnotationView是MKAnnotationView的子類
MKPinAnnotationView比MKAnnotationView多了2個(gè)屬性

//大頭針顏色
@property (nonatomic) MKPinAnnotationColor pinColor;
//大頭針第一次顯示時(shí)是否從天而降
@property (nonatomic) BOOL animatesDrop;

注:如果想創(chuàng)建以靜態(tài)圖片作為大頭針圖片的話,可以通過創(chuàng)建MKAnnotationView是實(shí)例。如果想使用apple自帶的大頭針則創(chuàng)建MKPinAnnotationView

MKAnnotationView 大頭針控件 是所有大頭針試圖控件的父類(可以隨意更改圖片和顏色)
MKPinAnnotationView 大頭的視圖針控件,是MKAnnotationView的子類(不能改變大頭針視圖的圖片,可以改變顏色)


iOS 系統(tǒng)自帶API地圖開發(fā)相關(guān)(一)
iOS 系統(tǒng)自帶API地圖開發(fā)相關(guān)(二)
iOS 系統(tǒng)自帶API地圖開發(fā)相關(guān)(三)


第一節(jié)到此為止.記錄下來同大家分享!!!??????

我是楚簡約,感謝您的閱讀,

喜歡就點(diǎn)個(gè)贊唄,“?喜歡”,

鼓勵(lì)又不花錢,你在看,我就繼續(xù)寫~

非簡書用戶,可以點(diǎn)右上角的三個(gè)“...”,然后"在Safari中打開”,就可以點(diǎn)贊咯~


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

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

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