iOS添加Mapbox地图库

news/2024/11/28 3:27:51/

配置凭据

注册并导航到Account页面。你将需要:

  • 公共访问令牌:

从帐户的tokens页面,你可以复制默认的公共令牌或单击"create a token"按钮来创建新的公共令牌。

  • 带有Downloads:Read范围的秘密访问令牌:

从你帐户的tokens页面中,单击"create a token"按钮。

在创建令牌页面上,为你的令牌命名,并确保Downloads:Read范围旁边的框被选中。

单击页面底部的"create token"按钮以创建你的令牌。

你创建的令牌是一个秘密令牌,这意味着你将只有一次机会将其复制到安全的地方。

配置秘密令牌

你的秘密令牌允许你直接从Mapbox下载SDK。

要使用你的秘密令牌,你需要将其存储在主目录(而不是项目文件夹)的.netrc文件中。
为.netrc配置0600权限:

chmod 0600 ~/.netrc

要设置下载SDK所需的凭据,请将以下条目添加到你的.netrc文件中:

machine api.mapbox.com
login mapbox
password YOUR_SECRET_MAPBOX_ACCESS_TOKEN

配置公共令牌

要配置你的公共访问令牌,请打开项目的Info.plist文件,并添加一个MBXAccessToken密钥,其值是你的公共访问令牌。

添加依赖项

MapBox地图库

Mapbox Maps可以通过Swift Package Manager(SPM)使用。要使用SPM添加Mapbox Maps SDK,你需要配置你的环境以从Mapbox下载它,请确保你已将秘密令牌添加到你的.netrc文件中。

打开Xcode项目,然后转到File > Swift Packages > Add Package Dependency,输入GitHub - mapbox/mapbox-maps-ios: Interactive, thoroughly customizable maps for iOS powered by vector tiles and Metal作为URL,按Enter键拉入软件包,然后单击Add Package

在代码中可以用import MapboxMaps引入依赖包。

MapBox导航库

Mapbox Navigation SDK可以通过Swift Package Manager(SPM)使用。要使用SPM添加Mapbox Navigation SDK,你需要配置你的环境以从Mapbox下载它,请确保你已将秘密令牌添加到你的.netrc文件中。

打开Xcode项目,然后转到File > Swift Packages > Add Package Dependency,输入https://github.com/mapbox/mapbox-navigation-ios.git作为URL,按Enter键拉入软件包,然后单击Add Package

Dependency Rule设置为Up to Next Major Version,并输入2.14.0作为最小版本

选择MapboxNavigation库,如果不需要任何UI组件,则选择MapboxCoreNavigation。

在代码中可以用import MapboxNavigation引入依赖包。

隐私和权限

用户必须先授予您的应用程序权限,然后才能访问有关其位置的信息。添加下列配置到Info.plist。

向用户简要说明应用程序将如何使用其位置数据进行临时访问:

<key>NSLocationWhenInUseUsageDescription</key>
<string>Your precise location is used to calculate turn-by-turn directions, show your location on the map, and help improve the map.</string>

添加LocationAccuracyAuthorizationDescription作为NSLocationTemporaryUsageDescriptionDictionary字典的元素,为用户提供简要解释为什么应用程序中的功能需要其确切位置:

<key>NSLocationTemporaryUsageDescriptionDictionary</key>
<dict><key>LocationAccuracyAuthorizationDescription</key><string>Please enable precise location. Turn-by-turn directions only work when precise location data is available.</string>
</dict>

添加地图

import UIKit
import MapboxMapsclass MapViewController: UIViewController {internal var mapView: MapView!override public func viewDidLoad() {super.viewDidLoad()let myResourceOptions = ResourceOptions(accessToken: "your_public_access_token")let myMapInitOptions = MapInitOptions(resourceOptions: myResourceOptions)mapView = MapView(frame: view.bounds, mapInitOptions: myMapInitOptions)mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]self.view.addSubview(mapView)}
}

在地图上添加标记

let coordinate = CLLocationCoordinate2DMake(latitude, longitude)// Initialize a point annotation with a geometry ("coordinate" in this case)
var pointAnnotation = PointAnnotation(coordinate: coordinate)// Make the annotation show a red pin
pointAnnotation.image = .init(image: UIImage(named: "red_pin")!, name: "red_pin")
pointAnnotation.iconAnchor = .center
pointAnnotation.iconSize = 0.5    //icon image scale// Create the `PointAnnotationManager` which will be responsible for handling this annotation
let pointAnnotationManager = mapView.annotations.makePointAnnotationManager()// Add the annotation to the manager in order to render it on the map.
pointAnnotationManager.annotations = [pointAnnotation]

在地图上添加路线

// Define two or more geographic coordinates to connect with a line.
// Line from New York City, NY to Washington, D.C.
let lineCoordinates = [CLLocationCoordinate2DMake(40.7128, -74.0060),CLLocationCoordinate2DMake(38.9072, -77.0369)
]// Create the line annotation.
var lineAnnotation = PolylineAnnotation(lineCoordinates: lineCoordinates)
lineAnnotation.lineColor = StyleColor(.blue)// Create the `PolylineAnnotationManager` which will be responsible for handling this annotation
let lineAnnnotationManager = mapView.annotations.makePolylineAnnotationManager()// Add the annotation to the manager.
lineAnnnotationManager.annotations = [lineAnnotation]

设置相机位置

Maps SDK的相机是指用户在地图上方的观测点。

