CoreLocation是控制GPS硬件获取地理坐标信息的系统类库,而MapKit是系统地图的工具包,将两者结合使用可以实现不同的地图功能。

1.CoreLocation

在CoreLocation中,CLLocationManager是获取坐标的工具,创建如下:

if ([CLLocationManager locationServicesEnabled]) // 判断设备是否支持定位功能
{
NSLog(@"支持定位");
locManager = [[CLLocationManager alloc] init];
locManager.distanceFilter = ; // 过滤距离,以m为单位,越小更新越精确越快,但越耗电
locManager.desiredAccuracy = kCLLocationAccuracyBest; // 定位精确度,但耗电
locManager.delegate = self;
}
[locManager startUpdatingLocation]; // 设置好属性后,需要开始更新定位

CLLocationManager更新位置的代理方法如下,其中需要用到MKReverseGeocoder对经纬度进行解析,获取更直观详细的位置信息:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
NSLog(@"%s",__func__);
NSLog(@"locs = %@",locations); CLLocation *newLoc = (CLLocation *)[locations objectAtIndex:]; // 位置信息 // 解析地理编码
MKReverseGeocoder *geo = [[MKReverseGeocoder alloc] initWithCoordinate:newLoc.coordinate]; // 解析经纬度(在IOS5中该方法过期了,需要用CLGeocoder)
geo.delegate = self;
[geo start];
}

MKReverseGeocoder解析经纬度后的代理方法:

// 反解析成功
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark
{
NSLog(@"国家:%@",placemark.country);
NSLog(@"市区:%@",placemark.locality);
} // 反解析失败
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error
{
}

2.MapKit

创建一个地图视图

mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
mapView.mapType = MKMapTypeStandard; // 地图显示类型,分标准,卫星,俯瞰
mapView.showsUserLocation = YES; // 是否显示当前位置
mapView.delegate = self;

要更新地图的话,可以在-locationManager:didUpdateLocations:中设置mapView的相关属性,如下:

// 设置地图区域,并确定地图细腻程度 ,放在解析经纬度之前

    MKCoordinateRegion region;  // 显示区域
region.center = newLoc.coordinate; MKCoordinateSpan span; // 显示范围
span.latitudeDelta = 0.01f; // 细腻精度系数
span.longitudeDelta = 0.01f;
region.span = span; mapView.region = region;

若要在地图中插入一个大头针的话,先要创建一个遵守MKAnnotation协议的类,

.h
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h> @interface BIDDemoAnnotation : NSObject <MKAnnotation>
{
CLLocationCoordinate2D _coordinate;
} @property (readonly,nonatomic) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle; - (id)initWithCoordinate2D:(CLLocationCoordinate2D)aCoordinate;
@end #####################################
.m
#import "BIDDemoAnnotation.h" @implementation BIDDemoAnnotation
@synthesize title = _title;
@synthesize subtitle = _subtitle;
@synthesize coordinate = _coordinate; - (id)initWithCoordinate2D:(CLLocationCoordinate2D)aCoordinate
{
if (self = [super init]) {
_coordinate = aCoordinate;
// self.coordinate = aCoordiante 错误,因为该属性为只读
}
return self;
}
@end

然后在反解析成功的代理方法中插入如下代码:

// [mapView removeAnnotations:mapView.annotations]; 清理已有的大头针

//根据经纬度创建大头针
BIDDemoAnnotation *ano = [[BIDDemoAnnotation alloc] initWithCoordinate2D:geocoder.coordinate]; //设置大头针的备注信息
ano.title = placemark.country;
ano.subtitle = placemark.locality; //插入到地图
[mapView addAnnotation:ano];
[ano release];

最后实现MKMapView的代理方法(原理和TableView一样,重用机制),设置大头针的样式等信息:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
if ([annotation.title isEqualToString:@"Current Location"] == YES) {
return nil;
} static NSString *identifier = @"test";
MKPinAnnotationView *pinAnnotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (pinAnnotationView == nil) {
pinAnnotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];
}
pinAnnotationView.pinColor = MKPinAnnotationColorRed;
pinAnnotationView.animatesDrop = YES; UIButton *rightView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
pinAnnotationView.rightCalloutAccessoryView = rightView; UIButton *leftView = [UIButton buttonWithType:UIButtonTypeCustom];
leftView.frame = CGRectMake(, , , );
leftView.userInteractionEnabled = YES; pinAnnotationView.canShowCallout = YES;
pinAnnotationView.leftCalloutAccessoryView = leftView; return pinAnnotationView;
}

