3.定位                              

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

1.前言发现在很多的社交软件都引入了地图和定位功能,如果我们要想实现这两大功能,需要利用到两个框架:MapKit和CoreLocation

我们先来看看CoreLocation框架:

它可以使用硬件设备来进行定位服务,不需要地图,精度相对略差,省电。

而MapKit框架:

能够使应用程序做一些地图展示与交互的相关功能,必须有地图,精度相对较高,费电。

下面我就说说它的能实现的一些常用功能

2.地图常见操作

@PRoperty (weak, nonatomic) IBOutletMKMapView *mapView;

2.1. 标记用户当前位置、跟踪用户位置1//标记用户当前位置2//跟踪用户位置3[_mapView setUserTrackingMode:MKUserTrackingModeFollow];

2.1.地图的类型可以通过设置MKMapView的mapViewType设置地图类型

MKMapTypeStandard 普通地图

MKMapTypeSatellite 卫星云图

MKMapTypeHybrid普通地图覆盖于卫星云图之上

//地图类型[_mapView setMapType:MKMapTypeHybrid];

2.2.通过代理的方式可以跟踪用户的位置变化

2.2.1.mapViewWillStartLoadingMap: 当地图界面将要加载时调用

2.2.2.mapView:viewForAnnotation: 当地图上有大头针时调用

2.2.3.mapViewWillStartLocatingUser:当准备进行一个位置定位时调用

2.2.4.mapView:regionDidChangeAnimated: 当显示的区域发生变化时调用

2.2.5.mapView:didUpdateUserLocation:当用户位置发生变化时调用

1//通过代理的方式可以跟踪用户的位置变化2_mapView.delegate= self;

#pragmamark - 地图代理方法#pragmamark 会频繁调用,非常费电

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

{//显示用户周边信息 拉近地图设置地图显示区域

CLLocationCoordinate2D center = userLocation.location.coordinate;

MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(center, 100.0, 100.0);

[mapView setRegion:region animated:YES];

}

2.3.添加默认大头针(地标)1.通过MapView的addAnnotation方法可以添加一个大头针到地图上

2.通过MapView的addAnnotations方法可以添加多个大头针到地图上

头文件里说明:- (void)addAnnotation:(id <MKAnnotation>)annotation;

4.说明需要传入一个遵守了MKAnnotation协议的对象

1MyAnnotation *annotation2 =[[MyAnnotation alloc] init];2annotation2.coordinate = CLLocationCoordinate2DMake(30,106);3annotation2.title =@"重庆";4annotation2.subtitle =@"重庆详细描述";5annotation2.imageName =@"head0";

[_mapView addAnnotation:annotation2];

2.4.添加自定义大头针(重用地标)1#pragmamark 自定义大头针视图2- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation3{4//判断annotation参数是否是MyAnnotation5//如果不是MyAnnotaion说明是系统的大头针,无需做处理6if(![annotation isKindOfClass:[MyAnnotationclass]]) {7//使用系统默认的大头针8returnnil;9}1011//可重用标示符12staticNSString *ID =@"MyAnno";1314//查询可重用的大头针15MKAnnotationView *annoView =[mapView dequeueReusableAnnotationViewWithIdentifier:ID];1617//如果没有找到,再去实例化大头针18if(annoView ==nil) {19annoView =[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];2021//自定义大头针视图,如果要接受用户响应,需要设置此属性22annoView.canShowCallout =YES;23}2425//设置大头针26annoView.annotation =annotation;27//转换成MyAnnotation28//设置大头针视图的图像29MyAnnotation *anno =annotation;30annoView.image =[UIImage imageNamed:anno.imageName];3132NSLog(@"自定义大头针");3334returnannoView;35}

3.定位

//定位服务管理器CLLocationManager *_locationManager;//使用地理编码器CLGeocoder *_geocoder;

1. 在开发LBS类的应用时,获取用户定位信息之前,一定要判断一下定位服务是否允许

locationServicesEnabled

12if(![CLLocationManager locationServicesEnabled]) {3NSLog(@"定位服务不可用!");4return;5}6

2. 开启定位,获取自己的当前位置 [_locationManager startUpdatingLocation];

3. 根据经纬度,知道准确的地名 reverseGeocodeLocation

1- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations2{3NSLog(@"位置变化: %@", locations[0]);45//根据经纬度查找(去苹果后台查找准确的位置,必须联网才能用)6[_geocoder reverseGeocodeLocation:locations[0] completionHandler:^(NSArray *placemarks, NSError *error) {78NSLog(@"%@", placemarks[0]);910}];11}

4. 根据定名,获取到经纬度,一般用在导航 geocodeAddressString

1[_geocoder geocodeAddressString:@"王府井"completionHandler:^(NSArray *placemarks, NSError *error) {23for(CLPlacemark *placemarkinplacemarks) {4NSLog(@"aaaa______%@ %lu", placemark, (unsignedlong)placemarks.count);5}67}];

清澈Saup

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航