地图开发了解

苹果原生态地图##

1.对于定位要求得到用户允许,改plist文件
-添加 Privacy - Location Usage Description ;类型设成String;值可写:是否允许一直使用定位服务
-添加 NSLocationAlwaysUsageDescription;类型设成Boolean;值为:YES(添加这个是与申请授权的2个选择的方法对应)

2.利用MapKit框架开发可以精确(苹果原生的用CLLocation定位的是真实经纬度坐标,即地球坐标;但在“国内苹果原生地图的数据是由高德地图提供”,所以需要将地球坐标转成火星坐标;可以用第三方库CLLocation+Sino来实现转换;否则使用会有偏差。苹果其地图有三种类型:标准地图--卫星地图--混合地图)
-导入头文件 #import // @import MapKit;新的加头文件写法(效果一样) #import "CLLocation+Sino.h"(导入第三方库:CLLocation+Sino)
-遵循地图协议: MKMapViewDelegate;用MKMapView创建地图视图
-遵循定位协议: CLLocationManagerDelegate;用CLLocationManager创建定位管理器对象定位(地球坐标)
-设置经纬度坐标: CLLocation
-地理编码:根据给定的位置(如地名)来确定地理坐标(经纬度);方法:-geoCodeAddressString:completionHandler:
-反编码:根据经纬度确定地名;方法:reverseGeoLocation:completionHandler:

3.创建地图
// 创建MKMapView对象

self.mapView = [[MKMapView alloc] initWithFrame:self.view.bounds]; 
self.mapView.delegate = self; 
[self.view addSubview:self.mapView]; 

// 设置地图中心点

//设置地图经纬度坐标(火星坐标)高德
CLLocationCoordinate2D c2d = CLLocationCoordinate2DMake(30.662221 , 104.041367);
//坐标跨度(显示范围、比例尺) 
MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
0.01表示在1公里范围左右,1则是100公里;第一个0.01是纬度方向的,第二个是经度方向的
//地图的显示区域
 MKCoordinateRegion region = MKCoordinateRegionMake(c2d, span); 
[self.mapView setRegion:region];
[self.view addSubview:myMapView];
 // 将地图视图放到视图层次结构的最底层
 [self.view sendSubviewToBack:myMapView];

// 定位管理器

//定位;创建定位管理器对象
CLLocationManager * myLocationManager = [[CLLocationManager alloc] init];
// 设置定位精度
 myLocationManager.desiredAccuracy=kCLLocationAccuracyBest;
    // 设置距离过滤器(多少距离开始更新定位,如下面10米之内就不改变定位)
    myLocationManager.distanceFilter = 10;
    // 绑定委托(当位置更新时执行相应的回调方法)
    myLocationManager.delegate = self;
    // 授权一直开启定位服务(申请授权;ios8需要加配置;省电考虑;7以前直接调用申请授权的方法)
    [myLocationManager requestAlwaysAuthorization];
     //还有一种方法requestWhenInUseAuthorization(需要才开启);这两中方法选择时,其在plist中配置的要与之对应
 myMapView.showsUserLocation=YES;//根据定位的位置标出来(蓝色的圈)
    // 开启定位服务(开始更新位置信息)
    [myLocationManager startUpdatingLocation];
//如果不需要实时定位,使用完即使关闭定位服务 [myLocationManager stopUpdatingLocation];

//通过添加一个长按手势来给地图放大头针;注意开启图片交互
//添加大头针

