热门标签 | 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;
}

 


推荐阅读
  • Hadoop集群搭建:实现SSH无密码登录
    本文介绍了如何在CentOS 7 64位操作系统环境下配置Hadoop集群中的SSH无密码登录,包括环境准备、用户创建、密钥生成及配置等步骤。 ... [详细]
  • 探索OpenWrt中的LuCI框架
    本文深入探讨了OpenWrt系统中轻量级HTTP服务器uhttpd的工作原理及其配置,重点介绍了LuCI界面的实现机制。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 使用R语言进行Foodmart数据的关联规则分析与可视化
    本文探讨了如何利用R语言中的arules和arulesViz包对Foodmart数据集进行关联规则的挖掘与可视化。文章首先介绍了数据集的基本情况,然后逐步展示了如何进行数据预处理、规则挖掘及结果的图形化呈现。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 本文概述了在GNU/Linux系统中,动态库在链接和运行阶段的搜索路径及其指定方法,包括通过编译时参数、环境变量及系统配置文件等方式来控制动态库的查找路径。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 本文介绍了一种在 Android 开发中动态修改 strings.xml 文件中字符串值的有效方法。通过使用占位符,开发者可以在运行时根据需要填充具体的值,从而提高应用的灵活性和可维护性。 ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
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社区 版权所有