-
MapKit
-
MKMapView类
- MKMapView是显示地图的视图,只需要将MKMapView对象添加到self.view中即可实现地图显示
-
常用属性
-
mapType:地图视图类型
- MKMapTypeStandard:交通地图
- MKMapTypeSateLLite:卫星地图
- MKMapTypeHybrid:交通和卫星地图
- MKMapTypeSateLLiteHyover:3D立体地图
- MKMapTypeHybridFlyover:3D混合地图
- showsUserLocation:设置是否显示用户定位
- delegate:MKMapViewDelegate委托
-
-
添加标注
-
创建MKPointAnnotation标注对象,并设置属性
MKPointAnnotation *pointAnnotation = [[MKPointAnnotation alloc] init];
// 设置点标注的经纬度
pointAnnotation.coordinate = coordinate;
// 设置辅助视图的中间视图的正标题。如果未设置标题,会导致辅助视图无法显示
pointAnnotation.title = @"查询地名中...";
// 设置辅助视图的中间视图的副标题
pointAnnotation.subtitle = [NSString stringWithFormat:@"%f, %f",coordinate.latitude,coordinate.longitude];
[self.mapView addAnnotation:pointAnnotation];
-
实现mapView: viewForAnnotation: 委托方法,将标注转化为MKAnnotationView标注视图。将标注试图添加到地图视图上时会调用此委托
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
// 判断annotation(标注)是否为用户当前位置的标注
if (![annotation isKindOfClass:[MKPointAnnotation class]]) {
return nil;
}
NSString *identifier = @"annotationViewIdentifier";
//添加 MKPinAnnotationView标注视图
MKPinAnnotationView *pinAnnotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (!pinAnnotationView) {
pinAnnotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
// 这里就可以自定标注视图了
pinAnnotationView.pinTintColor = [UIColor orangeColor]; // pinTintColor属性属于 自己MKPinAnnotationView
// 标注视图是否要显示注释内容
pinAnnotationView.canShowCallout = YES; // canShowCallout属性属于 父类MKAnnotationView
// 在标注时是否以动画的形式出现
pinAnnotationView.animatesDrop = YES; // animatesDrop属性属于 自己MKPinAnnotationView
}
return pinAnnotationView;
}
-
MKAnnotationView(标注试图类)
-
常用属性
- canShowCallout:是否显示辅助视图(注释内容)
- image:设置标注视图显示的图片
- leftCalloutAccessoryView:设置辅助视图的左侧视图
- rightCalloutAccessoryView:设置辅助视图的右侧视图
- centerOffeset:设置标注视图图片的偏移量。x取负值—向左移动,y取负值:向上移动
- calloutOffset:设置辅助视图的偏移量
-
-
MKPinAnnotationView(父类:MKAnnotationView)
-
常用属性
- pinTintColor:设置标注视图颜色
- animatesDrop:设置是否以动画的形式出现
-
-
-
定位
- CLLocationManager:定位管理类
-
常用属性
- distanceFilter:更新频率,用户位置差多少m后更新定位
-
desiredAccuracy:定位精度,允许误差范围
KCLLocationAccuracyBastForNavigation:最精准,适用于导航
KCLLocationAccuracyBast:最精准
KCLLocationAccuracyNearestTenMeters:十米误差
KCLLocationAccuracyHundredMeters:百米误差
KCLLocationAccuracyKilometer:千米误差
KCLLocationAccuracyThreeKilometers:三千米误差
-
实现定位的步骤
- 设置mapView.showsUserLocation = YES;显示用户定位的属性
- 在info.plist文件中添加属性NSLocationWhenInUseUsageDescription(只有应用程序处于前台时才能定位)或加属性NSLocationAlwaysUsageDescription(应用程序处于前台/后台都可定位)
-
请求用户App是否可以获取用户定位
// respondsToSelector:判断是否存在某方法
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
/* requestWhenInUseAuthorization方法:请求当前用户,是否可以定位用户的位置
在调用这个方法前需要在info.plist文件中添加属性NSLocationWhenInUseUsageDescription(只有应用程序处于前台时才能定位)
或者属性NSLocationAlwaysUsageDescription(应用程序处于前台/后台都可以定位)
*/
[self.locationManager requestWhenInUseAuthorization];
}
-
实现委托方法mapView: didUpdateUserLocation: 在方法中放置mapView的region(地图范围)属性。CLLocation对象:代表随着精度、时间戳信息的地理坐标
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
NSLog(@"用户位置已经更新");
// 设置中心点,中心点即使用户当前所在的位置 // CLLocation对象:代表随着精度和时间戳信息的地理坐标
CLLocationCoordinate2D center = userLocation.location.coordinate;// coordinate:当前位置的坐标
// 设置地图跨度
MKCoordinateSpan span = {0.01, 0.01};
MKCoordinateRegion region = {center, span};
// 设置地图的范围,包含中心点、地图跨度
[mapView setRegion:region animated:YES];
}
- 实现委托方法mapView: viewForAnnotation: 如果未实现,标注将无法显示
-
CLGeocoder
-
通过地址信息获取经纬度坐标
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:name completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
CLLocation *location = [placemarks lastObject].location;
NSLog(@"根据地名查询经纬度:%f, %f",location.coordinate.latitude,location.coordinate.longitude);
}];
-
通过经纬度坐标获取地址信息
// 创建地理编码对象
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
// 获取地址信息通过经纬度
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
NSString *addressName = [placemarks lastObject].name;
NSLog(@"%@",addressName);
// 查询出来地址信息后利用block对当前的那个辅助视图进行更新
if (self.geocoderCompletionHandler) {
self.geocoderCompletionHandler(addressName);
}
}];
- 注:在需要进行更新的地方(例:在添加标注的地方)将属性geocoderCompletionHandler实现
-
-
- 百度地图SDK