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. POJ 3061 Subsequence(Two Pointers)

    [题目链接] http://poj.org/problem?id=3061 [题目大意] 给出S和一个长度为n的数列,问最短大于等于S的子区间的长度. [题解] 利用双指针获取每一个恰好大于等于S的子 ...

  2. Hive Server 2 安装部署测试

    Hive 0.11 包含了Hive Server 1 和 Hive Server 2,还包含1的原因是为了做到向下兼容性.从长远来看都会以Hive Server 2作为首选 1. 配置hive ser ...

  3. javascript条件运算符

    variablename=(condition)?value1:value2 javascript条件运算符

  4. 简单天气应用开发——API接口

    寒假回家无事,想到自学iOS开发已有一段时间,还没做过真正自己的应用,就起了做一个天气预报App的念头. 想到就做.天气预报第一步自然是找到好用的API接口来获取天气信息.在百度上搜索了一圈,找到的都 ...

  5. http 代理 测试

    Technorati 标记: http 代理验证及测试 Technorati 标记: C# 参考了网上很多资料,综合整理出来最终的代码:   using System; using System.Co ...

  6. slf4j+log4j配置(Maven)

    首先配置Maven依赖 <!-- http://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --> <dependency& ...

  7. Cocos2d-x基础篇C++

    1.C++类和对象 类的公有成员可以使用成员访问运算符(.)访问. (::)是范围解析运算符.调用成员函数是在对象上使用(.)运算符. 2.C++继承(C++中父类称为基类,子类称为派生类) clas ...

  8. JQuery中文本框获取焦点

    今天遇见这么一个小小的问题,就是文本框中需要输入内容才可以提交,如果没有输入就提示并使该文本框获得焦点! 这么一个简单的事情如果没有使用jQuery的话 是不是对象.focus()就可以了, 可是当我 ...

  9. 关于codestyle

    如果你的代码易于阅读,那么代码中bug也将会很少,因为一些bug可以很容被调试,并且,其他开发者参与你项目时的门槛也会比较低.因此,如果项目中有多人参与,采取一个有共识的编码风格约定非常有必要. 以t ...

  10. [LeetCode]题解(python):084-Largest Rectangle in Histogram

    题目来源: https://leetcode.com/problems/largest-rectangle-in-histogram/ 题意分析: 给定一个数组,数组的数字代表这个位置上的bar的高度 ...