定位與地圖.

Slides:



Advertisements
Similar presentations
青蘋果的代價 參考資料 : 國中性教育教學輔助媒體 (Power Point) 教師手冊. 影片欣賞 -- 愛的晚霞 單純的阿霞人生第一次的愛情,卻是帶來身心嚴重 的傷害,阿霞要如何面對感染愛滋後的生活 …
Advertisements

天水圍的體育設施.
基隆市消防局 消防人員專業講習 公務英語會話 主講人:蔡君慧.
Welcome to Linyi producer: lizhenxing.
On Irritability 英译汉.
第 1 章 地理位置與範圍 一、位置的表示方法 二、位置與生活 三、臺灣的位置與範圍 四、地圖閱讀.
307暑假作業 自選部份,各項的範例!.
新闻写作的特点与技巧 主讲:毛兆宏.
賴 東 進 遊 大 觀 園.
Objective C介紹與MVC.
出隊服務經驗分享 分享人:大丁.
Google App Engine Google 應用服務引擎.
EBay客服信及處理技巧 Jerry Chen.
資料儲存.
Unit 5 Dialogues Detailed Study of Dialogues (对话) Exercises(练习)
3D Model Wan-Yu Chen NTUEE.
《IOS应用开发教程》 QQ学习群:
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
Creating Animated Apps (I) 靜宜大學資管系 楊子青
朝雲端專業DBA邁進: 深入剖析 Windows Azure SQL Database 完整資料庫管理、雲端報表建立、建置分散式雲端資料庫
Dì 十四kè 我家的 hòu biān 有一個很piàoliàng 的公園/ 我家的 hòu biān 有一个很piàoliàng 的公园
Working with Databases (II) 靜宜大學資管系 楊子青
力量 磁铁 磁性.
在一定程度上 人类的思维产生于 简单个体之间的相互作用 ——Marvin Minsky.
Scratch程式設計 2016/04/06.
IPHONE应用开发 资源管理项目组 2018年12月24日.
Location Identification and Vehicle Tracking using VANET(VETRAC)
2019/1/13 行動裝置如何使用東海大學SSLVPN.
第二章 防火墙基础技术.
服務於中國研究的網絡基礎設施 A Cyberinfrastructure for Historical China Studies
感測器.
Chapter 5 Recursion.
Web Server 王宏瑾.
利用 ASP.NET MVC 提升您的 Web 應用程式
Sensor Networks: Applications and Services
Mobile Project C.E.O. Project B 賈乃輝 B 黃昱翔.
《IOS应用开发基础教程》 QQ学习群:
Navigation Controller和 Table View
Guide to a successful PowerPoint design – simple is best
数据块中的数据存储 目录 页 目标 …… 数据存储区 … ……… 数据块 (DB) … STEP 7数据类型概述 STEP 7基本数据类型
3.5 Region Filling Region Filling is a process of “coloring in” a definite image area or region. 2019/4/19.
中国科学技术大学计算机系 陈香兰 2013Fall 第七讲 存储器管理 中国科学技术大学计算机系 陈香兰 2013Fall.
虚 拟 仪 器 virtual instrument
Common Qs Regarding Earnings
中央社新聞— <LTTC:台灣學生英語聽說提升 讀寫相對下降>
CH1 我的第一個App與變數宣告.
IIS Internet Information Services
林一平 講座教授 資訊學院院長 新竹國立交通大學
北投溫泉博物館 建築特色 ★小組成員:高103林孟璇、林念儀、施妤柔★.
Objective C練習.
GridView.
取材 Tommy’s Window slideshow
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
陕西丹凤中学 靳庆军 Shaanxi Danfeng Middle School Jin Qingjun
计算机问题求解 – 论题1-5 - 数据与数据结构 2018年10月16日.
Video 影像 (VideoPlayer 影像播放器、Camcorder 錄影機) 靜宜大學資管系 楊子青
M; Well, let me check again with Jane
Create and Use the Authorization Objects in ABAP
創造思考的開發與培養.
Current status Next step Symbian S60 UI implementation(80%)
打Mole不打Ladybug (IV): 讓使用者控制Ladybug移動 靜宜大學資管系 楊子青
2012 程式設計比賽 Openfind 天使帝國 v2.0 (蓋亞的紋章).
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
Creating Animated Apps: Canvas與ImageSprite 靜宜大學資管系 楊子青
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
之前都是分类的蒸馏很简单。然后从分类到分割也是一样,下一篇是检测的蒸馏
多點觸控與手勢.
Ultra-high-voltage(UHV) electricity transmission
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
Presentation transcript:

定位與地圖

Location

Get Location 檢查定位方式是否打開 建立一個CLLocationManager物件並設定 delegate用來 接收位置改變資訊 設定需要的位置更新類型 啟動偵測位置改變

