博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS之地图开发
阅读量:5256 次
发布时间:2019-06-14

本文共 6696 字,大约阅读时间需要 22 分钟。

一、系统自带地图开发

iOS地图定位的方式有三种,分别是蜂窝基站定位、wifi定位、GPS定位

 

1、CoreLocation

1.1  定义manager管理者 注意这个管理者必须设置成全局变量,不然代理方法不会回调,已经被释放

@property (nonatomic, strong) CLLocationManager *locationManager;

//初始化       self.locationManager = [[CLLocationManager alloc] init];

1.2  设置代理为self,然后遵循代理协议

 //设置代理

    _locationManager.delegate = self;

1.3   设置属性 :distanceFilter   多久定位一次     desiredAccuracy  设置精确度,越精确越费电

//设置属性

    self.locationManager.distanceFilter = 100;

    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;

1.4    开启定位  

//开始定位

    [self.locationManager startUpdatingLocation];

 //停止定位,当不使用定位的时候关闭定位

 [self.locationManager stopUpdatingLocation];

 

1.5  定位成功之后回调方法

 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

{

    NSLog(@"%@", locations);

    //取出位置对象

    CLLocation *location = locations.firstObject; 

    //取出经纬度

    CLLocationCoordinate2D coordinate = location.coordinate; 

    //打印经纬度

     NSLog(@"%f  %f", coordinate.longitude, coordinate.latitude);

}

 

注意:iOS7之前系统自己会自动请求授权,iOS8及以后需要我们主动请求授权,并且需要再info.plist文件中添加两个字段

NSLocationAlwaysUsageDescription     申请前台和后台定位(时时定位)

NSLocationWhenInUseUsageDescription  申请后台定位 (需要的时候定位)

if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {

        //主动请求授权

        [self.locationManager requestAlwaysAuthorization];

    }

 

1.6 地理编码和反地理编码

 

@property (nonatomic, strong) CLGeocoder *geocoder;

 self.geocoder =[ [CLGeocoder alloc] init];

//根据地名返回地理坐标

[self.geocoder geocodeAddressString:@"北京" completionHandler:^(NSArray *placemarks, NSError *error) {

    

        NSLog(@"placeMark -  %@", placemarks.firstObject

              );

        

        CLPlacemark *place = placemarks.lastObject;

        

        //取出经纬度

        CGFloat latitude = place.location.coordinate.latitude;

        CGFloat lng = place.location.coordinate.longitude;

        

        //遍历得到的地址

        for (CLPlacemark *pl in placemarks) {

             NSLog(@"经度%f  纬度%f ", pl.location.coordinate.latitude, pl.location.coordinate.longitude);

        }

        

        //遍历打印地址中存放的

        //CountryCode  CN

        // Name  Beijing

        //State  Beijing

        [place.addressDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

             NSLog(@"%@  %@", key, obj);

        }];

        

        

        

    }];

 

//根据地理坐标返回地名 

 CLLocation *cl1 = [[CLLocation alloc] initWithLatitude:114.0 longitude:45.0];

    CLLocation *cl2 = [[CLLocation alloc] initWithLatitude:-235 longitude:22];

    

    [self.geocoder reverseGeocodeLocation:cl1 completionHandler:^(NSArray *placemarks, NSError *error) {

        if (error) {

             NSLog(@"error   %@", error);

            return ;

        }

        

        CLPlacemark *place = placemarks.firstObject;

         NSLog(@"place  --- %@", place.name);

    }];

 

 2、MapKit

2.1

@property (nonatomic, strong) MKMapView *mapView;

 

self.mapView = [[MKMapView alloc] initWithFrame:[UIScreen mainScreen].bounds];

    //设置属性

    _mapView.delegate = self;

    _mapView.mapType = MKMapTypeStandard; 

    //跟踪用户的位置

    _mapView.userTrackingMode = MKUserTrackingModeFollow;

    [self.view addSubview:_mapView];

 

2.2 代理方法

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

{

     NSLog(@"%f  %f", userLocation.location.coordinate.longitude, userLocation.location.coordinate.latitude);

    

//    userLocation.title = @"北京";

//    userLocation.subtitle = @"北京是个好地方";

    

    CLLocationCoordinate2D coordinate = userLocation.location.coordinate;

    

    //设置地图的中心到用户的位置

    self.mapView.centerCoordinate = coordinate; 

    //设置地图的缩放范围

    MKCoordinateSpan span = MKCoordinateSpanMake(0.5, 0.5);

    MKCoordinateRegion region = MKCoordinateRegionMake(coordinate, span);

    [mapView setRegion:region animated:YES];

    

}    

2.3 添加大头针

2.4 导航画线