- (void) addPinModel:(UILongPressGestureRecognizer *) sender {
    //加if判断手势状态,不然会有bug:长按手势一直拖沿着产生一大波大头针
    if (sender.state == UIGestureRecognizerStateBegan) {
        // 获得长按位置在视图上的平面坐标(屏幕上的坐标)
        CGPoint point = [sender locationInView:myMapView];
        // 将平面坐标转换成经纬度坐标,第二个参数是相对于哪个视图,即地图
        CLLocationCoordinate2D c2d = [myMapView convertPoint:point toCoordinateFromView:myMapView];
        // NSLog(@"%f,%f",c2d.latitude,c2d.longitude);
        // 创建大头针的数据模型(点标注)
        MKPointAnnotation *model = [[MKPointAnnotation alloc] init];
        model.coordinate = c2d;
        model.title = @"这是一个主标题";
        model.subtitle = @"这是一个副标题";
        // 将模型添加到地图视图上
        [myMapView addAnnotation:model];
    }
}
//大头针
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation {
    MKPinAnnotationView *pinView = (id)[mapView dequeueReusableAnnotationViewWithIdentifier:@"PIN"];//前面子类型;后面父类型;所以强转加id
    if (!pinView) {
        pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"PIN"];
    }
    // 定制大头针视图
    // 设置从天而降的动画
    pinView.animatesDrop = YES;
    // 设置显示大头针上的气泡
    pinView.canShowCallout = YES;
    // 定制气泡
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 36, 36)];
    imageView.image = [UIImage imageNamed:@"7.jpg"];
    pinView.leftCalloutAccessoryView = imageView;
    return pinView;
}

// 位置信息更新后要执行的回调方法

- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations {
     //位置信息(NSArray *)locations是一个数组;因为不一定只靠GPS定位,还可通过基站,WiFi热点等这些辅助来定位
    // 提示: 这里获得的定位信息是地球坐标
    // 如果不转换成火星坐标那么在苹果原生地图上定位就会有问题
    CLLocation *loc = [locations firstObject];
    // 使用第三方库将地球坐标转换成火星坐标
    loc = [loc locationMarsFromEarth];
    NSLog(@"%@", loc);
    MKPointAnnotation *model = [[MKPointAnnotation alloc] init];
    model.coordinate = loc.coordinate;
    model.title = @"地球坐标测试";
    [myMapView addAnnotation:model];
    // MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
    // [myMapView setRegion:MKCoordinateRegionMake(loc.coordinate, span) animated:YES];
}

//地理编码

// 地理信息编码/反编码对象(创建编码对象)
    CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
    
    // 地理信息正向编码(地名转换成经纬度)
    [geoCoder geocodeAddressString:@"宽窄巷子" completionHandler:^(NSArray *placemarks, NSError *error) {
        // 对编码结果进行迭代
        for (CLPlacemark *pMark in placemarks) {
            NSLog(@"%@", pMark.location);
            // 将地址字典转换成二进制数据
            NSData *data = [NSJSONSerialization dataWithJSONObject:pMark.addressDictionary options:NSJSONWritingPrettyPrinted error:nil];
            // 将二进制数据转成字符串
            NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@", str);
        }
    }];

//反编码

 CLLocation *loc = [[CLLocation alloc] initWithLatitude:30.662056 longitude:104.041462];
    // 反编码地理信息(将经纬度转换成地名)
    [geoCoder reverseGeocodeLocation:loc completionHandler:^(NSArray *placemarks, NSError *error) {

        CLPlacemark *pMark = [placemarks firstObject];
        MKPlacemark *mkMark = [[MKPlacemark alloc] initWithPlacemark:pMark];
        // 开启地图应用的加载项
        NSDictionary *options = @{ MKLaunchOptionsMapTypeKey: @(MKMapTypeStandard),
            MKLaunchOptionsShowsTrafficKey: @(YES)
        };
        // 创建一个地图应用项
        MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:mkMark];
        // 开启一个地图应用
        [mapItem openInMapsWithLaunchOptions:options];
      ///添加地图应用项时打开它就会自动跳转到苹果地图,则可以应用苹果地图进行各种,比如路线,导航等等(由此特点考虑做旅游应用可以否?)
    }];

总结三种地图

-1苹果原生地图使用地球坐标,除了中国全球通用(国外不用转换);在中国其使用高德的数据所以要将其转换为火星坐标才能使用不出偏差
-2高德地图使用的火星坐标,已经封装好了,取得就是火星坐标,不用转直接用
-3百度地图使用的是百度坐标,是将火星坐标进行处理;同理也已经封装好了,不用转直接用

你可能感兴趣的:(地图开发了解)