CLLocationManager 需加入CoreLocation framework 檢查位置服務是否開啟 檢查是否可取得裝置朝向資訊 + (BOOL)locationServicesEnabled 檢查是否可取得裝置朝向資訊 + (BOOL)headingAvailable (compass)

CLLocationManager + (CLAuthorizationStatus)authorizationStatus 應用程式授權位置服務狀態 typedef enum { kCLAuthorizationStatusNotDetermined = 0, kCLAuthorizationStatusRestricted , kCLAuthorizationStatusDenied , kCLAuthorizationStatusAuthorized , kCLAuthorizationStatusAuthorizedAlways = kCLAuthorizationStatusAuthorized , kCLAuthorizationStatusAuthorizedWhenInUse } CLAuthorizationStatus;

CLLocationManager Property CLLocationAccuracy desiredAccuracy 設定要求位置之精確度,預設kCLLocationAccuracyBest kCLLocationAccuracyBestForNavigation; kCLLocationAccuracyBest; kCLLocationAccuracyNearestTenMeters; kCLLocationAccuracyHundredMeters; kCLLocationAccuracyKilometer; kCLLocationAccuracyThreeKilometers; phone should be plugged in to power source The more accuracy you request, the more battery will be used

CLLocationManager Property CLLocationDistance distanceFilter 預設是kCLDistanceFilterNone 只要移動就會有更新事件發 生 CLLocation *location 最近取得的位置 CLHeading *heading 最近取得的裝置方位朝向 id<CLLocationManagerDelegate> delegate 設定位置更新事件的 delegate物件 You can just ask the CLLocationManager for the location or heading, but usually we don’t. We let it update us when the location changes (enough) via its delegate.

CLLocationManager Property CLLocationDegrees headingFilter 設定角度更新事件的度數 (measured in degrees) 預設是kCLHeadingFilterNone 只要有更動就會發生事件 CLDeviceOrientation headingOrientation 角度的參考點,預設是手機的頂端代表北方(0度) typedef enum { CLDeviceOrientationUnknown = 0, CLDeviceOrientationPortrait, CLDeviceOrientationPortraitUpsideDown, CLDeviceOrientationLandscapeLeft, CLDeviceOrientationLandscapeRight, CLDeviceOrientationFaceUp, CLDeviceOrientationFaceDown } CLDeviceOrientation;

CLLocationManager -(void)startUpdatingLocation - (void)stopUpdatingLocation 啟動/停止位置更新事件 - (void)startUpdatingHeading - (void)stopUpdatingHeading 啟動/停止方向更新事件 - (void)dismissHeadingCalibrationDisplay 方位校正視窗關閉

CLLocationManagerDelegate Protocol - (void)locationManager:(CLLocationManager *) manager didUpdateLocations:(NSArray *)locations 有新位置資訊產生 locations: An array of CLLocation objects,最近取得的位置在陣列最後面 - (void)locationManager:(CLLocationManager *) manager didFailWithError:(NSError *)error 無法取得位置資訊 error kCLErrorLocationUnknown: location service is unable to retrieve a location fix right away, keeps trying. kCLErrorDenied: user denies application’s use of the location service kCLErrorHeadingFailure: too much local magnetic interference, keep waiting

CLLocationManagerDelegate Protocol - (void)locationManagerDidPauseLocationUpdates: (CLLocationManager *)manager - (void)locationManagerDidResumeLocationUpdates: (CLLocationManager *)manager - (void)locationManager:(CLLocationManager *) manager didChangeAuthorizationStatus: (CLAuthorizationStatus) status

CLLocationManagerDelegate - (BOOL) locationManagerShouldDisplayHeadingCalibration: (CLLocationManager *) manager 是否要顯示校正視窗 校正完後視窗會消失,或是呼叫 dismissHeadingCalibrationDisplay 方法 - (void)locationManager:(CLLocationManager *) manager didUpdateHeading:(CLHeading *) newHeading

CLLocation Property CLLocationCoordinate2D coordinate typedef struct { CLLocationDegrees latitude; CLLocationDegrees longitude; } CLLocationCoordinate2D; Property CLLocationCoordinate2D coordinate NSDate *timestamp 定位時的時間 CLLocationDistance altitude 海拔高度(公尺) CLLocationSpeed speed 瞬間速度,負值表示速度不可用 meters/second CLLocationDirection course 移動方向 degrees, 0 is north, clockwise

CLLocation - (CLLocationDistance) distanceFromLocation: (const CLLocation *) location 回傳與參數location位置的距離(m)

CLHeading Property CLLocationDirection magneticHeading  裝置朝向(與磁北極的角度) CLLocationDirection trueHeading NSDate *timestamp

練習 取得裝置目前的位置和方向資訊

