iOS原生地圖開發進階——使用導航和附近興趣點檢索
iOS中的mapKit架構對國際化的支援非常出色。在前些篇部落格中,對這個地圖架構的基礎用法和标注與覆寫物的添加進行了詳細的介紹,這篇部落格将介紹兩個更加實用的功能的開發:線路導航與興趣點搜尋。前幾篇部落格的連結如下:
地圖基礎用法詳解:
http://my.oschina.net/u/2340880/blog/415360。
添加大頭針與自定義标注:
http://my.oschina.net/u/2340880/blog/415441添加地圖覆寫物:
http://my.oschina.net/u/2340880/blog/415611一、線路導航
1、從幾個類的關系說起
(1)MKPlacemark
一個地點資訊類,如下:
@interface MKPlacemark : CLPlacemark <MKAnnotation>
//初始化方法,通過給定一個經緯度和地點資訊字典
- (instancetype)initWithCoordinate:(CLLocationCoordinate2D)coordinate
addressDictionary:(NSDictionary *)addressDictionary;
//國家編碼
@property (nonatomic, readonly) NSString *countryCode;
@end
(2)MKMapItem
地點節點類,包含此節點的許多地點資訊,如下:
@interface MKMapItem : NSObject
//目前節點的地點資訊對象
@property (nonatomic, readonly) MKPlacemark *placemark;
//是否是目前位置
@property (nonatomic, readonly) BOOL isCurrentLocation;
//節點名稱
@property (nonatomic, copy) NSString *name;
//電話号碼
@property (nonatomic, copy) NSString *phoneNumber;
//網址
@property (nonatomic, strong) NSURL *url;
//将目前位置建立為節點
+ (MKMapItem *)mapItemForCurrentLocation;
//由一個位置資訊建立節點
- (instancetype)initWithPlacemark:(MKPlacemark *)placemark;
(3)MKDirectionsRequest
導航請求類
@interface MKDirectionsRequest : NSObject
//起點節點
- (MKMapItem *)source NS_AVAILABLE(10_9, 6_0);
- (void)setSource:(MKMapItem *)source NS_AVAILABLE(10_9, 7_0);
//目的地節點
- (MKMapItem *)destination NS_AVAILABLE(10_9, 6_0);
- (void)setDestination:(MKMapItem *)destination NS_AVAILABLE(10_9, 7_0);
這個類還有一些擴充的設定屬性:
@property (nonatomic) MKDirectionsTransportType transportType;
設定路線檢索類型,枚舉如下:
typedef NS_OPTIONS(NSUInteger, MKDirectionsTransportType) {
MKDirectionsTransportTypeAutomobile = 1 << 0,//适合駕車時導航
MKDirectionsTransportTypeWalking = 1 << 1,//适合步行時導航
MKDirectionsTransportTypeAny = 0x0FFFFFFF//任何情況
};
@property (nonatomic) BOOL requestsAlternateRoutes;
設定是否搜尋多條線路
@property (nonatomic, copy) NSDate *departureDate;
設定出發日期
@property (nonatomic, copy) NSDate *arrivalDate;
設定到達日期
(4)MKDirections
從apple伺服器擷取資料的連接配接類
@interface MKDirections : NSObject
//初始化方法
- (instancetype)initWithRequest:(MKDirectionsRequest *)request NS_DESIGNATED_INITIALIZER;
//開始計算線路資訊
- (void)calculateDirectionsWithCompletionHandler:(MKDirectionsHandler)completionHandler;
//開始計算時間資訊
- (void)calculateETAWithCompletionHandler:(MKETAHandler)completionHandler;
//取消
- (void)cancel;
//是否正在計算
@property (nonatomic, readonly, getter=isCalculating) BOOL calculating;
(5)MKDirectionsResponse
線路資訊結果類
@interface MKDirectionsResponse : NSObject
@property (nonatomic, readonly) MKMapItem *source;//起點
@property (nonatomic, readonly) MKMapItem *destination;//終點
@property (nonatomic, readonly) NSArray *routes; //線路規劃數組
(6)MKETResponse
時間資訊結果類
@interface MKETAResponse : NSObject
@property (nonatomic, readonly) NSTimeInterval expectedTravelTime;//耗時
(7)MKRoute
線路資訊類,導航的線路結果是這個類型的對象
@interface MKRoute : NSObject
@property (nonatomic, readonly) NSString *name; //線路名稱
@property (nonatomic, readonly) NSArray *advisoryNotices; //注意事項
@property (nonatomic, readonly) CLLocationDistance distance; //距離
@property (nonatomic, readonly) MKDirectionsTransportType transportType; //檢索的類型
@property (nonatomic, readonly) MKPolyline *polyline; // 線路覆寫物
@property (nonatomic, readonly) NSArray *steps; // 線路詳情數組
(8)MKRouteStep
線路詳情資訊類,線路中每一步的資訊都是這個類的對象
@interface MKRouteStep : NSObject
@property (nonatomic, readonly) NSString *instructions; // 節點資訊
@property (nonatomic, readonly) NSString *notice; // 注意事項
@property (nonatomic, readonly) MKPolyline *polyline; //線路覆寫物
@property (nonatomic, readonly) CLLocationDistance distance; // 距離
@property (nonatomic, readonly) MKDirectionsTransportType transportType; // 導航類型