在上两篇《高德地图---线路规划查询/正向地理编码/地图覆盖物》和《高德地图---天气搜索/逆向地理编码/定位》中介绍了高德地图的正向地理编码和逆向地理编码及其他功能。总体来说简单使用高德地图还不算复杂。iOS系统自带也是有定位服务的,就百度研究了一下,内要谷歌还要,但是简单的使用一下百度也就基本够用了。

这次的使用主要涉及到MapKit的四个功能点:定位、方向、正向地理编码、逆向地理编码。

详细功能点得使用可以参考这篇文章《iOS-CoreLocation:无论你在哪里,我都要找到你》。我在使用过程中也是参考了这篇文章,感谢博主的无私分享。我也把我的使用分享给大家。有了之前使用高德地图的经验,总体来说,使用系统的MapKit和高德地图的操作差不多,但是系统的MapKit在正向和逆向地理编码获取结果的时候感觉比高德地图慢一点,可能是我的网络有问题吧。

整个应用的功能分两个部分,大致思路:

1.开启定位 --- >得到定位点的经纬度 --- >逆向地理编码 --- >获取当前位子地点名;

2.输入需要搜索的地点名 --- > 正向地理编码 --- >显示搜索结果。

首先上效果图:iPhone4S真机测试的效果图

ios 高德地图怎么给自定义气泡付数据_Mapkit

还是直接上代码:有了上面的思路和前两天高德地图的基础,代码部分就没上面难度。相关属性和方法都在注释里面的。

代码下载请移步这里:请点击我  https://github.com/zhuming3834/MapKit。

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
#import "ResultTableViewCell.h"

@interface ViewController ()<CLLocationManagerDelegate,UITextFieldDelegate,UITableViewDataSource,UITableViewDelegate>

@property (nonatomic,strong)CLLocationManager *manage;
@property (weak, nonatomic) IBOutlet UILabel *currentLocation;       //当前位置
@property (weak, nonatomic) IBOutlet UILabel *currentLatitudeLabel;  //当前位置的纬度
@property (weak, nonatomic) IBOutlet UILabel *currentLongitudeLabel; //当前位置的精度
@property (weak, nonatomic) IBOutlet UILabel *currentAltitudeLabel;  //当前位置的海拔
@property (weak, nonatomic) IBOutlet UITextField *textField;         //搜索栏textField
@property (weak, nonatomic) IBOutlet UITableView *tabelView;         //搜做结果显示
@property (weak, nonatomic) IBOutlet UILabel *resultNumLabel;

@property (nonatomic,copy)NSArray *placemarksArr;                    //存储搜索结果

@end

@implementation ViewController

- (void)viewDidLoad {
	[super viewDidLoad];
	[self setTextField];
	[self setTableView];
	[self setCLLoactionManage];
	// Do any additional setup after loading the view, typically from a nib.
}
/**
 *  开启定位和开启方向
 */
- (void)setCLLoactionManage{
	self.manage = [[CLLocationManager alloc] init];
	self.manage.delegate = self;
	self.manage.desiredAccuracy = kCLLocationAccuracyBest;
	//开始定位
	[self.manage startUpdatingLocation];
	//iOS8请求授权
	[self.manage requestWhenInUseAuthorization];
	//开始方向
	[self.manage startUpdatingHeading];
}
#pragma mark - 定位的回调
/**
 *  定位的回调
 *  这个回调会多次执行
 *  @param manager   manager description
 *  @param locations locations description
 */
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
	CLLocation *loc = [locations firstObject];
//	NSLog(@"纬度 = %f,经度 = %f",loc.coordinate.latitude,loc.coordinate.longitude);
//	NSLog(@"数组个数 = %ld",(long)locations.count);
//	NSLog(@"海平面高度 = %f",loc.altitude );
//	NSLog(@"速度 = %f",loc.speed);
//	NSLog(@"时间 = %@",loc.timestamp);
	//逆向地理编码
	static dispatch_once_t oneToken;
	dispatch_once(&oneToken, ^{
		[self setRevGeocodeWithLatitude:loc.coordinate.latitude longitude:loc.coordinate.longitude];
	});
	//当前位置的海拔高度
	self.currentAltitudeLabel.text = [NSString stringWithFormat:@"%f",loc.altitude];
	//当前位置的纬度
	self.currentLatitudeLabel.text = [NSString stringWithFormat:@"%f",loc.coordinate.latitude];
	//当前位置的精度
	self.currentLongitudeLabel.text =[NSString stringWithFormat:@"%f",loc.coordinate.longitude];
}
#pragma mark - 方向的回调
/**
 *  方向的回调
 *
 *  @param manager    manager description
 *  @param newHeading newHeading description
 */
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
	//与磁场北方向的偏角
