iOS 地图开发小结

首先来说说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;
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。