//导航

    NSString *start = @"北京";

    NSString *end = @"杭州";

    [self.geocoder geocodeAddressString:start completionHandler:^(NSArray *placemarks, NSError *error) {

        if (error) {

            return ;

        }

        

        CLPlacemark *startPlace = placemarks.firstObject;

        

        

        [self.geocoder geocodeAddressString:end completionHandler:^(NSArray *placemarks, NSError *error) {

            if (error) {

                return ;

            }

            

            CLPlacemark *endPlace = placemarks.firstObject;

            

            //导航画线

//            [self addLineFrom:startPlace to:endPlace];

            

            //系统自带的导航

//            [self statrNavigationWithClplacemark:startPlace endCLPlacemark:endPlace];

            

        }];

 

/**

 *  添加导航的线路

 *

 *  @param fromPm 起始位置

 *  @param toPm   结束位置

 */

- (void)addLineFrom:(CLPlacemark *)startPlace to:(CLPlacemark *)endPlace

{

    //添加两个大头针

    MyAnnotation *start = [[MyAnnotation alloc] init];

    start.title = startPlace.name;

    start.coordinate = startPlace.location.coordinate;

    [self.mapView addAnnotation:start];

    

    MyAnnotation *end = [[MyAnnotation alloc] init];

    end.title = endPlace.name;

    end.coordinate = endPlace.location.coordinate;

    [self.mapView addAnnotation:end];

    

    //查找路线

    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];

    

    //设置起点

    MKPlacemark *sourcePlace = [[MKPlacemark alloc] initWithPlacemark:startPlace];

    request.source = [[MKMapItem alloc] initWithPlacemark:sourcePlace];

    

    //设置终点

    MKPlacemark *destination = [[MKPlacemark alloc] initWithPlacemark:endPlace];

    request.destination = [[MKMapItem alloc] initWithPlacemark:destination];

    

    

    //方向对象

    MKDirections *directions = [[MKDirections alloc] initWithRequest:request];

    

    //计算路线

    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {

        NSLog(@"总共%ld条路线", response.routes.count);

        

        for (MKRoute *route in response.routes) {

            [self.mapView addOverlay:route.polyline];

        }

    }];

}

 

#pragma mark - 画线

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay

{

    MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];

    renderer.strokeColor = [UIColor redColor];

    return renderer;

    

}

 

#pragma mark - 系统自带的导航

- (void)statrNavigationWithClplacemark:(CLPlacemark *)startClplacemark endCLPlacemark:(CLPlacemark *)endPlacemark

{

    //创建起点和终点

    MKPlacemark *start = [[MKPlacemark alloc] initWithPlacemark:startClplacemark];

    MKMapItem *startItem = [[MKMapItem alloc] initWithPlacemark:start];

    

    MKPlacemark *end = [[MKPlacemark alloc] initWithPlacemark:endPlacemark];

    MKMapItem *endItem = [[MKMapItem alloc] initWithPlacemark:end];

    

    //设置起点和终点的数组数

    NSArray *itemArray = @[startItem, endItem];

    

    //设置导航参数

    // 地图显示模式

    //    md[MKLaunchOptionsMapTypeKey] = @(MKMapTypeHybrid);

    

    

    // 只要调用MKMapItem的open方法, 就可以打开系统自带的地图APP进行导航

    // Items: 告诉系统地图APP要从哪到哪

    // launchOptions: 启动系统自带地图APP的附加参数(导航的模式/是否需要先交通状况/地图的模式/..)

    NSMutableDictionary *dic = [NSMutableDictionary dictionary];

    dic[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving;

    [MKMapItem openMapsWithItems:itemArray launchOptions:dic];

    

    

//    CLPlacemark *place = [[CLPlacemark alloc] init];

//    place.location

//    MKPlacemark *pl = [MKPlacemark alloc] initWithPlacemark:<#(CLPlacemark *)#>

//    

//    

//    

//    MKMapItem *s = [MKMapItem alloc] initWithPlacemark:<#(MKPlacemark *)#>

//    

//    

//    NSMutableDictionary *dic = [NSMutableDictionary dictionary ];

//    dic[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving;

//    

//    

//    [MKMapItem openMapsWithItems:@[s]  launchOptions:dic];

    

}

 

  

    

 

转载于:https://www.cnblogs.com/luckBaby/p/4777583.html

你可能感兴趣的文章
你会用C#压缩access数据库吗?xuedaonet教你如何用C#压缩access数据库?
查看>>
C++ 一些常用函数的使用(1)
查看>>
求第K大的问题
查看>>
[Leetcode] Binary Tree Zigzag Level Order Traversal
查看>>
[C++] c++中二进制文件的创建与使用
查看>>
C#脚本引擎 CS-Script 之(一)——初识
查看>>
codeforces742B
查看>>
codeforces645B
查看>>
The second curriculum design experiment report in spring 2019
查看>>
Java内存模型
查看>>
jms的初步认识
查看>>
项目管理之路(1):初步踏入项目管理
查看>>
机顶盒webview开发调试
查看>>
js中的arguments
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
crypto加密
查看>>
Apache Jackrabbit 2.6.0 发布
查看>>
Reporting Service 2000的一些技巧总结
查看>>
echarts饼图显示百分比
查看>>
C#中的out string temp是什么意思?【转】
查看>>