iOS地图开发-基本使用

地图的基本使用

1.设置地图显示类型

  /**
    MKMapTypeStandard = 0,  // 标准
    MKMapTypeSatellite,     // 卫星
    MKMapTypeHybrid,        // 混合(标准+卫星)
    MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体卫星
    MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体混合
   */
   self.customMapView.mapType = MKMapTypeStandard;

2.设置地图的其他属性(操作项)

注意:设置对应属性时,注意该属性是从哪个系统版本开始引入的,做好不同系统版本的适配

// 是否可以缩放
self.customMapView.zoomEnabled = NO;
// 是否可以滚动
self.customMapView.scrollEnabled = NO;
// 是否可以旋转
self.customMapView.rotateEnabled = NO;
// 是否显示3D
self.customMapView.pitchEnabled = NO;

3.设置地图其他属性

// 是否显示指南针
self.customMapView.showsCompass = YES;
// 是否显示比例尺
self.customMapView.showsScale = YES;
// 是否显示交通
self.customMapView.showsTraffic = YES;
// 是否显示建筑物
self.customMapView.showsBuildings = YES;

4.设置地图的用户追踪模式

1.创建CLLocationManager对象请求授权

-(CLLocationManager *)locationM
  {
      if (!_locationM) {
          _locationM = [[CLLocationManager alloc] init];
          if ([_locationM respondsToSelector:@selector(requestAlwaysAuthorization)]) {
              [_locationM requestAlwaysAuthorization];
          }
      }
      return _locationM;
  }

2.设置地图的用户追踪模式

  /**
    MKUserTrackingModeNone = 0, // 不跟随
    MKUserTrackingModeFollow, // 跟随用户位置
    MKUserTrackingModeFollowWithHeading, // 跟随用户位置,并跟随用户方向
  */
  [self locationM];
  self.customMapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;

地图中级使用

1.查看当前用户位置信息

  1. 设置地图代理,并实现代理方法,在代理方法中获取用户当前位置(注意iOS8.0之后要请求授权)
  2. 将地图显示中心调整为用户当前所在位置(iOS之前,地图不会自动移动到用户所在位置)
  3. 调整当前地图显示的区域(可使用对应代理方法查看当前地图跨度然后调整到合适的跨度即可)
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
  {
      /**
       MKUserLocation : 被称作“大头针模型”,其实喊什么都行,本质就是一个数据模型,只不过此模型遵循了大头针要遵循的协议(MKAnnotation)
       location:  用户当前所在位置信息(CLLocation对象)
       title:     大头针标注要显示的标题(NSString对象)
       subtitle:  大头针标注要显示的子标题(NSString对象)
       */
      // 根据用户当前位置的经纬度,设置地图显示中心
      /**
          存在弊端:地图显示比例过大,无法调整
          解决方案:直接使用对应的调整地图“显示区域”的API
       */
  //    [mapView setCenterCoordinate:userLocation.coordinate animated:YES];
      /**
        MKCoordinateSpan 跨度解释:
        latitudeDelta:纬度跨度,因为南北纬各90度,所以此值的范围是(0---180);此值表示,整个地图视图宽度,显示多大跨度
        longitudeDelta:经度跨度,因为东西经各180度,所以此值范围是(0---360):此值表示,整个地图视图高度,显示多大跨度
       注意:地图视图显示,不会更改地图的比例,会以地图视图高度或宽度较小的那个为基准,按比例调整
       */
  //    MKCoordinateSpan span = MKCoordinateSpanMake(0.1, 0.1);
  //    MKCoordinateRegion region = MKCoordinateRegionMake(userLocation.coordinate, span);
  //    [mapView setRegion:region animated:YES];
  }

  // 当地图区域(跨度)改变时调用
  -(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
  {
      NSLog(@"%f---%f", mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta);
  }

大头针基本使用

在地图上操作大头针,实际上就是操作大头针数据模型

添加大头针就是添加大头针数据模型

删除大头针就是删除大头针模型

实现步骤

添加一个/多个大头针

  1. 自定义大头针模型(需要遵循MKAnnotation协议)
  #import <MapKit/MapKit.h>

@interface XMGAnnotation : NSObject <MKAnnotation>

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy, nullable) NSString *title;
@property (nonatomic, copy, nullable) NSString *subtitle;

