Core Location和MapKit的一些简单使用
Core Location
1. 基本对象是CLLocation,有属性coordinate, altitude, horizontal/vertical Accuracy, timestamp, speed, course
- <span style="font-size:18px;">typedef {
- CLLocationDegrees latitude; // a double
- CLLocationDegrees longitude; // a double
- } CLLocationCoordinate2D; // 经纬度</span>
- @property (readonly) CLLocationAccuracy horizontalAccuracy; // in meters
- @property (readonly) CLLocationAccuracy verticalAccuracy;
- kCLLocationAccuracyBestForNavigation;
- kCLLocationAccuracyBest;
- kCLLocationAccuracyNearestTenMeters;
- kCLLocationAccuracyHundredMeters;
- kCLLocationAccuracyKilometer;
- kCLLocationAccuracyThreeKilometers;
- - (CLLocationDistance)distanceFromLocation:(CLLocation *)otherLocation; // in meters 两个位置之间的距离
2. 总是通过CLLocationManager来获取CLLocation(通过其代理),其一般的使用方法为:
(1)检查硬件是否支持你需要的位置更新
(2)创建一个CLLocationManager实例,并设置接收更新的代理对象
(3)根据你的需求对CLLocationManager进行配置
(4)启动CLLocationManager来监视改变。
3. Core Location Manager的一些设置
- @property CLLocationAccuracy desiredAccuracy; // always set this as low as possible
- @property CLLocationDistance distanceFilter;
- - (void)startUpdatingLocation;
- - (void)stopUpdatingLocation;
- - (void)startMonitoringSignificantLocationChanges;
- - (void)stopMonitoringSignificantLocationChanges;
Core Location框架提供了三种用于追踪设备当前位置的服务
The significant-change location
service 提供了低耗电的方法来获取当前位置,当前位置改变时会发出通知
The standard location service 提供了一种可设置的方法来获取当前位置
Region monitoring 监视特定地区的跨越
- Listing 1 Starting the standard location service
- - (void)startStandardUpdates
- {
- // 创建location manager
- if (nil == locationManager)
- locationManager = [[CLLocationManager alloc] init];
- locationManager.delegate = self;
- // 设置获取位置的精确度,越精确越耗电
- locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
- // 设置距离过滤器,超过次距离就更新一次位置
- locationManager.distanceFilter = 500;
- [locationManager startUpdatingLocation];
- }
- Listing 2 Significant-Change Location Service
- - (void)startSignificantChangeUpdates
- {
- // Create the location manager if this object does not
- // already have one.
- if (nil == locationManager)
- locationManager = [[CLLocationManager alloc] init];
- locationManager.delegate = self;
- [locationManager startMonitoringSignificantLocationChanges];
- }
4. 检查硬件
- + (BOOL)locationServicesEnabled; // has the user enabled location monitoring in Settings?
- + (BOOL)headingAvailable; // can this hardware provide heading info (compass)?
- + (BOOL)significantLocationChangeMonitoringAvailable; // only if device has cellular?
- + (BOOL)regionMonitoringAvailable; // only certain iOS4 devices
- + (BOOL)regionMonitoringEnabled; // by the user in Settings
当程序初次使用位置服务时,会询问用户。可以提供一个string来描述使用目的。如果用户拒绝,则上面所有方法均返回NO
@property (copy) NSString *purpose
5. 获取位置更新
- // Delegate method from the CLLocationManagerDelegate protocol.
- - (void)locationManager:(CLLocationManager *)manager
- didUpdateToLocation:(CLLocation *)newLocation
- fromLocation:(CLLocation *)oldLocation
- {
- // If it's a relatively recent event, turn off updates to save power
- NSDate* eventDate = newLocation.timestamp;
- NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
- if (abs(howRecent) < 15.0)
- {
- NSLog(@"latitude %+.6f, longitude %+.6f\n",
- newLocation.coordinate.latitude,
- newLocation.coordinate.longitude);
- }
- // else skip the event and process the next one.
- }
- - (void)locationManager:(CLLocationManager *)manager
- didFailWithError:(NSError *)error;
- typedef enum {
- kCLErrorLocationUnknown = 0,
- kCLErrorDenied, // 如果用户拒绝开启位置服务,那么应该停止location manager
- kCLErrorNetwork,
- kCLErrorHeadingFailure,
- kCLErrorRegionMonitoringDenied,
- kCLErrorRegionMonitoringFailure,
- kCLErrorRegionMonitoringSetupDelayed,
- } CLError;
6. Geocoding Location Data
Geocoder对象使用网络服务来将经纬度转换为具体地址信息,iOS当前只支持经纬度转地址信息,不能将位置信息转换为经纬度
创建一个MKReverseGeocoder实例,设置代理,调用start方法。
代理会接受到 reverseGeocoder:didFindPlacemark:和reverseGeocoder:didFailWithError:
- @implementation MyGeocoderViewController (CustomGeocodingAdditions)
- - (void)geocodeLocation:(CLLocation*)location forAnnotation:(MapLocation*)annotation
- {
- MKReverseGeocoder* theGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:location.coordinate];
- theGeocoder.delegate = self;
- [theGeocoder start];
- }
- // Delegate methods
- - (void)reverseGeocoder:(MKReverseGeocoder*)geocoder didFindPlacemark:(MKPlacemark*)place
- {
- MapLocation* theAnnotation = [map annotationForCoordinate:place.coordinate];
- if (!theAnnotation)
- return;
- // Associate the placemark with the annotation.
- theAnnotation.placemark = place;
- // Add a More Info button to the annotation's view.
- MKPinAnnotationView* view = (MKPinAnnotationView*)[map viewForAnnotation:annotation];
- if (view && (view.rightCalloutAccessoryView == nil))
- {
- view.canShowCallout = YES;
- view.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
- }
- }
- - (void)reverseGeocoder:(MKReverseGeocoder*)geocoder didFailWithError:(NSError*)error
- {
- NSLog(@"Could not retrieve the specified place information.\n");
- }
- @end
- @implementation MKMapView (GeocoderAdditions)
- - (MapLocation*)annotationForCoordinate:(CLLocationCoordinate2D)coord
- {
- // Iterate through the map view's list of coordinates
- // and return the first one whose coordinate matches
- // the specified value exactly.
- id<MKAnnotation> theObj = nil;
- for (id obj in [self annotations])
- {
- if (([obj isKindOfClass:[MapLocation class]]))
- {
- MapLocation* anObj = (MapLocation*)obj;
- if ((anObj.coordinate.latitude == coord.latitude) &&
- (anObj.coordinate.longitude == coord.longitude))
- {
- theObj = anObj;
- break;
- }
- }
- }
- return theObj;
- }
- @end
MapKit
1. MKMapView 显示地图
2. 地图上可以显示注释(annotation),每个annotation由coordinate,title,subtitle构成,并由MKAnnotationView来显示
3. Annotation可以有一个callout,当annotation view被点击时显示,默认情况下只是显示title和subtitle,不过你可以添加左右accessory views
4. MKMapView显示一个遵守MKAnnotation协议的数组对象
- @property (readonly) NSArray *annotations; // contains id <MKAnnotation> objects
- <pre name="code" class="plain">MKAnnotation protocol
- @protocol MKAnnotation <NSObject>
- @property (readonly) CLLocationCoordinate2D coordinate;
- @optional
- @property (readonly) NSString *title;
- @property (readonly) NSString *subtitle;
- @end
- typedef {
- CLLocationDegrees latitude;
- CLLocationDegrees longitude;
- } CLLocationCoordinate2D;</pre><br>
- <br>
- <pre></pre>
- <p></p>
- <pre></pre>
- <p></p>
- <p><span style="font-size:18px">5. 管理map view的annotations的方法</span></p>
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="plain">- (void)addAnnotation:(id <MKAnnotation>)annotation;
- - (void)addAnnotations:(NSArray *)annotations;
- - (void)removeAnnotation:(id <MKAnnotation>)annotation;
- - (void)removeAnnotations:(NSArray *)annotations;</pre><br>
- 6. MKMapView使用跟TableView类似的方法来重用annotation view
- <p></p>
- <p><span style="font-size:18px">7. Annotations通过MKAnnotationView的子类显示在地图上,默认为MKPinAnnotationView<br>
- </span></p>
- <p><span style="font-size:18px">8. 如果MKAnnotationView的canShowCallout设置为YES,那么点击会显示,同时会调用</span></p>
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="plain">- (void)mapView:(MKMapView *)sender didSelectAnnotationView:(MKAnnotationView *)aView;
- //This is a great place to set up the MKAnnotationView‘s callout accessory views lazily.
- </pre>
- <p></p>
- <p><span style="font-size:18px">9. MKAnnotationViews的创建方法跟tableviewcell在tableview中的创建类似</span></p>
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="plain">- (MKAnnotationView *)mapView:(MKMapView *)sender
- viewForAnnotation:(id <MKAnnotation>)annotation
- {
- MKAnnotationView *aView = [sender dequeueReusableAnnotationViewWithIdentifier:IDENT];
- if (!aView) {
- aView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
- reuseIdentifier:IDENT];
- // set canShowCallout to YES and build aView’s callout accessory views here
- }
- aView.annotation = annotation; // yes, this happens twice if no dequeue
- // maybe load up accessory views here (if not too expensive)?
- <span style="color:#FF0000;"> // or reset them and wait until mapView:didSelectAnnotationView: to load actual data</span>
- return aView;
- }
- </pre>
- <p></p>
- <p><span style="font-size:18px">10. MKAnnotationView的一些属性</span></p>
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="plain">@property id <MKAnnotation> annotation; // the annotation; treat as if readonly
- @property UIImage *image; // instead of the pin, for example
- @property UIView *leftCalloutAccessoryView; // maybe a UIImageView
- @property UIView *rightCalloutAccessoryView; // maybe a “disclosure” UIButton
- @property BOOL enabled; // NO means it ignores touch events, no delegate method, no callout
- @property CGPoint centerOffset; // where the “head of the pin” is relative to the image
- @property BOOL draggable; // only works if the annotation implements setCoordinate:</pre><br>
- <span style="font-size:18px">11. 如果你设置一个callout accessory view为一个UIControl</span>
- <p></p>
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="plain">e.g. aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
- The following MKMapViewDelegate method will get called when the accessory view is touched ...
- - (void)mapView:(MKMapView *)sender
- annotationView:(MKAnnotationView *)aView
- calloutAccessoryControlTapped:(UIControl *)control;</pre><br>
- <span style="font-size:18px">12. 使用一下代理方法来加载accessory views</span>
- <p></p>
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="plain">-(void)mapView:(MKMapView *)sender didSelectAnnotationView:(MKAnnotationView *)aView
- {
- if ([aView.leftCalloutAccessoryView isKindOfClass:[UIImageView class]]) {
- UIImageView *imageView = (UIImageView *)aView.leftCalloutAccessoryView;
- imageView.image = ...; // if you do this in a GCD queue, be careful, views are reused!
- }
- }</pre>
- <p></p>
- <p><span style="font-size:18px">13. 地图类型</span></p>
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="plain">@property MKMapType mapType;
- <pre name="code" class="plain">enum {
- MKMapTypeStandard = 0,
- MKMapTypeSatellite,
- MKMapTypeHybrid
- };
- typedef NSUInteger MKMapType; </pre><br>
- <pre></pre>
- <p></p>
- <pre></pre>
- <p></p>
- <p><span style="font-size:18px">14. 显示用户当前地址</span></p>
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="plain">@property BOOL showsUserLocation;
- @property (readonly) BOOL isUserLocationVisible;
- @property (readonly) MKUserLocation *userLocation;
- MKUserLocation is an object which conforms to MKAnnotation which holds the user’s location.</pre><br>
- <span style="font-size:18px">15.限制用户对地图的操作</span>
- <p></p>
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="plain">@property BOOL zoomEnabled;
- @property BOOL scrollEnabled;</pre><br>
- <span style="font-size:18px">16. 控制地图的显示区域</span>
- <p></p>
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="plain">@property MKCoordinateRegion region;
- typedef struct {
- CLLocationCoordinate2D center;
- MKCoordinateSpan span;
- } MKCoordinateRegion;
- typedef struct {
- CLLocationDegrees latitudeDelta;
- CLLocationDegrees longitudeDelta;
- }
- - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated; // animate</pre><span style="font-size:18px">注意:</span><br>
- <span style="font-size:18px">你赋给region属性的值通常不是最终保存的值,在设置显示区域的时候同时也设置了缩放等级。map view不能显示任意的缩放等级,因此map view会选择一个能够尽可能显示你指定区域大小的缩放等级,然后根据此时显示的区域来保存。</span><br>
- <br>
- <pre name="code" class="plain">@property CLLocationCoordinate2D centerCoordinate;
- - (void)setCenterCoordinate:(CLLocationCoordinate2D)center animated:(BOOL)animated;</pre><br>
- <span style="font-size:18px">17. 地图载入通知</span>
- <p></p>
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="plain">Remember that the maps are downloaded from Google earth.
- - (void)mapViewWillStartLoadingMap:(MKMapView *)sender;
- - (void)mapViewDidFinishLoadingMap:(MKMapView *)sender;
- - (void)mapViewDidFailLoadingMap:(MKMapView *)sender withError:(NSError *)error;</pre>
- <p></p>
- <p><span style="font-size:18px">18. <br>
- </span></p>
- <p><span style="font-size:18px"><br>
- </span></p>
- <p><span style="font-size:18px"><br>
- </span></p>
- <p><span style="font-size:18px"><br>
- </span></p>
- <p><span style="font-size:18px"><br>
- </span></p>
- <p><span style="font-size:18px"><br>
- </span></p>
- <p><span style="font-size:18px"><br>
- </span></p>
- <p><br>
- </p>
- </pre>
Core Location和MapKit的一些简单使用的更多相关文章
- iOS 苹果自带地图定位Core Location
Core Location是iOS SDK中一个提供设备位置的框架.可以使用三种技术来获取位置:GPS.蜂窝或WiFi.在这些技术中,GPS最为精准,如果有GPS硬件,Core Location将优先 ...
- iPhone的定位技术与Core Location框架
来源:http://www.cnblogs.com/lovecode/archive/2011/12/24/2300579.html iPhone定位来源通常有:1. GPS定位 2. WiFi定位 ...
- iOS开发-Core Location和Map Kit
一.Core Location确定物理位置 利用以下3种技术: 1.GPS(最精确的) 2.蜂窝基站ID定位(cell ID Location) 3.WPS(Wi-Fi Positioning Ser ...
- 关于Core Location-ios定位
IOS中的core location提供了定位功能,能定位装置的当前坐标,同一时候能得到装置移动信息.由于对定位装置的轮询是非常耗电的,所以最好仅仅在非常必要的前提下启动. 当中,最重要的类是CLLo ...
- IOS开发之Core Location
IOS 支持三种检测当前位置的方式:手机基站.Wi-Fi.和GPS,其中GPS是经度最高的,同时也是最耗费手机电量的.一般情况下在室内是无法通过GPS获 取位置信息的,通过Wi-Fi获取位置的原理是通 ...
- ios中Core Location跟Map Kit的基本使用
地图类开发应用中,离不开地理位置跟MKMapView的使用,下面就记录下自己在使用这两个东西中学到的. 不过并不是所有苹果的设备都支持地理位置,我们在使用前应该做个判断,代码如下: BOOL loca ...
- Core Location :⽤用于地理定位
Core Location :⽤用于地理定位 在移动互联⽹网时代,移动app能解决⽤用户的很多⽣生活琐事,⽐比如 导航:去任意陌⽣生的地⽅方 周边:找餐馆.找酒店.找银⾏行.找电影院 在上述应⽤用中, ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- Core Location Framework学习
在Apple开发中,尤其是移动设备开发,经常会使用Core Location Framework,这个框架可以使得iOS设备获取当前的地理位置.本文就具体到Core Location 框架中,查看其声 ...
随机推荐
- wampserver 手动启用停用命令
1.定位到安装目录 在cmd中定位到wampserver的安装目录,如:D:\wamp\bin\apache\Apache2.4.4\bin 2.执行命令 启动apache命令httpd -k sta ...
- Java实现 简单聊天软件
简单的聊天软件 //客户端 package yjd9; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; ...
- windows系统IIS服务安装
打开控制面板,win8可以使用快捷键win键+X打开列表 打开程序和功能 打开左上角启用或关闭windows功能 打开internet信息服务下拉单 按照下列图中进行对应项勾选 第一个 ...
- Phalcon Framework的Mvc结构及启动流程(部分源码分析)
创建项目 Phalcon环境配置安装后,可以通过命令行生成一个标准的Phalcon多模块应用 phalcon project eva --type modules入口文件为public/index.p ...
- 推断iframe里的页面载入完毕
//推断iframe是否载入完毕,RMid为iframe的ID document.getElementById("RMid").onload = function () { ale ...
- ansible 的user模块
user模块与group模块 user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令. ...
- DataGridView:DataGridView控件清空绑定的数据
使用DataGridView控件绑定数据后有时需要清空绑定的数据,在清除DataGridView绑定的数据时: 1.设置DataSource为null this.dgvDemo.DataSource ...
- 一、VM8.0 + CentOS 6.5 连接网络
VM8.0 + CentOS 6.5 连接网络
- mac配置完ssh依然提示"Enter passphrase for key"解决方法
使用Git,每次都提示输入命令. 这个问题折磨很久,明明已经配置过ssh了,可是每次还要提示输入密码,从网上查查,最后一条命令解决问题: 问题提示: Enter passphrase for key ...
- 腾讯云 Linux 挂载数据盘
查看已挂载的硬盘 1) 运行fdisk -l命令查看硬盘信息. 硬盘从未进行初始化时,需要先创建文件系统, 硬盘格式化 运行mkfs.ext4 device_n ...