热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

iOS6之前,苹果使用的是谷歌地图,iOS6之后,苹果使用了自己的地图(国内好像用的是高德地图),但是API编程接口与iOS5相比没有太大变化。iOS应用程序中使用MapKitAPI开

iOS 6之前,苹果使用的是谷歌地图,iOS 6之后,苹果使用了自己的地图(国内好像用的是高德地图),但是API编程接口与iOS 5相比没有太大变化。

iOS 应用程序中使用Map Kit API开发地图应用程序,使用MKMapView类作为地图显示视图,其委托协议是MKMapViewDelegate。

1、显示地图:

.h文件中代码

#import 

@interface YXCViewController @end

.m文件类实现代码

@implementation YXCViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // 设置地图的类型
    self.mapView.mapType = MKMapTypeStandard;
    // 设置代理
    self.mapView.delegate = self;
}

#pragma  mark - MKMapViewDelegate代理方法
// 失败回调
- (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error
{
    NSLog(@"error : %@",error.localizedDescription);
}

@end

地图类型有3种:

MKMapTypeStandard:标准地图。

MKMapTypeSatellite:卫星地图类型。

MKMapTypeHybrid:混合地图类型。

2、添加标注:

如果要在地图视图上添加标注点,需要2个步骤:1)触发添加动作;2)实现地图委托方法mapView:viewForAnnotation:,完成添加标注。

1)触发添加动作:

- (IBAction)geocodeQuery:(id)sender {
    
    // 从界面文本框获取查询地址字符串
    if (_txtQueryKey.text == nil || [_txtQueryKey.text length] == 0) {
        return ;
    }
    
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    
    [geocoder geocodeAddressString:_txtQueryKey.text completionHandler:^(NSArray *placemarks, NSError *error) {
        
        NSLog(@"查询记录数:%i",[placemarks count]);
        
        if ([placemarks count] > 0) {
            // 移除目前地图上所有标注点【否则单击查询按钮,你会发现地图上的标注点越来越多】
            [self.mapView removeAnnotations:_mapView.annotations];
        }
        
        for (int i = 0; i <[placemarks count]; i++) {
            
            CLPlacemark *placemark = placemarks[i];
            // 关闭键盘
            [_txtQueryKey resignFirstResponder];
            
            // 调整地图位置和缩放比例
            MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(placemark.location.coordinate, 1000, 1000);
            [_mapView setRegion:viewRegion animated:YES];
            
            // 实例化自定义的实现了MKAnnotation协议的地图标注点类
            MapLocation *annoation = [[MapLocation alloc] init];
            annoation.streetAddress = placemark.thoroughfare;
            annoation.city = placemark.locality;
            annoation.state = placemark.administrativeArea;
            annoation.zip = placemark.postalCode;
            annoation.coordinate = placemark.location.coordinate;
            
            // 把标注点对象添加到地图上
            // 该方法一定会调用代理方法mapView: viewForAnnotation:
            [_mapView addAnnotation:annoation];
        }
    }];
}

MKCoordinateRegionMakeWithDistance()函数封装了一个表示地图区域的结构体:

typedef struct {

    CLLocationCoordinate2D center;   // 中心点

    MKCoordinateSpan span;  // 跨度

}MKCoordinateRegion ;

2)实现代理方法,完成添加标注

// 委托方法,在地图视图添加标注的时候回调
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation
{
    // 获得地图标注对象
    MKPinAnnotationView *annoatiOnView= (MKPinAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:@"PIN_ANNOATION"];
    if (annoatiOnView== nil) {
        annoationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"PIN_ANNOATION"];
    }
    // 设置大头针标注视图的颜色为紫色
    annoationView.pinColor= MKPinAnnotationColorPurple;
    // 设置标注视图时候是否动画显示在地图上
    annoationView.animatesDrop = YES;
    // 在标注上可以显示一些附加信息,为YES情况下单击“大头针”时会出现一个气泡
    // 气泡中文字信息封装在MapLocation对象中
    annoationView.canShowCallout = YES;
    
    return annoationView;
}

自定义标注类MapLocation实现:

首先需要引入头文件,因为MKAnnotation协议是包含在该框架中。

- (NSString *)title :标注点上的主标题

- (NSString *)subTitle:标注点上副标题

.h头文件中代码:

#import 

@interface MapLocation : NSObject

// 地理坐标
@property (nonatomic , readwrite) CLLocationCoordinate2D coordinate;
// 街道信息属性
@property (nonatomic , copy) NSString *streetAddress;
// 城市信息属性
@property (nonatomic , copy) NSString *city;
// 州、省、市信息
@property (nonatomic , copy) NSString *state;
// 邮编
@property (nonatomic , copy) NSString *zip;

@end

.m中代码:

 

@implementation MapLocation

- (NSString *)title
{
    return @"您的位置!";
}

- (NSString *)subtitle
{
    NSMutableString *ret = [[NSMutableString alloc] init];
    if (_state)
        [ ret appendString:_state];
    if (_city) {
        [ret appendString:_city];
    }
    
    if (_city && _state) {
        [ret appendString:@","];
    }
    if (_streetAddress && (_city || _state || _zip)) {
        [ret appendString:@"?"];
    }
    if (_streetAddress) {
        [ret appendString:_streetAddress];
    }
    
    if (_zip) {
        [ret appendFormat:@",%@",_zip];
    }
    
    return ret;
    
}

 效果图:

3、跟踪用户位置变化:

MapKit提供了跟踪用户位置和方向变化的API,可以不用自己编写定位服务代码。开启地图视图的showsUserLocation属性,并设置方法setUserTrackingMode:就可以了,参考代码如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // 设置地图的类型
    self.mapView.mapType = MKMapTypeStandard;
    // 设置代理
    self.mapView.delegate = self;
    
    // 允许跟踪显示用户的位置信息
    self.mapView.showsUserLocation = YES;
    // 设置用户跟踪模式(有3种)
    [self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
}
// 实现地图视图的委托方法
// 该方法是在定位服务更新完成用户位置时回调
// 在该方法中重新调整地图的中心点为当前用户的中心点
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    self.mapView.centerCoordinate = userLocation.location.coordinate;
}

 


推荐阅读
  • IOS9之当前位置定位
    2019独角兽企业重金招聘Python工程师标准#import*.h文件中导入以下两个框架*#import ... [详细]
  • 在iOS6之后,不再使用谷歌地图了,而是使用苹果自己的地图,但是API编程接口没有太大的变化。开发人员不需要再学习很多新东西就能开发地图应用,这是负责任的做法。因此本节介绍的内容也同样适用于iOS5 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 添加#import头文件倒入mapkit.framework库mapkit.framework是属于ui,可以在故事版上添加mkmap ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • Java编程实现邻接矩阵表示稠密图的方法及实现类介绍
    本文介绍了Java编程如何实现邻接矩阵表示稠密图的方法,通过一个名为AMWGraph.java的类来构造邻接矩阵表示的图,并提供了插入结点、插入边、获取邻接结点等功能。通过使用二维数组来表示结点之间的关系,并通过元素的值来表示权值的大小,实现了稠密图的表示和操作。对于对稠密图的表示和操作感兴趣的读者可以参考本文。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
author-avatar
那朵逆风的蔷薇_708
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有