IOS 地图控件 : mapkit
第一步
显示地图
- (void)viewDidLoad { self.mapView=[[[MKMapView alloc] initWithFrame:self.view.bounds] autorelease]; mapView.delegate=self; mapView.autoresizingMask= (UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin); [self.view addSubview:mapView]; [self.mapView setZoomEnabled:YES]; [self.mapView setScrollEnabled:YES]; [super viewDidLoad]; // Do any additional setup after loading the view from its nib. }
也可以直接托控件。 直接运行,OK . 没问题。
第二步:
启动定位服务,标注自己当前位置
if (lm) { lm.delegate=nil; [lm release]; lm=nil; } lm=[[CLLocationManager alloc] init]; lm.delegate=self; lm.desiredAccuracy= kCLLocationAccuracyNearestTenMeters; lm.distanceFilter =1000.0f; [lm startUpdatingLocation];
如果定位成功 :
-(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { if (!newLocation) { [self locationManager:manager didFailWithError:(NSError *)NULL]; } if (signbit(newLocation.horizontalAccuracy)) { [self locationManager:manager didFailWithError:(NSError *)NULL]; return; } [manager stopUpdatingLocation]; CLLocationCoordinate2D _coordination = [newLocation coordinate]; now_lat = _coordination.latitude; now_lng =_coordination.longitude; mapView.showsUserLocation =YES; [lm stopUpdatingLocation]; /// [NSThread detachNewThreadSelector:@selector(getNear) toTarget:self withObject:nil]; }这样便可以定自己当前位置。
/***
线程是根据当前经纬度 从网络上获取附近 。
返回JSON 字符串, 然后解析json 。
得到每个对象经纬度
**/
第三步:
在地图上画圈
首先在 头文件定义 :
@property(nonatomic,retain)MKCircle *circle;
圈的颜色,属性
-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay { MKOverlayView *view=nil; if ([overlay isKindOfClass:[MKCircle class]]) { MKCircleView *cirView =[[MKCircleView alloc] initWithCircle:overlay]; cirView.fillColor=[UIColor redColor]; cirView.strokeColor=[UIColor redColor]; cirView.alpha=0.1; cirView.lineWidth=4.0; view=[cirView autorelease]; } return view; }第四步:
显示自己位置和为地图添加标注
@interface POI : NSObject<MKAnnotation> { CLLocationCoordinate2D coordinate; NSString *subtitle; NSString *title; NSString *cofeId ; NSString *doroname; } @property (nonatomic,readonly) CLLocationCoordinate2D coordinate; @property (nonatomic,copy) NSString *subtitle; @property (nonatomic,copy) NSString *title; @property (nonatomic,copy) NSString *xId ; @property (nonatomic,copy) NSString *name; ; -(id) initWithCoords:(CLLocationCoordinate2D) coords;
@implementation POI @synthesize coordinate,subtitle,title; @synthesize xId; @synthesize doroname; - (id) initWithCoords:(CLLocationCoordinate2D) coords{ self = [super init]; if (self) { coordinate = coords; } return self; } - (void) dealloc { [title release]; [subtitle release]; [xId release]; [doroname release]; [super dealloc]; } @end这个网上很多, 可以根据需求自己适当修改 。
doors=[jsonDic objectForKey:@"roomshops"]; for (NSDictionary *dic in doors) { CLLocationCoordinate2D p1; p1.latitude= [[dic objectForKey:@"roomLng"] doubleValue]; p1.longitude=[[dic objectForKey:@"roomLat"] doubleValue]; POI *poi = [[[POI alloc] initWithCoords:p1] autorelease]; poi.title=[dic objectForKey:@"roomName"]; poi.subtitle=[dic objectForKey:@"roomAddress"]; poi.xId= [dic objectForKey:@"roomid"]; poi.doroname=[dic objectForKey:@"room"]; [mapView addAnnotation:poi]; }
这里要说明以下, google地图先纬度,再经度。 而一般我们都是先经度,再纬度。
地图标注 :
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { /// 判断是否是自己 if ([annotation isKindOfClass:[POI class]]) { MKAnnotationView *view = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:[annotation title] ]; if (view==nil) { view= [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:[annotation title]] autorelease]; } else { view.annotation=annotation; } POI *pview= annotation; if ([pview.doroname isEqual:@"你大爷"]) { [view setImage:[UIImage imageNamed:@"poi.png"]]; view.canShowCallout=YES; UIButton *btn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; view.rightCalloutAccessoryView=btn; } else { [view setImage:[UIImage imageNamed:@"大小_选中.png"]]; view.canShowCallout=YES; UIButton *btn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; view.rightCalloutAccessoryView=btn; } return view; } else { POI *Mapannotation = annotation; Mapannotation.title=@"当前位置"; return nil; } }
截图说明,因为我圈是加在中间的, 所以会这样。