//	NSLog(@"magneticHeading = %f",newHeading.magneticHeading);
//	//与正北方向的偏角
//	NSLog(@"trueHeading = %f",newHeading.trueHeading);
//	NSLog(@"headingAccuracy = %f",newHeading.headingAccuracy);
//	NSLog(@"description = %@",newHeading.description);
//	NSLog(@"timestamp = %@",newHeading.timestamp);
//	NSLog(@"x = %f",newHeading.x);
//	NSLog(@"y = %f",newHeading.y);
//	NSLog(@"z = %f",newHeading.z);
}
#pragma mark -正向地理编码
/**
 *  根据地名获取地理编码
 *
 *  @param place 需要被定位的地名
 */
- (void)getClgeocode:(NSString *)place{
	CLGeocoder *clgeocode = [[CLGeocoder alloc] init];
	[clgeocode geocodeAddressString:place completionHandler:^(NSArray *placemarks, NSError *error) {
		self.placemarksArr = placemarks;
		self.resultNumLabel.text = [NSString stringWithFormat:@"%d条数据",placemarks.count];
		[self.tabelView reloadData];
	}];
}
#pragma mark -逆向地理编码
/**
 *  逆向地理编码
 *
 *  @param latitude  latitude 纬度
 *  @param longitude longitude 精度
 */
- (void)setRevGeocodeWithLatitude:(float)latitude longitude:(float)longitude{
	CLLocation  *revGeocode = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
	CLGeocoder *clgeocode = [[CLGeocoder alloc] init];
	[clgeocode reverseGeocodeLocation:revGeocode completionHandler:^(NSArray *placemarks, NSError *error) {
		CLPlacemark *mark = (CLPlacemark *)placemarks[0];
		NSLog(@"name = %@",mark.name);
		self.currentLocation.text = mark.name;
	}];
}
/**
 *  textField和代理的关联
 */
- (void)setTextField{
	self.textField.delegate = self;
}
#pragma mark - 实现textField代理方法
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
	return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField{
	
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
	return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField{
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
	return YES;
}

- (BOOL)textFieldShouldClear:(UITextField *)textField{
	return YES;
}
/**
 *  textField回调方法
 *  键盘搜索键按下后开始正向地理编码搜索  收起键盘
 *  @param textField textField description
 *
 *  @return YES
 */
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
	[self getClgeocode:textField.text];
	[textField resignFirstResponder];
	return YES;
}
/**
 *  设置tabelView和代理关联
 *  注册ResultTableViewCell
 */
- (void)setTableView{
	self.tabelView.delegate = self;
	self.tabelView.dataSource = self;
	[self.tabelView registerNib:[UINib nibWithNibName:@"ResultTableViewCell" bundle:nil] forCellReuseIdentifier:@"Cell"];
}
#pragma mark - 实现tabelView代理回调方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
	//设置row的个数
	return self.placemarksArr.count;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
	return 1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
	//设置row的高度
	return 60;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
	static NSString *identify = @"Cell";
	ResultTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identify];
	if (cell == nil) {
		cell = [[[NSBundle mainBundle] loadNibNamed:@"ResultTableViewCell" owner:self options:nil] firstObject];
	}
	CLPlacemark *mark = (CLPlacemark *)self.placemarksArr[indexPath.row];
	cell.loactionLabel.text = mark.name;
	cell.laLabel.text = [NSString stringWithFormat:@"%f",mark.location.coordinate.longitude];
	cell.loLabel.text = [NSString stringWithFormat:@"%f",mark.location.coordinate.latitude];
	return cell;
}
- (void)didReceiveMemoryWarning {
	[super didReceiveMemoryWarning];
	// Dispose of any resources that can be recreated.
}
@end

采用的storyboard搭建的VC和xib做的cell。截图如下:

ios 高德地图怎么给自定义气泡付数据_定位_02

ios 高德地图怎么给自定义气泡付数据_ios 高德地图怎么给自定义气泡付数据_03