CLGeocoder 經緯度與地址轉換 - (void)reverseGeocodeLocation:(CLLocation *) location completionHandler: (CLGeocodeCompletionHandler)completionHandle r - (void)geocodeAddressString:(NSString *) addressString completionHandler: (CLGeocodeCompletionHandler)completionHandle r - (void)cancelGeocode Cancels a pending geocoding request.

CLGeocodeCompletionHandler typedef void (^CLGeocodeCompletionHandler) (NSArray *placemark, NSError *error);

CLPlacemark Placemark Attributes NSString *name NSDictionary *addressDictionary NSString *administrativeArea The state associated with the placemark NSString *subAdministrativeArea Additional administrative area information for the placemark NSString *country

CLPlacemark NSString *postalCode NSString *locality The city associated with the placemark. NSString *subLocality Additional city-level information for the placemark NSString *thoroughfare The street address associated with the placemark. NSString *subThoroughfare Additional street-level information for the placemark.

範例 CLGeocoder *geo=[[CLGeocoder alloc]init]; [geo reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) { if (error){ NSLog(@"Geocode failed with error: %@", error); return; } NSLog(@"Received placemarks: %@", placemarks[0]); }];

Map

MapKit 加入MapKit framework 將MapView拉到View上 Type:地圖模式 Map Satellite Hybrid

MKMapView Property MKMapType mapType BOOL zoomEnabled enum { MKMapTypeStandard, MKMapTypeSatellite, MKMapTypeHybrid }; typedef NSUInteger MKMapType; Property MKMapType mapType BOOL zoomEnabled BOOL scrollEnabled BOOL pitchEnabled //傾斜地圖平面 BOOL rotateEnabled BOOL showsUserLocation (是否嘗試顯示使用者位置, 可能不可見) BOOL userLocationVisible (read-only)(使用者位置是 否在目前地圖上可見) MKUserLocation *userLocation The annotation object representing the user’s current location.

MKMapView MKCoordinateRegion region map view目前顯示的區域 CLLocationCoordinate2D centerCoordinate - (void) setRegion:(MKCoordinateRegion)region animated:(BOOL) animated 設定map view顯示範圍 - (void) setCenterCoordinate:(CLLocationCoordinate2D ) coordinate animated:(BOOL) animated 設定地圖中心點經緯度

MKCoordinateRegion latitudeDelta / longitudeDelta typedef struct { CLLocationCoordinate2D center; MKCoordinateSpan span; } MKCoordinateRegion; typedef struct { CLLocationDegrees latitude; CLLocationDegrees longitude; } CLLocationCoordinate2D; typedef double CLLocationDegrees; typedef struct { CLLocationDegrees latitudeDelta; CLLocationDegrees longitudeDelta; } MKCoordinateSpan; latitudeDelta / longitudeDelta The amount of north-to-south / east-to-west distance (measured in degrees) to display on the map. One degree of latitude is approximately 111 kilometers. One degree of longitude spans a distance of approximately 111 kilometers at the equator but shrinks to 0 kilometers at the poles.

MKCoordinateSpan mapSpan; mapSpan.latitudeDelta=0.005; mapSpan.longitudeDelta=0.005; MKCoordinateRegion mapRegion; mapRegion.center=newLocation.coordinate; mapRegion.span=mapSpan; mapView.region=mapRegion;

MKMapView 經緯度與view座標轉換 - (CGPoint)convertCoordinate:(CLLocationCoordina te2D) coordinate toPointToView:(UIView *) view 經緯度轉換成指定view的坐標 - (CLLocationCoordinate2D)convertPoint:(CGPoint) point toCoordinateFromView:(UIView *)view 指定view的坐標轉換成經緯度

MKMapView 定義地圖相關事件 載入地圖相關事件 MKMapView拉線到實作MKMapViewDelegate的ViewController 定義地圖相關事件 載入地圖相關事件 (void)mapViewWillStartLoadingMap:(MKMapView *) mapView (void)mapViewDidFinishLoadingMap:(MKMapView *) mapView (void)mapViewDidFailLoadingMap:(MKMapView *) mapView withError:(NSError *)error