@end
  1. 创建自定义大头针模型,并添加到地图上
  -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
  // 如果我们仅仅添加大头针数据模型,地图上会自动添加系统默认的大头针视图
  CYXAnnotation *annotation = [[CYXAnnotation alloc] init];
//    annotation.coordinate = self.mapView.centerCoordinate;
  // 1. 获取当前点的位置
  UITouch *touch = [touches anyObject];
  CGPoint point = [touch locationInView:self.mapView];
  // 把点转换成对应的经纬度
  CLLocationCoordinate2D coordinate = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];
  // TODO:使用反地理编码,获取对应大头针的所在的位置信息,通过标注显示出来
  annotation.coordinate = coordinate;
  annotation.title = @"荔湾区";
  annotation.subtitle = @"和业广场";

  // 添加单个大头针
  [self.mapView addAnnotation:annotation];
  // 添加多个大头针
//    [self.mapView addAnnotations:@[]];
}

移除1个/多个大头针

  [self.mapView removeAnnotations:self.mapView.annotations];

自定义大头针

添加大头针数据时,其实地图会调用代理方法查找对应的大头针视图,如果没有找到,就会使用系统默认的大头针视图

  1. 模拟系统大头针实现方案,并对大头针进行部分自定义

    (弹出标注, 修改大头针颜色, 设置大头针从天而降, 设置大头针可以被拖拽)

  - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
  {
      if ([annotation isKindOfClass:[MKUserLocation class]]) {
          return nil;
      }
      // 如果此方法返回nil, 就会使用系统自带的大头针视图
      // 模拟下,返回nil,系统的解决方案
      static NSString *pinId = @"pinID";
      MKPinAnnotationView *pinView = ( MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:pinId];
      if (pinView == nil) {
          pinView  = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinId];
      }
      pinView.annotation = annotation;
      // 是否显示标注
      pinView.canShowCallout = YES;
      // 设置大头针颜色
      pinView.pinColor = MKPinAnnotationColorPurple;
      // 设置大头针是否有下落动画
      pinView.animatesDrop = YES;
      return pinView;
  }
  1. 自定义大头针
  - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
  {
      if ([annotation isKindOfClass:[MKUserLocation class]]) {
          return nil;
      }
      /**  自定义大头针-------*/
      static NSString *pinId = @"pinID";
      MKAnnotationView *annoView = [mapView dequeueReusableAnnotationViewWithIdentifier:pinId];
      if (annoView == nil) {
          annoView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinId];
      }
      annoView.annotation = annotation;
      annoView.image = [UIImage imageNamed:@"category_5"];
      annoView.canShowCallout = YES;
      UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"huba.jpeg"]];
      imageView.bounds = CGRectMake(0, 0, 44, 44);
      annoView.leftCalloutAccessoryView = imageView;
      imageView.userInteractionEnabled  = YES;
      UIImageView *imageView2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"eason.jpg"]];
      imageView2.bounds = CGRectMake(0, 0, 44, 44);
      annoView.rightCalloutAccessoryView = imageView2;
      annoView.detailCalloutAccessoryView = [UISwitch new];
      annoView.draggable = YES;
      return annoView;
  }

大头针图标,大头针标注,左侧视图,右侧视图,详情视图,等;

