#import <CoreGraphics/CoreGraphics.h>
#import <MapKit/MapKit.h>
@interface TwoViewController ()<MKMapViewDelegate,CLLocationManagerDelegate>
{
MKMapView *mapview;
}
@property (strong, nonatomic) CLGeocoder *geoCoder;
@end
@implementation TwoViewController
- (void)viewDidLoad {
[super viewDidLoad];
//设置标题
self.navigationItem.title = [NSString stringWithFormat:@"%@%@",self.province,self.city];
self.view.backgroundColor = [UIColor whiteColor];
//设置导航条按钮
UIBarButtonItem *dingwei = [[UIBarButtonItem alloc]initWithTitle:@"定位" style:UIBarButtonItemStylePlain target:self action:@selector(dingweis)];
UIBarButtonItem *dangqian = [[UIBarButtonItem alloc]initWithTitle:@"当前位置" style:UIBarButtonItemStylePlain target:self action:@selector(dangqians)];
self.navigationItem.rightBarButtonItems = @[dingwei,dangqian];
//初始化地图
mapview = [[MKMapView alloc]initWithFrame:CGRectMake(0, 64, 375, 667)];
mapview.delegate = self;
[self.view addSubview:mapview];
//地图类型为标准
mapview.mapType = MKMapTypeStandard;
//设置地图可以缩放
mapview.zoomEnabled = YES;
//设置可以滚动
mapview.scrollEnabled = YES;
//设置可以旋转
mapview.rotateEnabled = YES;
//设置显示用户当前位置
mapview.showsUserLocation = YES;
//创建地址解析器
self.geoCoder = [[CLGeocoder alloc]init];
}
#pragma mark - 定位
-(void)dingweis
{
NSString *dingwei = [NSString stringWithFormat:@"%@%@",self.province,self.city];
if (dingwei != nil && dingwei.length>0) {
[self locateAt:dingwei];
}
}
// MKMapViewDelegate协议中的方法,该方法返回的MKOverlayRenderer负责绘制覆盖层控件
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView
rendererForOverlay:(id<MKOverlay>)overlay
{
//创建一个圆形覆盖层
MKCircle * circle = (MKCircle*)overlay;
// 创建一个MKCircleRenderer(润色,渲染)对象
MKCircleRenderer* render = [[MKCircleRenderer alloc] initWithCircle:circle];
// 设置MKCircleRenderer的透明度
render.alpha = 0.2;
// 设置MKCircleRenderer的填充颜色和边框颜色
render.fillColor = [UIColor yellowColor];
render.strokeColor = [UIColor blueColor];
return render;
}
//将字符串地址转换为经纬度,并执行定位
-(void)locateAt:(NSString *)dingwei
{
[self.geoCoder geocodeAddressString:dingwei completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if ([placemarks count]>0 && error == nil) {
NSLog(@"搜索到匹配%lu条地址数据",(unsigned long)placemarks.count);
//处理第一个地址
CLPlacemark *placemark = [placemarks objectAtIndex:0];
NSLog(@"经度 = :%f",placemark.location.coordinate.longitude);
NSLog(@"纬度 = :%f",placemark.location.coordinate.latitude);
NSLog(@"国家 = %@",placemark.country);
NSLog(@"邮编 = %@",placemark.postalCode);
NSLog(@"位置 = %@",placemark.locality);
//设置地图显示的范围
MKCoordinateSpan span;
//地图显示范围越小,细节越清楚
span.latitudeDelta = 0.01;
span.longitudeDelta = 0.01;
MKCoordinateRegion region = {placemark.location.coordinate,span};
//设置地图中心位置为搜索到的位置
[mapview setRegion:region];
//覆盖层
CLLocationCoordinate2D coord = placemark.location.coordinate;
MKCircle* circle = [MKCircle circleWithCenterCoordinate:coord radius:50];
// 添加MKOverlay
[mapview addOverlay:circle level:MKOverlayLevelAboveLabels];
}
else
{
NSLog(@"无搜索结果");
}
}];
}
#pragma mark - 当前位置
-(void)dangqians
{
NSString* longitudeStr = [NSString stringWithFormat:@"%f",116.306];
NSString* latitudeStr = [NSString stringWithFormat:@"%f",40.0456];
if(longitudeStr != nil && longitudeStr.length > 0
&& latitudeStr != nil && latitudeStr.length > 0)
{
// 将用户输入的经度、纬度封装成CLLocation对象
CLLocation* location = [[CLLocation alloc]
initWithLatitude:[latitudeStr floatValue]
longitude:[longitudeStr floatValue]];
[self.geoCoder reverseGeocodeLocation:location completionHandler:
^(NSArray *placemarks, NSError *error)
{
// 如果解析结果的集合元素的个数大于1,表明解析得到了经度、纬度信息
if (placemarks.count > 0)
{
// 只处理第一个解析结果,实际项目可使用列表让用户选择
CLPlacemark* placemark = placemarks[0];
// 获取详细地址信息
NSArray* addrArray = [placemark.addressDictionary
objectForKey:@"FormattedAddressLines"];
// 将详细地址拼接成一个字符串
NSMutableString* addr = [[NSMutableString alloc] init];
for(int i = 0 ; i < addrArray.count ; i ++)
{
[addr appendString:addrArray[i]];
}
[self locateAtDQ:addr];
}
}];
}
}
//将字符串地址转换为经纬度,并执行定位
-(void)locateAtDQ:(NSString *)dangqian
{
[self.geoCoder geocodeAddressString:dangqian completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if ([placemarks count]>0 && error == nil) {
NSLog(@"搜索到匹配%lu条地址数据",(unsigned long)placemarks.count);
//处理第一个地址
CLPlacemark *placemark = [placemarks objectAtIndex:0];
NSLog(@"经度 = :%f",placemark.location.coordinate.longitude);
NSLog(@"纬度 = :%f",placemark.location.coordinate.latitude);
NSLog(@"国家 = %@",placemark.country);
NSLog(@"邮编 = %@",placemark.postalCode);
NSLog(@"位置 = %@",placemark.locality);
//设置地图显示的范围
MKCoordinateSpan span;
//地图显示范围越小,细节越清楚
span.latitudeDelta = 0.01;
span.longitudeDelta = 0.01;
MKCoordinateRegion region = {placemark.location.coordinate,span};
//设置地图中心位置为搜索到的位置
[mapview setRegion:region];
//创建一个,该对象将作为地图描点
MKPointAnnotation *point = [[MKPointAnnotation alloc]init];
//设置地图锚点的坐标
point.coordinate = placemark.location.coordinate;
//设置地图锚点的标题
point.title = @"当前位置";
//设置地图锚点的副标题
point.subtitle = [NSString stringWithFormat:@"%@-%@-%@-%@",placemark.country,placemark.administrativeArea,placemark.locality,placemark.subLocality ];
//将地图锚点添加到地图上
[mapview addAnnotation:point];
//选中指定锚点
[mapview selectAnnotation:point animated:YES];
}
else
{
NSLog(@"无搜索结果");
}
}];
}
转载于:https://my.oschina.net/suyongchen/blog/636232