相机的位置和行为由其属性定义:

  • center:相机指向的经度和纬度。
  • bearing:地图的视觉旋转。轴承值是相机指向的指南针方向,以向用户显示哪个方向是“向上”。例如,90°的方位将地图定向,使东面朝上。
  • pitch:地图的视觉倾斜。0°的间距垂直于表面,直视地图,而60°等更大值则朝向地平线。
  • zoom:缩放级别指定相机与所查看功能的距离。在缩放级别0时,视口显示大陆和海洋。11的中间值显示城市级别的细节,在更高的缩放级别,地图开始显示建筑物和兴趣点。
  • padding:地图每个边缘的插图。影响渲染center的位置。
  • anchor:地图坐标系中关于应应用zoombearing的点。与center相互排斥。

在地图初始化时设置相机

// Define center coord, zoom, pitch, bearing
let cameraOptions = CameraOptions(center: CLLocationCoordinate2D(latitude: 40.7135, longitude: -74.0066),zoom: 15.5,bearing: -17.6,pitch: 45)
// Pass camera options to map init options
let options = MapInitOptions(cameraOptions: cameraOptions)
// Pass options when initializing the map 
mapView = MapView(frame: view.bounds, mapInitOptions: options)

地图初始化后设置相机

let coordinate = CLLocationCoordinate2DMake(latitude, longitude)
let options = CameraOptions(center: coordinate, zoom: 10)
//不带动画
mapView.mapboxMap.setCamera(to: options)
//带动画
mapView.camera.fly(to: options, duration: 3)

根据设备位置设置相机

if let locationCoordinate = self.mapView?.location.latestLocation?.coordinate {mapView.mapboxMap.setCamera(to: CameraOptions(center: locationCoordinate, zoom: 15))
}

获取道路限速

import MapboxCoreNavigation
import MapboxNavigationclass LocationManager {private let passiveLocationManager = PassiveLocationManager()private lazy var passiveLocationProvider = PassiveLocationProvider(locationManager: passiveLocationManager)init() {NotificationCenter.default.addObserver(self, selector: #selector(didUpdatePassiveLocation), name: Notification.Name.passiveLocationManagerDidUpdate, object: nil)passiveLocationProvider.startUpdatingLocation()}@objc func didUpdatePassiveLocation(_ notification: Notification) {let speedLimitObj = notification.userInfo?[PassiveLocationManager.NotificationUserInfoKey.speedLimitKey]if (speedLimitObj != nil) {let speedLimit: Measurement<UnitSpeed> = speedLimitObj! as! Measurement<UnitSpeed>print("speedLimit:", speedLimit, speedLimit.value)}}
}


http://www.ppmy.cn/news/1121410.html

相关文章

【操作系统笔记五】内存布局内存映射

虚拟内存布局 虚拟地址空间大小&#xff1a; 32位虚拟地址空间 [0 ~ 2^32 - 1] 总共4GB64位虚拟地址空间 [0 ~ 2^64 - 1] 总共16 777 216TB 不管是运行在用户态还是内核态&#xff0c;都需要使用虚拟地址&#xff0c;这是因为计算机硬件要求的&#xff0c;CPU要经过地址转换得…

为什么要用vite,用vite的原因是什么

为什么选 Vite | Vite 官方中文文档 (vitejs.dev) 在很久以前&#xff0c;javascript是没有模块化的&#xff0c;就是一个整体&#xff0c;所以为了将文件分成很小的模块文件&#xff0c;才出现“打包”这个概念之前的拆分工具像webpack,rollup等&#xff0c;因为项目越来越大…

1795_ChibiOS网络书籍阅读_实时系统的一些概念

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 不同的OS在介绍自己的机理的时候都有自己的模型或者抽象概念&#xff0c;ChibiOS也不例外。这里的几个概念需要做一个基本的理解&#xff1a; 1. 进…

分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09; 目录 分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09;分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLA…

解决方案 | 如何构建市政综合管廊安全运行监测系统?

如何构建市政综合管廊安全运行监测系统&#xff1f;WITBEE万宾城市生命线智能监测仪器&#xff0c;5年免维护设计&#xff0c;集成10多项结构与气体健康监测指标&#xff0c;毫秒级快速响应&#xff0c;时刻感知综合管廊运行态势

开源媒体浏览器Kyoo

什么是 Kyoo &#xff1f; Kyoo 是一款开源媒体浏览器&#xff0c;可让您流式传输电影、电视节目或动漫。它是 Plex、Emby 或 Jellyfin 的替代品。Kyoo 是从头开始创建的&#xff0c;它不是一个分叉。一切都将永远是免费和开源的。 软件特性&#xff1a; 管理您的电影、电视剧…

2309C++nlohmann的json数格示例

单 出向量 啊{"aa.txt"};数格 d;串 加一(串&k){静 串 o;动 ad.查找(k);如(ad.尾())中 o;串 bd[k].转储();中 b;}空 切换(串&e){打印(e);串 n至冲(e);d数格::解析(n);静 向量<串>们{"name","description","homepage"};向…

SQL中:check与 contriate语句约束的区别

check与 contriate语句约束的区别 区别1.check检查语法区别约束定位的内容 2.constraint约束语法区别约束定位的内容 3.总结 check与 contriate语句约束的区别) 区别 1.check检查 语法区别 check &#xff08;条件表达式&#xff09; 例&#xff1a; create table sc ( Ss…