选中和取消选中大头针时的代理方法

  // 点击标注
  - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
  {
      NSLog(@"点击标注");
  }
  // 选中大头针
  - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
  {
      NSLog(@"选中大头针");
  }
  // 取消选中大头针
  -(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
  {
      NSLog(@"取消选中大头针");
  }

利用系统App导航

// 根据两个地标对象进行调用系统导航
- (void)beginNavWithBeginPlacemark:(CLPlacemark *)beginPlacemark andEndPlacemark:(CLPlacemark *)endPlacemark
{

    // 根据 CLPlacemark 地标对象创建 MKPlacemark 地标对象
    MKPlacemark *itemP1 = [[MKPlacemark alloc] initWithPlacemark:beginPlacemark];
    MKMapItem *item1 = [[MKMapItem alloc] initWithPlacemark:itemP1];

    MKPlacemark *itemP2 = [[MKPlacemark alloc] initWithPlacemark:endPlacemark];
    MKMapItem *item2 = [[MKMapItem alloc] initWithPlacemark:itemP2];

    NSDictionary *launchDic = @{
                                // 设置导航模式参数
                                MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,
                                // 设置地图类型
                                MKLaunchOptionsMapTypeKey : @(MKMapTypeHybridFlyover),
                                // 设置是否显示交通
                                MKLaunchOptionsShowsTrafficKey : @(YES),

                                };
    // 根据 MKMapItem 数组 和 启动参数字典 来调用系统地图进行导航
    [MKMapItem openMapsWithItems:@[item1, item2] launchOptions:launchDic];

}

数字版街景地图

    /**
        补充1:类似于地图街景,增强用户体验
     */
    CLLocationCoordinate2D center = CLLocationCoordinate2DMake(23.132931, 113.375924);
    MKMapCamera *camera = [MKMapCamera cameraLookingAtCenterCoordinate:center fromEyeCoordinate:CLLocationCoordinate2DMake(center.latitude + 0.001, center.longitude + 0.001) eyeAltitude:1];
    self.mapView.camera = camera;

地图快照截图

    /**
        补充2:地图截图
     */
    // 截图附加选项
    MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
    // 设置截图区域(在地图上的区域,作用在地图)
    options.region = self.mapView.region;
//    options.mapRect = self.mapView.visibleMapRect;

    // 设置截图后的图片大小(作用在输出图像)
    options.size = self.mapView.frame.size;
    // 设置截图后的图片比例(默认是屏幕比例, 作用在输出图像)
    options.scale = [[UIScreen mainScreen] scale];

    MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
    [snapshotter startWithCompletionHandler:^(MKMapSnapshot * _Nullable snapshot, NSError * _Nullable error) {
        if (error) {
            NSLog(@"截图错误:%@",error.localizedDescription);
        }else
        {
            // 设置屏幕上图片显示
            self.snapshootImageView.image = snapshot.image;
            // 将图片保存到指定路径(此处是桌面路径,需要根据个人电脑不同进行修改)
            NSData *data = UIImagePNGRepresentation(snapshot.image);
            [data writeToFile:@"/Users/chenyanxiang/Desktop/snap.png" atomically:YES];
        }
    }];

获取导航路线信息

// 根据两个地标,向苹果服务器请求对应的行走路线信息
- (void)directionsWithBeginPlackmark:(CLPlacemark *)beginP andEndPlacemark:(CLPlacemark *)endP
{

    // 创建请求
    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];

    // 设置开始地标
    MKPlacemark *beginMP = [[MKPlacemark alloc] initWithPlacemark:beginP];
    request.source = [[MKMapItem alloc] initWithPlacemark:beginMP];

    // 设置结束地标
    MKPlacemark *endMP = [[MKPlacemark alloc] initWithPlacemark:endP];
    request.destination = [[MKMapItem alloc] initWithPlacemark:endMP];

    // 根据请求,获取实际路线信息
    MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse * _Nullable response, NSError * _Nullable error) {

        /**
         MKDirectionsResponse对象解析
            source :开始位置
            destination :结束位置
            routes : 路线信息 (MKRoute对象)

         MKRoute对象解析
            name : 路的名称
            advisoryNotices : 注意警告信息
            distance : 路线长度(实际物理距离,单位是m)
            polyline : 路线对应的在地图上的几何线路(由很多点组成,可绘制在地图上)
            steps : 多个行走步骤组成的数组(例如“前方路口左转”,“保持直行”等等, MKRouteStep 对象)

        MKRouteStep对象解析
            instructions : 步骤说明(例如“前方路口左转”,“保持直行”等等)
            transportType : 通过方式(驾车,步行等)
            polyline : 路线对应的在地图上的几何线路(由很多点组成,可绘制在地图上)

        注意:
            MKRoute是一整条长路;MKRouteStep是这条长路中的每一截;

         */
        [response.routes enumerateObjectsUsingBlock:^(MKRoute * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSLog(@"%@--", obj.name);
            [obj.steps enumerateObjectsUsingBlock:^(MKRouteStep * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                NSLog(@"%@", obj.instructions);
            }];
        }];

    }];

}

