iOS MapKit导航及地理转码辅助类

本文详细介绍了如何使用Objective-C实现地图应用中的路线导航和地理编码功能,包括获取导航路线、地理转码与逆地理编码操作。

头文件:

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface DirectionRouteUtils : NSObject
{
    MKDirections *mDirections;
    CLGeocoder   *mGeocoder;
}

+ (instancetype)sharedInstance;

// 获取导航路线
- (void)findDirectionsFrom:(MKMapItem *)source
                        to:(MKMapItem *)destination
                   handler:(MKDirectionsHandler)completionHandler;

- (void)findDirectionsFrom:(MKMapItem *)source
                        to:(MKMapItem *)destination
             transportType:(MKDirectionsTransportType)transportType
                   handler:(MKDirectionsHandler)completionHandler;

- (void)cancelCalculateDirections;

// 地理转码

- (void)cancelGeocode;
- (void)geocodeAddressString:(NSString *)addressString
           completionHandler:(CLGeocodeCompletionHandler)completionHandler;

- (void)reverseGeocodeLocation:(CLLocation *)location
             completionHandler:(CLGeocodeCompletionHandler)completionHandler;

@end

实现文件:

#import "DirectionRouteUtils.h"

@implementation DirectionRouteUtils

+ (instancetype)sharedInstance
{
    static DirectionRouteUtils *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[[self class] alloc] init];
    });
    
    return sharedInstance;
}

- (id)init
{
    if (self = [super init]) {
        mGeocoder = [[CLGeocoder alloc] init];
    }
    return self;
}


- (void)findDirectionsFrom:(MKMapItem *)source
                        to:(MKMapItem *)destination
             transportType:(MKDirectionsTransportType)transportType
                   handler:(MKDirectionsHandler)completionHandler
{
    NSAssert(completionHandler != nil, @"Calculating directions handler shouldn't be nil!");
    
    [self cancelCalculateDirections];
    
    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
    request.source = source;
    request.destination = destination;
    request.requestsAlternateRoutes = YES;
    request.transportType = transportType; //MKDirectionsTransportTypeAutomobile;//MKDirectionsTransportTypeWalking;
    
    mDirections = [[MKDirections alloc] initWithRequest:request];
    [request release];
    
    /*
    [directions calculateDirectionsWithCompletionHandler:
     ^(MKDirectionsResponse *response, NSError *error) {
         
         if (error) {
             
             NSLog(@"error:%@", error);
         }
         else {
             NSLog(@"%@", response.routes);
             MKRoute *route = response.routes[0];
             
             for(MKRoute *step in route.steps)
             {
                 NSLog(@"Step: %@", ((MKRouteStep *)step).instructions);
             }
             
             
             [self.mapView addOverlay:route.polyline];
         }
     }];
     */
    
    
    if(completionHandler){
        [mDirections calculateDirectionsWithCompletionHandler:completionHandler];
    }

}



- (void)findDirectionsFrom:(MKMapItem *)source
                        to:(MKMapItem *)destination
                   handler:(MKDirectionsHandler)completionHandler
{
    [self findDirectionsFrom:source
                          to:destination
               transportType:MKDirectionsTransportTypeAutomobile
                     handler:completionHandler];
}


- (void)cancelCalculateDirections
{
    if(mDirections){
        [mDirections cancel];
        [mDirections release];
        mDirections = nil;
    }
}

- (void)cancelGeocode
{
    [mGeocoder cancelGeocode];
}


- (void)geocodeAddressString:(NSString *)addressString
           completionHandler:(CLGeocodeCompletionHandler)completionHandler
{
    NSAssert(completionHandler != nil, @"Geocoding handler shouldn't be nil!");
    
    [self cancelGeocode];
    [mGeocoder geocodeAddressString:addressString
                  completionHandler:completionHandler];
}

- (void)reverseGeocodeLocation:(CLLocation *)location
             completionHandler:(CLGeocodeCompletionHandler)completionHandler
{
    NSAssert(completionHandler != nil, @"Reversegeocoding handler shouldn't be nil!");
    
    [self cancelGeocode];
    [mGeocoder reverseGeocodeLocation:location
                    completionHandler:completionHandler];
    
}


@end

测试用例:

- (void)testGeocoding
{
    DirectionRouteUtils *utils = [DirectionRouteUtils sharedInstance];
    [utils geocodeAddressString:@"你要测试的地址" completionHandler:^(NSArray *placemarks, NSError *error) {
        for(CLPlacemark *mark in placemarks){
            NSLog(@"%@", mark.addressDictionary);
        }
    }];

}

- (void)testReverseGeocoding
{
    DirectionRouteUtils *utils = [DirectionRouteUtils sharedInstance];
    CLLocation *location = [[CLLocation alloc] initWithLatitude:24.6182746 longitude:118.131588];
    
    [utils reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
       
        for(CLPlacemark *mark in placemarks){
            NSLog(@"%@", mark.addressDictionary);
            NSLog(@"%@", mark);
        }
        
    }];
    [location release];
}


- (void)testDirections
{
    
    CLLocationCoordinate2D fromCoordinate = CLLocationCoordinate2DMake(24.6382086,
                                                                       118.131588);
    CLLocationCoordinate2D toCoordinate   = CLLocationCoordinate2DMake(24.6182746,
                                                                       118.131588);
    
    MKPlacemark *fromPlacemark = [[MKPlacemark alloc] initWithCoordinate:fromCoordinate
                                                       addressDictionary:nil];
    
    MKPlacemark *toPlacemark   = [[MKPlacemark alloc] initWithCoordinate:toCoordinate
                                                       addressDictionary:nil];
    
    MKMapItem *fromItem = [[MKMapItem alloc] initWithPlacemark:fromPlacemark];
    MKMapItem *toItem   = [[MKMapItem alloc] initWithPlacemark:toPlacemark];
    
    DirectionRouteUtils *utils = [DirectionRouteUtils sharedInstance];
    [utils findDirectionsFrom:fromItem to:toItem handler:^(MKDirectionsResponse *response, NSError *error) {
        if (error) {
            
            NSLog(@"error:%@", error);
        }
        else {
            NSLog(@"%@", response.routes);
            MKRoute *route = response.routes[0];
            
            for(MKRoute *step in route.steps)
            {
                NSLog(@"Step: %@", ((MKRouteStep *)step).instructions);
            }
            
            
            
        }

    }];
}


源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值