地图定位

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全评估测试题大模型安全评估测试题关键词库生成内容测试题库应拒答测试题库非拒答测试题大模型安全
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值