iOS——定位與地圖

平時在寫項目的時候可能會遇到需要使用定位服務的地方,比如說獲取位置和導航等。因此這里我會使用OC自帶的庫以及蘋果系統的地圖來獲取定位以及顯示在地圖上。

開始前的設置

在獲取定位前,需要在項目文件的info中添加兩個關鍵字,用于向用戶請求定位服務。在請求定位服務的彈窗中會顯示我們添加的字段

<key>Privacy - Location When In Use Usage Description
<value>使用程序的時候獲取本機位置<key>Privacy - Location Always Usage Description
<value>總是獲取本機位置

在這里插入圖片描述

運行效果:
在這里插入圖片描述

獲取當前位置的經緯度

  • 在寫代碼前需要添加對應的庫以及設置相關的屬性:

#import <UIKit/UIKit.h>
// 關于定位以及地圖的庫
#import <MapKit/MKMapView.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>@interface ViewController : UIViewController<CLLocationManagerDelegate, MKMapViewDelegate>//設置一個定位管理者的屬性
@property (nonatomic, strong) CLLocationManager *locationManager;
//存儲推算出當前的地理位置信息,這個屬性用于獲取當前位置信息推算出的信息,比如有了經緯度而推算出的省、市、區等
@property (nonatomic, strong) CLGeocoder *geoCoder;//定義屬性獲取存儲到的位置信息
@property (nonatomic, retain) CLLocation *myLocation;//MKMapView是iOS中MapKit框架中的一個類,用于顯示地圖,并提供與地圖相關的交互功能
@property (nonatomic, strong) MKMapView *mapView;@end
  • 開始定位:

//開始定位
- (void)dingWei {self.locationManager = [[CLLocationManager alloc] init];//desiredAccuracy用于指定定位服務精度, kCLLocationAccuracyBest表示最高精度,這個設置的優勢是提供了最準確的位置信息,但代價是更高的能耗。其他定位精度設置,例如 kCLLocationAccuracyNearestTenMeters 或 kCLLocationAccuracyHundredMeters,它們提供了較低的精度但更節能。self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;//distanceFilter 屬性用于設置設備移動的距離,當設備移動超過這個距離時,會觸發位置更新。distanceFilter 被設置為 10.0 米。這意味著只有當設備移動超過 10.0 米時,才會觸發新的位置更新。self.locationManager.distanceFilter = 10.0f;//檢查設備的系統版本是否可以進行定位if ([CLLocationManager locationServicesEnabled]) {self.locationManager.delegate = self;//如果是,則調用 requestWhenInUseAuthorization 方法請求用戶在應用處于前臺時獲取位置信息的授權。dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{[self.locationManager requestWhenInUseAuthorization];});self.geoCoder = [[CLGeocoder alloc] init];} else {NSLog(@"ERROR");}
}

CLLocationManager其相關的屬性:

desiredAccuracy位置的精度屬性,取值有如下幾種:
kCLLocationAccuracyBest:精確度最佳
kCLLocationAccuracynearestTenMeters:精確度10m以內
kCLLocationAccuracyHundredMeters:精確度100m以內
kCLLocationAccuracyKilometer:精確度1000m以內
kCLLocationAccuracyThree:精確度3000m以內

  • 在代理方法中獲取需要的位置信息
