iOS 开发之定位与苹果地图

1.LBS开发

  需求: 社交类应用 ,  购物类 ,  旅游类。。。

  功能: 定位、地图

  官方提供:定位与地图(国内使用的高德的数据)

  第三方:高德,百度,搜搜,腾讯,谷歌地图。。。

2.地理定位

  2.1 库的配置

  /*****地图定位*****/
    //LBS  -->  Location Based Service
    //1.配置库 --> CoreLocation.framework  (系统的)
    // -->      #import <CoreLocation/CoreLocation.h>

  2.2 定位功能

  定义一个CLLocationManager对象,设置代理,

  检测定位服务是否可用-->设置属性,开始定位

 //2.定位(获取经纬度信息)
    _manager = [[CLLocationManager alloc] init];
    _manager.delegate = self;    //delegate
    [self testLocation];
#pragma mark - 2.实现定位
-(void)testLocation{

    //检测定位服务是否可用(重要) -->  iphone 有,ipad 不一定有
    if(![CLLocationManager locationServicesEnabled]){

        NSLog(@"定位服务不可用");
        return;
    }
    //设置
    _manager.distanceFilter = 10;    //设置距离过滤器,距离变化时通知的敏感程度
    _manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;  //设置希望定位的精度
    //开始定位
    [_manager startUpdatingLocation];   //设置代理

}
#pragma mark CLLocationManagerDelegate
//CLLocationManagerDelegate
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{

    //获取位置
    CLLocation *location = manager.location;
    //获取经纬度  CLLocationCoordinate2D(结构体)
    CLLocationCoordinate2D coordinate = location.coordinate;   //
    NSLog(@"long = %f, lat = %f",coordinate.longitude,coordinate.latitude);  //经纬度

}

  2.3获取方向

    检测方向服务是否可用-->开启方向服务-->设置代理

#pragma mark - 3.获取方向
-(void)testHeading{

    if(![CLLocationManager headingAvailable]){

        NSLog(@"方向服务不可用");   //只能真机测试
        return;
    }
    //开启方向服务
    [_manager startUpdatingHeading];
}
//delegate
-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{

//    *  Range:
//    *    0.0 - 359.9 degrees, 0 being true North
    NSLog(@"地理方向 : %f",newHeading.trueHeading);
    NSLog(@"地磁方向 : %f",newHeading.magneticHeading);
    // 360/16 = 22.5
    NSLog(@"%d",(int)(newHeading.trueHeading/22.5));   //...
}

  2.4  地址编码,地址反编码

#pragma mark - 4.地址编码与地址反编码
-(void)testGeoCoder{

    //通过地理位置获取经纬度  ---  地址编码(地理位置--> 经纬度)
    //注意: 国家标准规定,涉及到地图的经纬度都要经过加密  ,
    //      苹果定位 定位到的地址不能直接用在苹果中 --> 火星地址
    //      谷歌地球,苹果定位取到的是国际标准地址
    CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
    [geoCoder geocodeAddressString:@"dizhi" completionHandler:^(NSArray *placemarks, NSError *error) {

        //取出地址placemask
        for(CLPlacemark *placemask in placemarks){

            NSLog(@"mask = %@",placemask);
            NSLog(@"%@ %@ %@ %f %f",placemask.country,placemask.locality,placemask.subLocality,placemask.location.coordinate.longitude,placemask.location.coordinate.latitude);   //country,city,区,经度,纬度
        }
    }];

    //地址反编码,通过经纬度获取地理位置
    CLLocation *location = [[CLLocation alloc] initWithLatitude:23.177194 longitude:113.339485];

    CLGeocoder *reverseGeocoder = [[CLGeocoder alloc] init];
    [reverseGeocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {

        NSLog(@"\n地址反编码\n");
        for(CLPlacemark *placemask in placemarks){

            NSLog(@"mask = %@",placemask);
            NSLog(@"%@ %@ %@ %f %f",placemask.country,placemask.locality,placemask.subLocality,placemask.location.coordinate.longitude,placemask.location.coordinate.latitude);   //country,city,区,经度,纬度
        }

    }];
}

