首先来说说ios地图开发使用的主要类:
MKMapView:地图控件,无其他Label等控件无异,拖进来就可以用了,用于地图的内容的显示,用户可以对地图进行放大、缩小、拖动、旋转等操作;
CLLocationCoordinate2D :坐标,包括经度和纬度;
MKCoordinateSpan :地图跨度,表示地图放大倍数,数值越小地图显示的单位越精细;
CLLocationManager :用户所在位置的管理类,通过该类的能够获取用户所在的GPS坐标。
下面与大家分享一些个人项目中地图部分所涉及到的知识,都是入门级别的,大神请绕过:
1、地图显示
地图显示抓住两个要素,一是中心坐标点,二是地图跨度。假设坐标中心点为(0,0),跨度为(8, 6),则地图的显示范围为[-4, -3]到[4, 3]。代码如下:
//设置中心坐标点 CLLocationCoordinate2D curLocation; curLocation.latitude = 23.9098099; curLocation.longitude = 112.980980; //设置地图跨度 MKCoordinateSpan span; span.latitudeDelta = 0.008; span.longitudeDelta = 0.008; //显示地图 MKCoordinateRegion region = {curLocation, span}; [self.mapView setRegion:region animated:NO];
如代码所示,设置好中心坐标点和地图跨度后,调用setRegion完成地图的显示,其中animated参数表示是否在显示地图时使用动画。
2、定位
如何获取我们目前所在的位置并并将其显示在地图上呢?
前面介绍的CLLocationManager的派上用场了,分三步进行。
第一步:开启app的定位功能:
if (self.locationManager == nil){ self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; self.locationManager.distanceFilter = 1000.0; NSLog(@"寮€濮嬪畾浣?); [self.locationManager startUpdatingLocation]; }
第二步:获取用户的所在位置,这里通过实现CLLocationManager的代理类CLLocationManagerDelegate中的didUpdateLocations代理方法来获取用户的所在位置:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { NSLog(@"didUpdateLocations"); CLLocation *newLocation = [locations lastObject]; CLLocationCoordinate2D curLocation = newLocation.coordinate; }
注意了,locations是一个数组,数组最后一个元素表示用户最新的位置,千万别取第一个,developer中心有说明,具体自己去看看吧。
第三步:根据第二步得到的坐标显示地图,这里要注意了,第二步得到的是用户的GPS坐标,但是MKMapView控件国内使用的是高德的数据源,也就是说地图是按照高德坐标系显示的,所以在显示之前我们首先需要将GPS坐标转换为高德坐标。这里插一些地图坐标系的其他知识,国内高德地图和腾讯地图使用的是GCJ-02坐标系,俗称火星坐标系,百度使用的是bd-09,为了保密,GPS坐标与这两种坐标都不能进行线性转换,因此,我们在做APP时,需要通过地图LBS平台的webservice访问进行坐标转换。百度和腾讯的webservice
API大同小异,具体可以参考http://lbs.qq.com/webservice_v1/index.html。坐标转换时,只需要使用坐标转换的webservie api即可,用户将GPS经纬度作为http请求参数,发起请求,服务器返回转换后的坐标,然后按照第一部分的“地图显示”照葫芦画瓢显示地图。
3、地图注释(大头针)
对感兴趣的地点做标注。可以实现MKMapViewDelegate类中的方法来修改大头针的显示样式:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { NSLog(@"viewForAnnotation"); AnnotationView *annotationView = (AnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CalloutView"]; if (!annotationView) { annotationView = [[AnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CalloutView"]; } annotationView.image = [UIImage imageNamed:@"green_pin"]; //更换大头针的图片 return nil; }
4、overlay
有点类似于图层的含义。如地图上的所有公路算是一个overlay,河流也算一个overlay。这样理解的话,我们在地图上绘制线条的时候,相当于在地图上新增一个overlay。
这里给出在地图上划线的代码:
int coordsCount = [_effectiveFootprints count]; if (coordsCount > 1) { NSMutableArray *overlays = [[NSMutableArray alloc] init]; CLLocationCoordinate2D coordinateArray[coordsCount]; for (int i = 0; i < coordsCount; i++) { FootprintItem *item = [_effectiveFootprints objectAtIndex:i]; coordinateArray[i].latitude = item.geoPosInfo.latitude; coordinateArray[i].longitude = item.geoPosInfo.longitude; } MKPolyline *lineOne = [MKPolyline polylineWithCoordinates:coordinateArray count:coordsCount]; [overlays addObject:lineOne]; [self.mapView addOverlays:overlays]; //添加overlay }
然后实现代理方法:
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay { NSLog(@"viewForOverlay"); if ([overlay isKindOfClass:[MKPolyline class]]) { MKPolylineView *polylineView = [[MKPolylineView alloc] initWithPolyline:overlay]; polylineView.strokeColor = [UIColor colorWithHexString:@"#996842"]; //线条颜色 polylineView.lineDashPhase = 2; //线条样式 NSArray* array = [NSArray arrayWithObjects:[NSNumber numberWithInt:5], [NSNumber numberWithInt:5], nil]; polylineView.lineDashPattern = array; polylineView.lineWidth = 3.0; //线条粗细 return polylineView; } return nil; }