//在代理方法中獲取需要的位置信息
//下面的方法中,locations是一個數組類型,其最后一個元素就是我們的經緯度坐標,類型為CLLocation,如果想將它設置為屬性,修飾符一定要是retain
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {NSLog(@"%lu", locations.count);self.myLocation = locations.lastObject;NSLog(@"經度: %f, 緯度: %f", self.myLocation.coordinate.longitude, self.myLocation.coordinate.latitude);// 獲取到位置后再進行反地理編碼[self reverseGeocodeLocation:self.myLocation];
}- (void)reverseGeocodeLocation:(CLLocation *)location {[self.geoCoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {if (placemarks.count > 0) {CLPlacemark *placemark = [placemarks objectAtIndex:0];NSLog(@"%@", placemark.name);NSString *city = placemark.locality;if (!city) {city = placemark.administrativeArea;}NSLog(@"位置名:%@", placemark.name);NSLog(@"街道:%@", placemark.thoroughfare);NSLog(@"子街道:%@", placemark.subThoroughfare);NSLog(@"市:%@", placemark.locality);NSLog(@"區:%@", placemark.subLocality);NSLog(@"國家:%@", placemark.country);// 在這里調用顯示地圖的方法[self showLocationOnMapWithLatitude:location.coordinate.latitude longitude:location.coordinate.longitude];}}];
}
  • 改變定位權限

// 在此回調中處理定位權限的改變
- (void)locationManagerDidChangeAuthorization:(CLLocationManager *)manager {CLAuthorizationStatus status = manager.authorizationStatus;dispatch_async(dispatch_get_main_queue(), ^{if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways) {// 在這里執行需要權限的操作,例如啟動定位服務//設置允許在應用在后臺運行時繼續獲取位置更新self.locationManager.allowsBackgroundLocationUpdates = NO;//開始獲取設備的當前位置信息[self.locationManager startUpdatingLocation];self.geoCoder = [[CLGeocoder alloc] init];[self jiSuanDistance];self.mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];self.mapView.delegate = self;[self.view addSubview:self.mapView];} else {NSLog(@"ERROR");}});
}
  • 獲取定位出錯時調用如下方法:

//獲取位置出錯的時候調用下面的協議方法
- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {if (error) {NSLog(@"ERROR");}
}

運行結果:
在這里插入圖片描述

測算兩個經緯度之間的距離


//測算兩個經緯度坐標之間的距離
- (void) jiSuanDistance {CLLocation *before = [[CLLocation alloc] initWithLatitude:11.111 longitude:222.222];CLLocationDistance meters = [self.myLocation distanceFromLocation:before];NSLog(@"相距: %f米", meters);
}

運行結果:
在這里插入圖片描述

將位置定位在地圖上

這里使用的是蘋果自帶的地圖


- (void)showLocationOnMapWithLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude {//創建坐標點CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);//以指定的坐標為中心,設置地圖顯示范圍。這里的參數 1000 表示地圖的緯度和經度跨度都為 1000 米。MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(coordinate, 1000, 1000);//調整地圖顯示區域,region 是一個 MKCoordinateRegion 結構體,表示地圖的中心點和跨度,這里 region 代表指定的坐標點為中心[self.mapView setRegion:region animated:YES];// 添加標注//MKPointAnnotation是 MapKit 框架中的一部分,用于表示地圖上的點標注MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];//將coordinate屬性設置為當前經緯度坐標annotation.coordinate = coordinate;//為地圖添加標記[self.mapView addAnnotation:annotation];
}

運行結果:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209975.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209975.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始的C++(二十一)

C11 1.列表初始化&#xff1a; //允許以下代碼正確運行int a[]{1,2,3};//效果與int a[]{1,2,3}一致 即允許省略等于號。同時&#xff0c;允許用花括號對所有自定義類型和內置類型進行初始化&#xff0c;而非以前花括號只能對數組進行初始化。利用花括號對自定義類型初始化時…

LeetCode刷題--- 求根節點到葉節點數字之和

個人主頁&#xff1a;元清加油_【C】,【C語言】,【數據結構與算法】-CSDN博客 個人專欄&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;這個專欄主要講述遞歸遞歸、搜索與回溯算法&#xff0c;所以下面題目主要也是這些算法做的 我講述…

【ITK庫學習】使用itk庫進行圖像濾波ImageFilter:鄰域濾波

目錄 1、itkMeanImageFilter 均值濾波器2、itkMedianImageFilter 中值濾波器3、itkBinaryMedianImageFilter 二值中值濾波器4、擴展itkNeighborhood5、擴展itkNeighborhoodIterator6、擴展itkNeighborhoodOperator 領域濾波是一種信號處理方法&#xff0c;用于去除信號中的噪聲…

★560. 和為 K 的子數組(自己做出來了)

560. 和為 K 的子數組 前綴和的知識。 如果要求i~j下標之間的元素和&#xff0c;用前綴和的話&#xff0c;應該是b[j] - b[i-1]&#xff0c;i處的值也應該包括。 所以這個題&#xff0c;前綴和數組就要比原數組整體向后平移一個單元格&#xff0c;不然在求0~n的和的時候沒法取…

在python中安裝庫,會有conda安裝,也會有pip安裝,conda與pip的區別是什么?

文章目錄 一、Conda是什么&#xff1f;二、pip是什么&#xff1f;三、pip與conda的區別&#xff1a;總結 一、Conda是什么&#xff1f; Conda是一個開源的包管理系統&#xff0c;它是Anaconda公司為Python和其他編程語言開發的。它主要用于數據科學和機器學習領域&#xff0c;…

【Vue】日常錯誤總結(持續更新)

日常遇到的小問題匯總, 內容小篇幅少的就全放這里了, 內容多的會在Vue專欄單獨分享~ 目錄 【Q】 el-form-item值為 null 或 undefined顯示““ 【Q】dialog內組件數據刷新總是延遲慢一拍 問題背景描述 解決方案 代碼簡單模擬 JS 【Q】el-input 不能輸入的解決辦法 方法…

Educational Codeforces Round 156 (Rated for Div. 2)補題

Sum of Three 題目大意&#xff1a;將一個正整數n分成3個不同的正整數x,y,z,保證三個數都不能整除3&#xff0c;如果無法實現就輸出NO. 思路&#xff1a;這個題實際上特別簡單&#xff0c;我們可以發現當n比較大的時候&#xff0c;我們可以從中取1&#xff0c;然后第二個數也…

【Java】Java環境以及EditPlus編輯器安裝與配置流程

要安裝和配置Java環境以及EditPlus編輯器&#xff0c;請按照以下步驟操作&#xff1a; ### 安裝Java Development Kit (JDK) 1. 訪問Java官方網站下載最新版本的JDK。 2. 運行下載的JDK安裝程序&#xff0c;并按照提示完成安裝。 3. 安裝完成后&#xff0c;記下JDK的安裝路徑&a…

perf與火焰圖-性能分析工具

參考鏈接 perf性能分析工具使用分享 如何讀懂火焰圖&#xff1f;-阮一峰 perf基本用法-record,report-知乎 火焰圖抓取 準備&#xff1a; centos安裝perf工具 dnf install perf下載火焰圖解析代碼 git clone https://github.com/brendangregg/FlameGraph.git抓取指定進程…

Orcal數據庫Schema理解、表分區理解

目錄 1 Schema1.1 Orcal數據庫示例1.2 MySQL數據庫示例 2 Orcal表分區2.1 創建表分區2.2 查看表分區2.3 查看指定分區數據 此前未了解過Schema的概念&#xff0c;僅知道Orcal數據庫比較側重這個概念&#xff0c;搜遍全網都&#xff0c;都是啰哩吧嗦的搬抄定義&#xff0c;特此在…

LeetCode算法題解(單調棧)|LeetCode503. 下一個更大元素 II、LeetCode42. 接雨水

一、LeetCode503. 下一個更大元素 II 題目鏈接&#xff1a;503. 下一個更大元素 II 題目描述&#xff1a; 給定一個循環數組 nums &#xff08; nums[nums.length - 1] 的下一個元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每個元素的 下一個更大元素 。 數字 x 的…

LIMoE:使用MoE學習多個模態

文章鏈接&#xff1a;Multimodal Contrastive Learning with LIMoE: the Language-Image Mixture of Experts 發表期刊&#xff08;會議&#xff09;: NeurIPS 2022 目錄 1.背景介紹稀疏模型 2.內容摘要Sparse Mixture-of-Experts ModelsContrastive LearningExperiment Analy…

Kubernetes入門筆記 ——(3)理解pod對象

為什么需要pod 最為熟知的一句話&#xff1a;pod是k8s的最小調度單位。剛開始聽到這句話時會想&#xff0c;已經有容器了&#xff0c;k8s為什么還要搞個pod出來&#xff1f;容器和pod是什么關系&#xff1f;容器的本質是進程&#xff0c;而k8s本質上類似操作系統。 熟悉Linux的…

SpringBoot系列之啟動成功后執行業務的方法歸納

SpringBoot系列之啟動成功后執行業務邏輯。在Springboot項目中經常會遇到需要在項目啟動成功后&#xff0c;加一些業務邏輯的&#xff0c;比如緩存的預處理&#xff0c;配置參數的加載等等場景&#xff0c;下面給出一些常有的方法 實驗環境 JDK 1.8SpringBoot 2.2.1Maven 3.2…

python dataframe 列中 字符串( ‘2815512706605‘)過大 轉不了float 用Decimal

from decimal import Decimaldf["accFillSz"] df["accFillSz"].apply(lambda x: Decimal(x)) 2815512706605這個值超出了Python中float類型的最大表示范圍,無法直接轉換為浮點數。 Python中float類型使用IEEE 754標準的64位雙精度浮點數表示,最大值大約為…

歐拉回路歐拉路【詳解】

1.引入 2.概念 3.解決方法 4.例題 5.回顧 1.引入 經典的七橋問題 哥尼斯堡是位于普累格河上的一座城市&#xff0c;它包含兩個島嶼及連接它們的七座橋&#xff0c;如下圖所示。 可否走過這樣的七座橋&#xff0c;而且每橋只走過一次&#xff1f; 你怎樣證明&#xff1f;…

【Linux top命令】

文章目錄 深入了解Linux top命令&#xff1a;實時監控系統性能1. 什么是top命令&#xff1f;2. 使用top命令3. top命令交互操作 深入了解Linux top命令&#xff1a;實時監控系統性能 1. 什么是top命令&#xff1f; top命令是一個用于實時監控系統性能的文本界面工具。它顯示當…

Linux上使用獨立顯卡Tesla T4(測試視頻壓縮)

背景 將視頻處理程序單獨部署至K8S之外&#xff0c;使用獨立GPU顯卡的一臺服務器上。 需事先對GPU性能做簡單測試。 已通過zabbix對Linux進行了系統資源監控。 已通過PrometheusGrafana對顯卡Tesla T4做了性能監控。 逐步補充&#xff0c;稍等 2023年12月6日 操作 查看當前…

鴻蒙Harmony開發初探

一、背景 9月25日華為秋季全場景新品發布會&#xff0c;余承東宣布鴻蒙HarmonyOS NEXT蓄勢待發&#xff0c;不再支持安卓應用。網易有道、同程旅行、美團、國航、阿里等公司先后宣布啟動鴻蒙原生應用開發工作。 二、鴻蒙Next介紹 HarmonyOS是一款面向萬物互聯&#xff0c;全…

[Linux] 基于LAMP架構安裝論壇

一、安裝Discuz論壇 1.1 創建數據庫&#xff0c;并進行授權 mysql -u root -p123CREATE DATABASE bbs; #創建一個數據庫GRANT all ON bbs.* TO bbsuser% IDENTIFIED BY admin123; #把bbs數據庫里面所有表的權限授予給bbsuser,并設置密碼admin123flush privileges; #刷新數據庫…