(IOS)CoreLocation 和 MapKit 的应用的更多相关文章

  1. iOS 利用CoreLocation和MapKit开发搜索附近的商场功能

    代码如下: ////  SearchNearbyShopViewController.m//  SearchNearbyShop////  Created by Linzhixiao on 16/2/ ...

  2. IOS CoreLocation框架的使用(用于地理定位)

    ●  在移动互联网时代,移动app能解决用户的很多生活琐事,比如 ●  导航:去任意陌生的地方 ●  周边:找餐馆.找酒店.找银行.找电影院 ●  在上述应用中,都用到了地图和定位功能,在iOS开发中 ...

  3. iOS - CoreLocation 定位

    前言 NS_CLASS_AVAILABLE(10_6, 2_0) @interface CLLocationManager : NSObject 1.CoreLocation 定位 配置 1.在 iO ...

  4. iOS核心笔记—MapKit框架-基础

    1.MapKit框架简介: ✨了解:MapKit框架使用须知:①.MapKit框架中所有的数据类型的前缀都是MK:②.需要导入#import <MapKit/MapKit.h>头文件:③. ...

  5. iOS开发之MapKit

    1.概述 MapKit框架使用前提: 导入框架: 导入主头文件: #import <MapKit/MapKit.h> MapKit框架使用须知: MapKit框架中所有数据类型的前缀都是M ...

  6. CoreLocation+MapKit系统定位(含坐标以及详细地址)

    iOS8 之后出现一些新的配置 [self.manager requestWhenInUseAuthorization]; 并且在info.plist文件中增加 NSLocationWhenInUse ...

  7. IOS苹果和百度地图的相关使用

    iOS中使用较多的3款地图,google地图.百度地图.苹果自带地图(高德).其中苹果自带地图在中国使用的是高德的数据.苹果在iOS 6之后放弃了使用谷歌地图,而改用自家的地图.在国内使用的较多的就是 ...

  8. iOS之苹果和百度地图的使用

    iOS中使用较多的3款地图,google地图.百度地图.苹果自带地图(高德).其中苹果自带地图在中国使用的是高德的数据.苹果在iOS 6之后放弃了使用谷歌地图,而改用自家的地图.在国内使用的较多的就是 ...

  9. 【iOS】苹果,百度Map定位使用与总结

    iOS中使用较多的3款地图,google地图.百度地图.苹果自带地图(高德).当中苹果自带地图在中国使用的是高德的数据.苹果在iOS 6之后放弃了使用谷歌地图,而改用自家的地图.在国内使用的较多的就是 ...

随机推荐

  1. HDU 5919 Sequence II(可持久化线段树)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...

  2. Codeblock解决注释乱码问题及在ubuntu中程序运行时乱码问题。

    (1)修改源文件保存编码在:settings->Editor->gernal settings>other settings 看到左边的Encoding group Box,改为WI ...

  3. 关于cvScalar的那些事

    CvScalar 可存放在1-,2-,3-,4-TUPLE类型的捆绑数据的容器 该函数包含4个浮点成员,可以用来表示B(Blue),G(Green),R(Red),Alpha(表示图像的透明度) ty ...

  4. connot find one or more components. please reinstall the application

    正在用 Visual Studio 2013 写程序,程序一直执行正常. 此时,手动把注册表"HKEY_USERS"的当前用户的权限删除.再运行程序会提示:“是否继续并运行上次的成 ...

  5. BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )

    不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...

  6. HDU 3729 二分匹配 反向匹配

    题意: 给定 n个学生 说的 自己 考试排名的 可能范围 确定最多几个人说真话 如果有多种答案,输出字典序最大的那种( 要求字典序最大,所以solve中从最大字典序开始匹配) 思路: 题目给定  点 ...

  7. Java垃圾回收初步理解

    Java技术提供了一个系统级的线程,即垃圾收集器线程(线程优先级低),垃圾收集线程在一个Java程序中的执行是自动的,不能强制执行, 可以手动调用java.lang.System.gc(),通知JVM ...

  8. php学习笔记(3)

    1.计数器 <?php /* simple access counter for php3 (c)1998 David W. Bettis dbettis@eyeintegrated.com m ...

  9. bzoj 1295: [SCOI2009]最长距离

    题目链接 1295: [SCOI2009]最长距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1165  Solved: 619[Submit][ ...

  10. java 显示视频时间--玩的

    1.显示视频时间 package view.time; import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.jave.Mul ...