MKMapViewDelegate 追蹤使用者位置相關事件 (void)mapViewWillStartLocatingUser:(MKMapView *) mapView (void)mapViewDidStopLocatingUser:(MKMapView *) mapView (void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error Tells the delegate that an attempt to locate the user’s position failed. (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

練習 隨著位置改變地圖跟著移動

標記與註記 由一個data model與view組成 Data model:指定標題副標題和經緯度 View:data model視覺化呈現 MKAnnotation Protocol View:data model視覺化呈現 MKAnnotationView 地圖標記由MKMapViewDelegate的 mapView:viewForAnnotation:呈現

MKAnnotation Protocol 提供標記相關資訊給map view CLLocationCoordinate2D coordinate - (void) setCoordinate: (CLLocationCoordinate2D) newCoordinate - (NSString *)title - (NSString *)subtitle

myAnnotation.h myAnnotation.m #import <Foundation/Foundation.h> #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h> @interface myAnnotation : NSObject<MKAnnotation> -(id)initWithCoordinate:(CLLocationCoordinate2D)theCoordinate title:(NSString *) theTitle subtitle:(NSString *) theSubtitle; @property(nonatomic,assign)CLLocationCoordinate2D coordinate; @property(nonatomic,copy)NSString * title; @property(nonatomic,copy)NSString * subtitle; @end myAnnotation.h #import "myAnnotation.h” @implementation myAnnotation -(id)initWithCoordinate:(CLLocationCoordinate2D)theCoordinate title:(NSString *) theTitle subtitle:(NSString *) theSubtitle{ self=[super init]; self.coordinate=theCoordinate; self.title=theTitle; self.subtitle=theSubtitle; return self; } @end myAnnotation.m

MKMapView 地圖標記 標示 選取 移除 Property NSArray *annotations NSArray *selectedAnnotations - (void)addAnnotation:(id < MKAnnotation >) annotation - (void)addAnnotations:(NSArray *) annotations - (void)removeAnnotation:(id < MKAnnotation >) annotation - (void)removeAnnotations:(NSArray *)annotations

MKMapView - (void)selectAnnotation:(id < MKAnnotation >) annotation animated:(BOOL)animated 選取指定的標記,並顯示callout view - (void)deselectAnnotation:(id < MKAnnotation >) annotation animated:(BOOL)animated 取消選取指定的標記,並讓callout view消失

地圖加入標記 CLLocationCoordinate2D coord; coord.latitude=25; coord.longitude=121.25; myAnnotation *my=[[myAnnotation alloc]initWithCoordinate:coord title:@"test" subtitle:@"subtest"]; [self.myMap addAnnotation:my];

練習 在目前位置加入標記

標記與註記 由一個data model與view組成 Data model:指定標題副標題和經緯度 View:data model視覺化呈現 MKAnnotation Protocol View:data model視覺化呈現 MKAnnotationView 地圖標記由MKMapViewDelegate的 mapView:viewForAnnotation:呈現

MKAnnotationView - (id)initWithAnnotation:(id <MKAnnotation>) annotation reuseIdentifier: (NSString *) reuseIdentifier Property BOOL enabled 預設YES. NO:annotation view會忽略觸控事件,且不能選取 UIImage *image id <MKAnnotation> annotation The annotation object currently associated with the view. BOOL highlighted

MKAnnotationView Property CGPoint centerOffset CGPoint calloutOffset 標記中心點坐標偏移量 CGPoint calloutOffset callout bubble位置的移動偏移量 若設定為 (0, 0)表示callout bubble會放置在標記frame的上方 中間位置

MKAnnotationView Property BOOL canShowCallout UIView *leftCalloutAccessoryView UIView *rightCalloutAccessoryView

MKMapView - (MKAnnotationView *) dequeueReusableAnnotationViewWithIdentifier:(N SString *) identifier 回傳可重複使用的annotation view

MKMapViewDelegate 標記相關 (MKAnnotationView *)mapView:(MKMapView *) mapView viewForAnnotation:(id <MKAnnotation>) annotation 要客製化標記需覆寫此方法,回傳客製化的 MKAnnotationView 這個可能回傳 MKUserLocation 物件表示目前位置 (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views 一個或多個annotation views被加入,此方法會被呼叫

MKMapViewDelegate - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *) view - (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *) view

練習 在目前位置加入標記,標記 為自行定義之樣式,標記中 顯示位置資訊

-(MKAnnotationView. )mapView:(MKMapView -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { MKAnnotationView *view= [self.mapView dequeueReusableAnnotationViewWithIdentifier:@"myanno"]; if(!view) view=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myanno"]; view.image=[UIImage imageNamed:@"apple1.png"]; view.canShowCallout=YES; view.rightCalloutAccessoryView= [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; } return view;

MKPinAnnotationView Property BOOL animatesDrop 此標記出現在視窗上時是否有動畫 MKPinAnnotationColor pinColor 設定預設大頭針標記頭的顏色 enum { MKPinAnnotationColorRed = 0, //destination points MKPinAnnotationColorGreen, //starting points MKPinAnnotationColorPurple //user-specified points }; typedef NSUInteger MKPinAnnotationColor;

-(MKAnnotationView. )mapView:(MKMapView -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { MKPinAnnotationView *view=(MKPinAnnotationView *) [self.mapView dequeueReusableAnnotationViewWithIdentifier:@"myanno"]; if(!view) view=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myanno"]; view.pinColor=MKPinAnnotationColorPurple; view.animatesDrop=YES; view.rightCalloutAccessoryView= [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; } return view;