绘制导航路线

路线也是一个覆盖层

理论指导:在地图上操作覆盖层,其实就是操作覆盖层的数据模型

添加覆盖层:在地图上添加覆盖层数据模型

删除覆盖层:在地图上移除覆盖层数据模型

1.创建路线覆盖层模型,并添加到地图上

  // 绘制线路
  - (void)drawMapLine:(id <MKOverlay>)overlay
  {
      /**
       注意:这里不像添加大头针那样,只要我们添加了大头针模型,默认就会在地图上添加系统的大头针视图
       添加覆盖层,需要我们实现对应的代理方法,在代理方法中返回对应的覆盖层
       */
      [self.mapView addOverlay:overlay];

      /** 补充测试:添加一个圆形覆盖层 */
  //    MKCircle *circle = [MKCircle circleWithCenterCoordinate:self.mapView.centerCoordinate radius:1000000];
  //    [self.mapView addOverlay:circle];
  }

2.利用地图的代理方法,返回对应的图层渲染

  -(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay{
      // 创建折线渲染对象
      if ([overlay isKindOfClass:[MKPolyline class]]) {
           MKPolylineRenderer *lineRenderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
          // 设置线宽
          lineRenderer.lineWidth = 6;
          // 设置线颜色
          lineRenderer.strokeColor = [UIColor redColor];
          return lineRenderer;
      }
      // 创建圆形区域渲染对象
      //    if ([overlay isKindOfClass:[MKCircle class]]) {
      //        MKCircleRenderer *circleRender = [[MKCircleRenderer alloc] initWithOverlay:overlay];
      //        circleRender.fillColor = [UIColor cyanColor];
      //        circleRender.alpha = 0.6;
      //        return circleRender;
      //    }
      return nil;

  }
时间: 2024-10-01 12:54:04

iOS地图开发-基本使用的相关文章

iOS 地图开发小结

首先来说说ios地图开发使用的主要类: MKMapView:地图控件,无其他Label等控件无异,拖进来就可以用了,用于地图的内容的显示,用户可以对地图进行放大.缩小.拖动.旋转等操作: CLLocationCoordinate2D :坐标,包括经度和纬度: MKCoordinateSpan :地图跨度,表示地图放大倍数,数值越小地图显示的单位越精细: CLLocationManager :用户所在位置的管理类,通过该类的能够获取用户所在的GPS坐标. 下面与大家分享一些个人项目中地图部分所涉及

iOS地图开发MapKit

现在O2O应用非常火,因为基于地理的社交和电子商务应用都有非常广阔的前景 二O2O的移动载体就是手机了(平板基本忽略不计),所以会点手机上Map开发还是不错的 首先苹果已经封装了一套地图框架供我们使用,首先要使用苹果提供的地图框架需要导入MapKit框架 导入完成后即可使用 首先在你的视图里拖入一个MapView, 然后运行就行了~这是你就会看到地图(如果用的是真机最好,模拟器有点蛋疼) 但是现实的是一个大大的地图,赶脚没什么用,我们需要的是一个比较精准的地图,这时进入MKMapView.h文件

iOS地图开发

原文地址:http://www.jianshu.com/p/1ae98a3ff9e4 在iOS中, 地图开发经常会用到的三个框架, 一个是苹果系统自带的MapKit框架, 另外两个, 一个是百度地图BMKMapView, 另一个是高德地图MAMapView. 当时我莫名的对一个问题产生了浓厚的兴趣, 就是百度地图和高德地图英文命名是什么意思!? 于是我就毫不蛋疼的去googol了, 而且还在他俩的社区提问这个问题! 终于, 在我的努力下弄明白他俩代表的意思了. 先看百度地图 BMKMapView

iOS 地图开发MapKit和CLLocation

1,iOS 定位服务 现在对iOS下的定组件建进行如下分类: 1>,无限蜂窝定位,根据移动设备距离基站的位置来实现定位的. 2>,GPS定位,也就是所谓的卫星定位,定位精确度较高,但是受遮盖环境影响较大, 3>,无线wifi定位,根据定位路由器的位置,实现定位, 4>,蓝牙beacon定位,定位精确度高,但是要求在外设的覆盖区域内 下面我们主要讲讲iOS下面的定位吧,主要框架CoreLocation.framework,主要对象CLLocationManager,主要代理CLLoc

iOS地图开发详解一(MKMapView)

一.ios地图说明 ios中自带有地图,之前使用的时谷歌的,不过现在使用的是高德地图,另外在国内,百度地图也很常用. 二.代码实现 1.导入框架 导入MapKit框架如下图所示 2.创建并显示地图 经过以上两步,地图已经可以显示出来了 注意:以上步骤一定要来联网的基础上进行,否则只会看到格子而不会显示地图. 3.设置显示区域 上面的操作显示的地图并不能满足要求,因为它显示的不是我们想要的区域,下面我们说下怎样设置当前显示区域 网上查到北京故宫博物馆的纬度和经度为{39.918031,116.40

[IOS地图开发系类]2、位置解码CLGeocoder

  接第一步的操作,获取到地址信息经纬度后,我们可以对其进行解码,解码采用的CLGeocoder这个类,使用方式如下: 1.在ViewControlelr.m文件中声明一个CLGeocoder的属性,给页面加一个button,然后在处理方法中,对上一篇获取的地址坐标进行解码, code如下 #import "ViewController.h" #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h&

iOS定位服务与地图开发(1)---获取经纬度

定位服务是通过GPS等方式查找定位自己的位置的,再通过地图标注出来. 在iOS中定位服务和地图开发是使用两套API分别完成的. 1.定位服务: iOS系统提供3种不同定位途径: 1>WiFi定位:通过查询一个WiFi路由器的地理位置信息,iPhone.iPod Touch.iPad都可以采用. 2>蜂窝式移动电话基站定位:通过移动运营商基站定位 3>GPS卫星定位:通过3~4颗GPS卫星位置定位,最为准确,但是耗电量大 iOS不像Android系统在定位服务编程时可以指定采用哪种途径进行

iOS定位服务与地图开发(4)---显示地图

iOS 6之前,苹果使用的是谷歌地图,iOS 6之后,苹果使用了自己的地图(国内好像用的是高德地图),但是API编程接口与iOS 5相比没有太大变化. iOS 应用程序中使用Map Kit API开发地图应用程序,使用MKMapView类作为地图显示视图,其委托协议是MKMapViewDelegate. 1.显示地图: .h文件中代码 #import <MapKit/MapKit.h> @interface YXCViewController <MKMapViewDelegate>

iOS定位服务与地图开发(3)---地理信息编码查询

即根据一个NSString的文字描述对象获取相关的地理坐标. 采用CLGeocoder类操作,具体方法: 1>geocodeAddressDictionary:completionHandler: 通过指定一个地址信息字典对象参数进行查询 2>geocodeAddressString:completionHandler:通过指定一个地址信息字符串参数进行查询 3>geocodeAddressString:inRegion:completionHandler:通过制定地址信息字符串和查询范