在IOS中使用位置信息时,就需要使用到苹果提供的SDK:mapkit,可以使用不同的API以达到地图信息自定义显示的目的:
(一) 如果要使用及操作地图,那么首先你需要通过(MKmapview)设定一个用于显示及操作地图内容的环境:
那么什么是MKmapview呢?
MKmapview为我们提供了一个操作地图的接口,就如同地图应用直接提供给我们的一样。我们可以用它去显示一些地图信息,或者是用它去操作来自应用的地图内容,也可以将地图定位显示在某一个固定的坐标上,设定你要显示的地图区域大小,当然也可以在地图中添加注释及一些自定义的信息。
MKMapView* mapView = [[MKMapView alloc]initWithFrame:self.view.bounds]; //初始化一个区域用于显示map信息 mapView.mapType = MKMapTypeHybrid; //设置地图显示方式:标准地图,卫星地图,混合地图 mapView.zoomEnabled = YES; //设置可缩放环境 mapView.scrollEnabled = YES; //设置可滚屏环境 mapView.showsUserLocation = YES; //设置是否显示用户位置 [self.view add mapView];
(二) 使用系统提供的Anotation显示用户的当前位置信息:
注意:此处需要添加corelocation框架;设置delegate方法,并在添加annotation时,若实现了下面的这个方法,那么系统将会调用他,若没实现他,则系统默认返回值为空;
[- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;]方法,当使用系统提供的annotation时,该方法的返回值为nil;
CLLocationCoordinate2D coordinate = {34.7568711,113.663221}; MKUserLocation *location = [[MKUserLocationalloc]init]; location.title = @"beijing"; location.subtitle = @"subTitle"; location.coordinate = coordinate; [mapView addAnnotation:location];
(三)使用setRegin方法,让地图显示某一坐标位置区域
CLLocationCoordinate2D coordinate = {34.7568711,113.663221}; //将显示位置具体坐标 MKCoordinateSpan span = {100,100}; //将显示地图区域跨度,即显示地图的精细程度 MKCoordinateRegion regin; regin = MKCoordinateRegionMake(coordinate, span); [mapView setRegion:regin];
(四)使用CLLocationmanager可跟踪当前地理位置实时变化信息
CLLocationManager *manager = [[CLLocationManageralloc]init]; manager.desiredAccuracy = kCLLocationAccuracyBest; manager.delegate = self; manager.distanceFilter = 100; [self.managerstartUpdatingLocation];
注意:在设置delegate时会调用下面的delegate方法:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { CLLocationDistance oldDistance = [newLocation distanceFromLocation:oldLocation]; NSLog(@"old:%f",oldDistance); }
或者
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations //当调用这个方法的时候,上面的方法会被忽略 { }
(五)设置自定义的annotation标签
(1) 将Annotation的图标修改为大图标形式可以使用系统提供的方法:
MKPointAnnotation *anotation = [[MKPointAnnotationalloc]init]; anotation.coordinate = coordinate; anotation.title = @"henan"; anotation.subtitle = @"qingyun"; [mapView addAnnotation:anotation];
(2)设置自定义样式的Annotation方式
在调用这个方法时,系统会自动调用以下方法,因此可以在系统提供的view上自定义各项设置
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { static NSString *identify = @"identify"if ([annotation isKindOfClass:[MKUserLocation class]]) { return nil; } MKAnnotationView *pinView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:identify]; if (pinView == nil) { pinView = [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:identify]; } pinView.tintColor = [UIColor greenColor]; pinView.canShowCallout = YES; //此处用于显示系统提供的Annotation方式,若想显示完全自定义的Annotation,可将此行注掉 pinView.image = [UIImage imageNamed:@"icon_nav_start"]; //此行用于显示当前位置的Annotation图像,在自定义模式下必须设置
UIImageView *leftView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"icon"]]; leftView.frame = CGRectMake(0, 0, 40, 40); pinView.leftCalloutAccessoryView = leftView;
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeDetailDisclosure]; button.frame = CGRectMake(0, 0, 30, 20); pinView.rightCalloutAccessoryView = button; return pinView; }
(3)若想要实现Annotation图形的完全自定义,则需要创建一个继承自MKAnnotation的类,并在类中实现如下方法:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:YES]; UIView *view = [[UILabel alloc] initWithFrame:CGRectMake(-40, -40, 100, 40)]; view.backgroundColor = [UIColororangeColor]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; imageView.image = [UIImage imageNamed:@"icon"]; [view addSubview:imageView]; [self addSubview:view]; }
(六) 实现对坐标位置的反编码:也就是拿到一个准确的坐标为之后,快速寻找到相应的地理位置
CLGeocoder *geocoder = [[CLGeocoder alloc] init]; CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude]; [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { if (nil != error) { NSLog(@"error info is %@",error); return ; } for (CLPlacemark *placeMark in placemarks) { NSLog(@"%@,%@,%@,%@",placeMark.country,placeMark.administrativeArea,placeMark.locality,placeMark.thoroughfare); } }];