iOS 原生地图定位,视图中心加大头针,地理位置返编码

2023-11-01 00:08

本文主要是介绍iOS 原生地图定位,视图中心加大头针,地理位置返编码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

info.plist  按需配置
模拟器 地理位置在国外的地理位置返编码没有办法获取

Privacy - Location Always and When In Use Usage Description
Privacy - Location Always Usage Description
Privacy - Location When In Use Usage Description

.h

#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGINtypedef void(^BackBlock)(double lat,double lot,NSString *city);@interface MapVC : UIViewController@property(nonatomic,copy)BackBlock backBlock;@endNS_ASSUME_NONNULL_END

.m

#import "MapVC.h"
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
@interface MapVC ()
<
CLLocationManagerDelegate,
MKMapViewDelegate
>
@property(nonatomic,strong)MKMapView *mapView;
/// 定位管理器
@property(nonatomic,strong)CLLocationManager *locationManager;
/// 移动后的位置标记
@property(nonatomic,strong)CLPlacemark *place;/ 放大缩小用
//@property (nonatomic) MKCoordinateRegion region;
@end@implementation MapVC- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.[self.view addSubview:self.mapView];[self.locationManager startUpdatingLocation];
}-(void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];if (self.backBlock){self.backBlock(self.place.location.coordinate.latitude, self.place.location.coordinate.longitude,self.place.name);}
}#pragma mark ————————— 地图位置更新 —————————————
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{MKCoordinateRegion region;CLLocationCoordinate2D centerCoordinate = mapView.region.center;region.center = centerCoordinate;NSLog(@" 经纬度 %f,%f",centerCoordinate.latitude, centerCoordinate.longitude);CLLocation *location = [[CLLocation alloc]initWithLatitude:centerCoordinate.latitude longitude:centerCoordinate.longitude];[self cityNameFromLoaction:location block:^(CLPlacemark *place, NSString *city) {}];}#pragma mark-CLLocationManagerDelegate
/**
*  更新到位置之后调用
*
*  @param manager   位置管理者
*  @param locations 位置数组
*/
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:( NSArray *)locations
{NSLog(@"定位到了");//停止位置更新[manager stopUpdatingLocation];CLLocation *location = [locations firstObject];//位置更新后的经纬度CLLocationCoordinate2D theCoordinate =  location.coordinate;//设置地图显示的中心及范围MKCoordinateRegion theRegion;theRegion.center = theCoordinate;// 坐标跨度MKCoordinateSpan theSpan;theSpan.latitudeDelta = 0.01;theSpan.longitudeDelta = 0.01;theRegion.span = theSpan;[self.mapView setRegion:theRegion];[self cityNameFromLoaction:location block:^(CLPlacemark *place, NSString *city) {NSLog(@"位置:%@", place.name);}];
}#pragma mark ————————— 地理位置返编码 —————————————
-(void)cityNameFromLoaction:(CLLocation *)location block:(void(^)(CLPlacemark *place ,NSString *city))block
{__weak typeof(self) weakSelf = self;CLGeocoder *geocoder = [[CLGeocoder alloc]init];[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {if (!error){for (CLPlacemark *place in placemarks){weakSelf.place = place;NSString *city = place.name;// 设置地图显示的类型及根据范围进行显示  安放大头针[weakSelf addPointFromCoordinate:place.location.coordinate title:city];block(place ,place.name);}}else{NSLog(@"%@",error);}}];
}#pragma mark ————————— 长按添加大头针事件 —————————————
- ( void )lpgrClick:( UILongPressGestureRecognizer *)lpgr
{// 判断只在长按的起始点下落大头针if (lpgr.state == UIGestureRecognizerStateBegan ){// 首先获取点CGPoint point = [lpgr locationInView:self.mapView];// 将一个点转化为经纬度坐标CLLocationCoordinate2D center = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];[self addPointFromCoordinate:center title:@"位置"];}
}#pragma mark ————————— 添加大头针 —————————————
-(void)addPointFromCoordinate:(CLLocationCoordinate2D)coordinatetitle:(NSString *)title
{NSLog(@"当前城市:%@" ,title);self.title = title;MKPointAnnotation *pinAnnotation = [[MKPointAnnotation alloc] init];pinAnnotation.coordinate = coordinate;pinAnnotation.title = title;[self.mapView removeAnnotations:self.mapView.annotations];[self.mapView addAnnotation:pinAnnotation];
}/***  授权状态发生改变时调用**  @param manager 位置管理者*  @param status  状态*/
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{switch (status) {// 用户还未决定case kCLAuthorizationStatusNotDetermined:{NSLog(@"用户还未决定");break;}// 问受限case kCLAuthorizationStatusRestricted:{NSLog(@"访问受限");break;}// 定位关闭时和对此APP授权为never时调用case kCLAuthorizationStatusDenied:{// 定位是否可用(是否支持定位或者定位是否开启)if([CLLocationManager locationServicesEnabled]){NSLog(@"定位开启,但被拒");}else{NSLog(@"定位关闭,不可用");}break;}// 获取前后台定位授权case kCLAuthorizationStatusAuthorizedAlways:{//  case kCLAuthorizationStatusAuthorized: // 失效,不建议使用NSLog(@"获取前后台定位授权");break;}// 获得前台定位授权case kCLAuthorizationStatusAuthorizedWhenInUse:{NSLog(@"获得前台定位授权");break;}default:break;}
}//获取当前位置
-(CLLocationManager *)locationManager
{if (!_locationManager){CLLocationManager * locationManager = [[CLLocationManager alloc] init];locationManager.delegate = self ;//kCLLocationAccuracyBest:设备使用电池供电时候最高的精度locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;locationManager.distanceFilter = 50.0f;if (([[[ UIDevice currentDevice] systemVersion] doubleValue] >= 8.0)){[locationManager requestAlwaysAuthorization];}_locationManager = locationManager;}return _locationManager;
}-(MKMapView *)mapView
{if (!_mapView){MKMapView *mapView = [[MKMapView alloc]init];// 接受代理mapView.delegate = self;mapView = [[MKMapView alloc]initWithFrame:self.view.bounds];mapView.zoomEnabled = YES ;mapView.showsUserLocation = YES ;mapView.scrollEnabled = YES ;mapView.delegate = self ;// 长按手势  长按添加大头针UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]initWithTarget:self action: @selector (lpgrClick:)];[mapView addGestureRecognizer:lpgr];_mapView = mapView;}return _mapView;
}#pragma mark ————————— 放大事件 —————————————
- (void)addAct
{
//    CLLocationCoordinate2D centCoor = _region.center;
//    MKCoordinateSpan span = _region.span;
//    span.latitudeDelta *= 2;
//    span.longitudeDelta *= 2;
//    MKCoordinateRegion region = MKCoordinateRegionMake(centCoor, span);
//    [self.mapView setRegion:region];
}#pragma mark ————————— 缩小事件—————————————
- (void)minAct
{
//    CLLocationCoordinate2D centCoor = _region.center;
//    MKCoordinateSpan span = _region.span;
//    span.latitudeDelta *= 0.5;
//    span.longitudeDelta *= 0.5;
//    MKCoordinateRegion region = MKCoordinateRegionMake(centCoor, span);
//    [self.mapView setRegion:region];
}-(void)dealloc{NSLog(@"");
}
/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end

调用

#import "MapVC.h"MapVC *vc = [[MapVC alloc]init];__weak typeof(self) weakSelf = self;vc.backBlock = ^(double lat, double lot, NSString * _Nonnull city) {DLog(@"%.15f = %.15f",lat,lot);weakSelf.lot = lot;weakSelf.lat = lat;weakSelf.title = city;};[self.navigationController pushViewController:vc animated:YES];

 

这篇关于iOS 原生地图定位,视图中心加大头针,地理位置返编码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/319061

相关文章

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

使用Folium在Python中进行地图可视化的操作指南

《使用Folium在Python中进行地图可视化的操作指南》在数据分析和可视化领域,地图可视化是一项非常重要的技能,它能够帮助我们更直观地理解和展示地理空间数据,Folium是一个基于Python的地... 目录引言一、Folium简介与安装1. Folium简介2. 安装Folium二、基础使用1. 创建

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与