zoukankan      html  css  js  c++  java
  • 导航 -MapKit

    #import "PPViewController.h"

    #import <MapKit/MapKit.h>

    #import "PPAnnotation.h"

    @interface PPViewController ()<MKMapViewDelegate>

    /**

     *  编码对象

     */

    @property (nonatomic, strong) CLGeocoder *geocoder;

    @property (weak, nonatomic) MKMapView *mapView;

    @end

    @implementation PPViewController

    // 懒加载

    - (CLGeocoder *)geocoder{

        if (!_geocoder) {

            _geocoder = [[CLGeocoder alloc] init];

        }

        return _geocoder;

    }

    - (void)drawRoute:(id)sender {

        

        // 2. 利用GEO对象进行地理编码,获取到地标对象(CLPlacemark)

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

            if (placemarks.count == 0) return;

            

            // 开始位置地标

            CLPlacemark *startPlacemark = [placemarks firstObject];

            

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

                if (placemarks.count == 0) return;

                

                // 添加两个大头针 - 终点,起点

                PPAnnotation *startAnno = [[PPAnnotation alloc] init];

                startAnno.title = startPlacemark.locality;

                startAnno.subtitle = startPlacemark.name;

                startAnno.coordinate = startPlacemark.location.coordinate;

                [self.mapView addAnnotation:startAnno];

                

                // 结束位置地标

                CLPlacemark *endPlacemark = [placemarks firstObject];

                

                PPAnnotation *endAnno = [[PPAnnotation alloc] init];

                endAnno.title = endPlacemark.locality;

                endAnno.subtitle = endPlacemark.name;

                endAnno.coordinate = endPlacemark.location.coordinate;

                [self.mapView addAnnotation:endAnno];

                

                // 3. 再利用获取到的地标对象(CLPlacemark)创建(MKpalcemark) - 起点的item

                [self startDirectionsWithStartClPlacemark:startPlacemark endCLPlacemark:endPlacemark];

            }];

        }];

    }

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view.

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

        self.mapView = mapView;

        [self.view addSubview:self.mapView];

        

        

        // 设置代理

        self.mapView.delegate = self;

        

        // 设置模式

        self.mapView.mapType = MKMapTypeStandard;

        

        // 设置跟踪

        self.mapView.userTrackingMode = MKUserTrackingModeFollow;

        

        // 设置xuanzhuan

        self.mapView.rotateEnabled = NO;

        

        

        //

        UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];

        button.frame = CGRectMake(100, 100, 100, 100);

        [self.view addSubview:button];

        

        [button addTarget:self action:@selector(drawRoute:) forControlEvents:UIControlEventTouchUpInside];

        

    }

    /**

     *  发送请求, 获取路线信息

     *

     *  @param startCLPlacemark 起点地标

     *  @param endClPlacemark   终点地标

     */

    - (void)startDirectionsWithStartClPlacemark:(CLPlacemark *)startCLPlacemark endCLPlacemark:(CLPlacemark *)endCLPlacemark

    {

        // 0. 创建起点对象和终点对象

        MKPlacemark *startMKPlacemark = [[MKPlacemark alloc] initWithPlacemark:startCLPlacemark];

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

        

        MKPlacemark *endMKPlacemark = [[MKPlacemark alloc] initWithPlacemark:endCLPlacemark];

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

        

        // 1. 发送请求到苹果服务器获取导航路线

        // 创建request对象, 说明起点 - 终点

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

        request.source = startItem;

        request.destination = endItem;

        

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

        

        // 2. 根据服务器返回的路线信息, 绘制导航路线

        // 计算完成以后, 调用block, 会返回一个response(包含路线信息)

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

            

            // 2.1 打印返回的路线信息

            for (MKRoute *route in response.routes) {

                LogRed(@"%f -- %f",route.distance / 1000, route.expectedTravelTime / 3600);

                

                // 2.2 绘制路线 - 往地图上添加遮盖

                // 传递当前路线的几何遮盖给地图, 地图就会根据遮盖自动绘制路线

                // 当系统开始绘制路线时, 会询问线条宽度和颜色等

                [self.mapView addOverlay:route.polyline];

                

                

                NSArray *array = route.steps;

                for (MKRouteStep *step in array) {

                    LogGreen(@"%@ --  %f",step.instructions, step.distance);

                }

            }

            

            

        }];

        

    }

    #pragma mark - MKMapViewDelegate

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

    {

        // 移动地图到当前用户所在位置

        [self.mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];

    }

    /**

     *  绘制路线时会调用(添加遮盖时会调用)

     *

     *  @param mapView   mapView

     *  @param overlay

     */

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

    {

        // 创建一条路径遮盖

        MKPolylineRenderer*line = [[MKPolylineRenderer alloc] initWithPolyline:overlay];

        line.lineWidth = 10; // 路线宽度

        line.strokeColor = [UIColor redColor];//路线宽度

        

        return line;

        

    }

  • 相关阅读:
    windwos8.1英文版安装SQL2008 R2中断停止的解决方案
    indwows8.1 英文版64位安装数据库时出现The ENU localization is not supported by this SQL Server media
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    SQL数据附加问题
    eclipse,myeclipse中集合svn的方法
    JAVA SSH 框架介绍
    SSH框架-相关知识点
    SuperMapRealSpace Heading Tilt Roll的理解
    SuperMap iserver manage不能访问本地目的(IE9)
    Myeclipse中js文件中的乱码处理
  • 原文地址:https://www.cnblogs.com/guangleijia/p/4829437.html
Copyright © 2011-2022 走看看