iphone 如何使用地图MapKit
1。 首先在framework中加入 MapKit.framework
2。 类中 #import <MapKit/MapKit.h>
3。 类中定义
CLLocationManager * locationManager;
CLLocationCoordinate2D curLocation;
MKMapView * UsermapView;
4。类实现 CLLocationManagerDelegate,MKMapViewDelegate 两个delegate
5。用上一篇中的方法,获得了 用户的所在的位置 curLocation。
(1) 在获取到当前的位置后,显示当前位置所在位置的1000米所在区域。
//响应当前位置的更新,在这里记录最新的当前位置 - (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { NSLog(@"newLocation:%@",[newLocation description]); //如果是第一次加载地图 if (UsermapView==nil) { UsermapView = [[MKMapView alloc] initWithFrame:self.view.bounds]; UsermapView.mapType = MKMapTypeStandard; UsermapView.zoomEnabled=YES; UsermapView.showsUserLocation=YES; UsermapView.delegate=self; [UsermapView autorelease]; [self.view addSubview:UsermapView]; } //设置显示区域 MKCoordinateRegion region=MKCoordinateRegionMakeWithDistance(newLocation.coordinate,1000 ,1000 ); [UsermapView setRegion:region animated:TRUE]; }
如果要显示经纬度表示的(0.05,0.05)范围:
将上面的 区域设置为下面的代码即可:
//设置显示区域 MKCoordinateSpan span=MKCoordinateSpanMake(0.05,0.05); MKCoordinateRegion region=MKCoordinateRegionMake(newLocation.coordinate,span);
(2) 如何在地图上增加地图注解
2。1 首先要从 MKAnnotationView 派生出一个自定义的 类,用来实现个性化的 注解。
@interface MapAnnotation : NSObject <MKAnnotation> { CLLocationCoordinate2D coordinate; NSString * title; NSString * subtitle; //自己定义的其他信息成员 } @property (nonatomic,readonly) CLLocationCoordinate2D coordinate; @property (nonatomic,retain) NSString * title; @property (nonatomic,retain) NSString * subtitle; @end
@implementation MapAnnotation @synthesize coordinate; @synthesize title; @synthesize subtitle; - (id) initWithCoordinate:(CLLocationCoordinate2D) temp_coordinate { if ([super init]) { coordinate=temp_coordinate; } return self; } - (void) dealloc { self.title=nil; self.subtitle=nil; [super dealloc]; } @end
2。2 怎么添加一个注解:
//标注用户 CLLocationCoordinate2D userLocation; CLLocationDegrees latitude=111.005; CLLocationDegrees longtitude=21.015; userLocation.latitude=latitude; userLocation.longitude=longtitude; MapAnnotation * annotation=[[[MapAnnotation alloc] initWithCoordinate:userLocation] autorelease]; annotation.title=@"小A"; annotation.subtitle=@"20岁"; [UsermapView addAnnotation:annotation];
根据 注解 ,产生注解视图
- (void) mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray*) views
当增加一个注解的时候,上面的函数就会被调用,以产生一个注解视图,下面的代码是产生一个小人图标,放到地图上。
//delegate MKMapViewDelegate - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { //判断是否是自己 if ([annotation isKindOfClass:[MapAnnotation class]]==YES) { MKAnnotationView * view; view=(MKAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:annotation.title]; if (view==nil) { view=[[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotation.title] autorelease]; } else { view.annotation=annotation; } //设置图标 MapAnnotation * Mapannotation=annotation; [view setImage:[UIImage imageNamed:@"avatar_boy.png"] ]; view.canShowCallout=TRUE; return view; } else { MapAnnotation * Mapannotation=annotation; Mapannotation.title=@"当前位置"; return nil; } }
当用户点击地图上面的注解视图的时候,也就是点击小人的时候,会调用下面的函数:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
//当用户点击小人图标的时候,就进入这里,即将显示 AnnotationView - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { if ([view.annotation isKindOfClass:[MapAnnotation class]]==NO) { return ; } //设置显示的视图的内容 MapAnnotation * annotation=(MapAnnotation *) view.annotation; //通过MapAnnotation就可以获得自己设置的一些个性化信息。 //然后,根据这些信息来设置,这里是获得头像的文件路径,然后 //设置到 VIEW UIImageView * headImageView= ( UIImageView *) view.leftCalloutAccessoryView ; [headImageView setImage:[UIImage imageWithContentsOfFile: nsFilePath] ]; }
设置VIEW的左右边分别是什么内容,下面是设置左边为一个Image,右边是一个箭头的button。
- (void) mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray*) views { int i=0; for (MKPinAnnotationView *mkview in views ) { //判断是否是自己 if ([mkview.annotation isKindOfClass:[MapAnnotation class]]==NO) { continue; } else { UIImageView * headImageView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"online.png"] ]; [headImageView setFrame:CGRectMake(1, 1, 30, 32)]; [headImageView autorelease]; mkview.leftCalloutAccessoryView=headImageView; UIButton * rightbutton=[UIButton buttonWithType:UIButtonTypeDetailDisclosure]; mkview.rightCalloutAccessoryView=rightbutton; } i++; } }
当用户点击VIEW后,将会调用下面的函数:
-(void) mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *) control
-(void) mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *) control { MapAnnotation * annotation= view.annotation; // 根据 MapAnnotation,取出个性化的个人信息,然后创建自己 // 的新的VIEW,并且显示。 }
(3) 如何检测到地图显示范围的改变
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
//当地图显示范围发生变化的时候 - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { MKCoordinateRegion curRegin=UsermapView.region; }
(4) 如何计算 当前显示范围的 显示半径
MKCoordinateRegion curRegin=UsermapView.region; MKMapPoint mapPointCenter=MKMapPointForCoordinate(curRegin.center); CLLocationCoordinate2D outerCoordinate=curRegin.center; outerCoordinate.latitude+= curRegin.span.latitudeDelta/2.0; outerCoordinate.longitude+=curRegin.span.longitudeDelta/2.0; MKMapPoint mapPointOuter=MKMapPointForCoordinate(outerCoordinate); CLLocationDistance double_distance= MKMetersBetweenMapPoints(mapPointCenter,mapPointOuter); unsigned int cur_distance=(unsigned int) double_distance; NSLog(@"cur_distance=%d",cur_distance);