3.苹果地图

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    /*****************AppleMap使用********************************/
    //1.配置 -- MapKit.framework

    //2.创建、显示  --MKMapView *_mapView;  <MKMapViewDelegate>
    _mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
    _mapView.delegate = self;
    [self.view addSubview:_mapView];

    //3.地图的基本设置
    [self mapConfig];

    //4.地图标记功能(添加大头针)  -- 长按添加
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(dealLongPress:)];
    [_mapView addGestureRecognizer:longPress];
    //4.1 大头针的定制
    //代理
    //-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation;
    //4.2大头针的高级定制 -- @class  ImageAnnotationView : MKAnnotationView

    //5.地图覆盖物Overlay
    //
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:CLLocationCoordinate2DMake(23.1777194, 113.339485) radius:200];
    [_mapView addOverlay:circle];
}
#pragma mark - 3.设置地图
-(void)mapConfig{

    //设置地图的类型
    _mapView.mapType = MKMapTypeHybrid;
    _mapView.region = MKCoordinateRegionMake(CLLocationCoordinate2DMake(23.177194, 113.339485), MKCoordinateSpanMake(0.01, 0.01));   //设置显示区域region
//    _mapView.centerCoordinate   //设置中心位置
    _mapView.showsUserLocation = YES;   //显示用户的位置  --> 设置定位当前地址

//    _mapView.userLocation      //获取当前用户的位置
//    _mapView.userTrackingMode        //设置跟随模式
}
#pragma mark - 4.长按点击
-(void)dealLongPress:(UILongPressGestureRecognizer *)longPress{

    if(longPress.state == UIGestureRecognizerStateBegan){

        //添加大头针--先获取点击位置
        CGPoint point = [longPress locationInView:_mapView];
        //经纬度
        CLLocationCoordinate2D coordinate = [_mapView convertPoint:point toCoordinateFromView:_mapView];
        //添加大头针   annotation注释
        MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
        annotation.coordinate = coordinate;
        annotation.title = @"我是title";
        annotation.subtitle = [NSString stringWithFormat:@"位置时: %f %f",coordinate.longitude,coordinate.latitude];
        [_mapView addAnnotation:annotation];

    }
}
#pragma mark - 自定义大头针--协议
//delegate
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{

    //加入复用机制
    static NSString *annotationId = @"annotation";
    //系统的大头针MKPinAnnotationView
    ImageAnnotationView *pin = (ImageAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annotationId];
    if(!pin){
        pin = [[ImageAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationId];
    }//
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
    imageView.image = [UIImage imageNamed:@"u=2222741951,1334421495&fm=58.jpeg"];
    pin.leftCalloutAccessoryView = imageView;    //left View

    UIButton *button = [UIButton buttonWithType:UIButtonTypeInfoLight];
    button.frame = CGRectMake(0, 0, 44, 44);
    [button addTarget:self action:@selector(dealTouch:) forControlEvents:UIControlEventTouchUpInside];
    pin.rightCalloutAccessoryView = button;   //right View

    return pin;
}
#pragma mark - 5.地图覆盖物Overlay
//- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay NS_AVAILABLE(10_9, 7_0);     //iOS8
//以下协议iOS8.0以上不能用
-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay{

    MKCircleView *view = [[MKCircleView alloc] initWithOverlay:overlay];
    view.fillColor = [[UIColor blueColor] colorWithAlphaComponent:0.2];  //填充色
    view.strokeColor = [[UIColor cyanColor] colorWithAlphaComponent:0.3];  //圆的颜色
    view.lineWidth = 1;

    return view;
}
时间: 2024-12-29 10:36:44

iOS 开发之定位与苹果地图的相关文章

ios开发之定位和苹果地图

ios开发之定位和苹果地图 1. LBS开发简介 需求:社交类(微信 QQ)     附件的人 购物应用  显示商家位置 (美团 大众点评) 旅游类应用(去哪儿 携程)  显示当前位置周边酒店 餐馆 功能 :定位 (获取当前位置的地图) 地图(显示某个区域的地图) 实现: 苹果:定位功能和地图功能(国内使用高德的数据) 高德地图 百度地图 搜搜地图 腾讯地图 谷歌地图... 2.地理定位 1.库的配置 2.定位功能 3方向 3.地址编码和反编码 1 地址编码 获取经纬度 确定地理位置 2 地址反

iOS开发那些事-iOS6苹果地图有用开发

在iOS 6之后,不再使用谷歌地图了,而是使用苹果自己的地图,可是API编程接口没有太大的变化.开发者不须要再学习非常多新东西就能开发地图应用,这是负责任的做法.因此本节介绍的内容也相同适用于iOS5上执行地图应用开发. iOS应用程序中使用Map Kit API开发地图应用程序. 其核心是MKMapView类使用.我们能够设置地图显示方式.控制地图,能够在地图上加入标注. 显示地图 在Map Kit API中显示地图的视图是MKMapView,它的托付协议是MKMapViewDelegate.

iOS开发那些事-iOS6苹果地图实用开发

在iOS 6之后,不再使用谷歌地图了,而是使用苹果自己的地图,但是API编程接口没有太大的变化.开发人员不需要再学习很多新东西就能开发地图应用,这是负责任的做法.因此本节介绍的内容也同样适用于iOS5上运行地图应用开发. iOS应用程序中使用Map Kit API开发地图应用程序. 其核心是MKMapView类使用.我们可以设置地图显示方式.控制地图,可以在地图上添加标注. 显示地图 在Map Kit API中显示地图的视图是MKMapView,它的委托协议是MKMapViewDelegate.

ios开发UI基础—安装苹果官方文档和Xcode模拟器

ios开发UI基础-安装苹果官方文档和Xcode模拟器 提示:准备资料 (1)com.apple.adc.documentation.AppleiOS7.1.iOSLibrary.docset.zip (2)iPhoneSimulator6.1.sdk.zip 一.安装苹果官方文档 1.安装路径 文档有两个安装路径: (1)~/资源库/Developer/Xcode/UserData/ (2)/Applications/Xcode.app/Contents/Developer/Documenta

ios开发中如何调用苹果自带地图导航

前段时间一直在赶项目,在外包公司工作就是命苦,天天加班不说,工作都是和工期合同挂钩的,稍微逾期就有可能被扣奖金,不谈这些伤脑筋的事情了,让我们说说iOS开发中如何调用苹果手机自带的地图. 学习如逆水行舟,不进则退.古人告诉我们要不断的反思和总结,日思则日精,月思则月精,年思则年精.只有不断的尝试和总结,才能让我们的工作和生活更加轻松愉快和美好.连着做了两个大的商城外包项目,智慧城市,搜牧通,花费了近四个月的时间,终于在反复修改后完美收工.期间的困难自不必说,以后多多总结和沟通吧.百度地图的使用之

iOS开发中如何使用百度地图SDK

成功将百度地图sdk为我所用! 现将具体步骤分享如下:xcode5.0.2/BaiduMap_IOSSDK_v2.4.0_All(下载最新版本,与之前有所不同) 首先注册百度帐号,进入百度LBS开放平台,选择IOS开发,进入页面,按照步骤执行: 1.申请key,创建应用,一个应用对应一个Key. 应用名称就填写你要绑定的应用名字,注意:一旦填好不可更改!应用类型选择for mobile:安全码:打开项目,选择 —>就是Bundle Identifier里面的内容:创建成功后会给你一个24位的ke

iOS开发 GPS定位 指定语言 返回中文地点

在iOS开发中,用到定位时经常会遇到这个头疼的问题:系统语言为英文时返回英文或拼音,系统语言是中文时才返回中文. 下面是强制系统获取的定位地点为中文.方案是网上的,但优化了一下,当逆地理编码结束后才恢复系统语言,避免一些极端情况下的不生效问题. 实测可行.有问题欢迎留言. ` -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:

Map1: iOS开发中定位和地图介绍

Core Location 以及 Map 框架包通常能给我们的应用程序添加定位和地图相关的服务. Core Location 框架包通常是使用硬件设备来进行定位服务的,Map 框架包通常能够使你的应用程序做一些地图展示与交互的相关功能. 一.准备 为了能够在项目中使用到位置服务以及地图展示的相关功能,你必须要导入 Core Location 和 Map 这两个框架包: 1.点击你的项目工程图标文件 2.然后选择 target 选项 3.然后选择 Build Phase 模块栏 4.然后点开 Li

iOS开发--添加定位功能

.h 首先在头文件中#import <CoreLocation/CoreLocation.h> 添加CLLocationManagerDelegate协议 @property (strong, nonatomic) IBOutlet CLLocationManager *myLocationManager; .m 在- (void)viewDidLoad添加以下代码: self.myLocationManager=[[CLLocationManager alloc]init]; [self.m