参考:认识 SwiftUI 版 MapKit
Camera 两种初始化的方式
1 2 3 4 5 6 7 8 9 10 11
| @State private var position = MapCameraPosition.region( MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 28.209195, longitude: 112.842627), latitudinalMeters: 300, longitudinalMeters: 300) )
var body: some View { Map(position: $position) { ... } }
|
上面两种初始化 Camera 的方式是一样的。
地理坐标与墨卡托投影坐标转换
1 2 3 4 5 6 7 8 9
| let coordinate = CLLocationCoordinate2D(latitude: 28.209321, longitude: 112.843033) let point: MKMapPoint = MKMapPoint(Coordinate) print(point.x) print(point.y)
let point = MKMapPoint(x: 218359192.2732601, y: 112278796.05034925) let coordinate = point.coordinate
|
将 iOS 系统自带定位坐标转换成高德坐标
swift Coordinate
系统定位拿到的坐标是 WGS-84 国际标准。
但是在 Map 显示时,因为 iPhone 使用的是高德地图,所以会有偏移,需要把坐标转换为 GCJ-02 火星坐标。
MapControls
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| Map() {
} .mapControls({ MapCompass() #if os(watchOS) MapLocationCompass() #endif #if os(macOS) MapPitchSlider() MapZoomStepper() #endif MapPitchToggle()
MapScaleView(anchorEdge: .trailing)
MapUserLocationButton() })
|
MapStyle
MapStyle
有预先配置好的地图样式可以选择,如果没有特别要求,基本可以满足。
.standard
: 标准样式
.imagery
: 基于图像的风格,如使用卫星图像的风格。
.hybrid
: 混合风格,例如使用一个地区的卫星图像,并在其上添加道路和路名信息层。
其次我们可以添加额外配置,控制是否渲染高度(2D, 3D切换)、地图强调风格,显示兴趣点和显示交通情况等。
1 2 3 4 5 6 7 8 9
| Map() {
} .mapStyle( MapStyle.standard( elevation: .flat, emphasis: .muted, pointsOfInterest: PointOfInterestCategories(arrayLiteral: .publicTransport), showsTraffic: true))
|
关于 pointsOfInterest
:
1 2
| .mapStyle(.standard(pointsOfInterest: .excludingAll)) .mapStyle(.standard(pointsOfInterest: .including([.cafe])))
|
地图交互
Map
地图上的交互主要通过配置interactionModes
进行设置,有下面几种类型:
.all
: 允许所有的交互类型
.pin
: 允许用户平移到地图的不同区域
.zoom
: 允许用户放大或缩小地图位置
.pitch
: 允许用户设置地图的间距,从不同的角度查看地图
.rotate
: 允许用户对地图进行旋转操作
1 2 3 4
| Map( ... interactionModes: [.pitch, .pin], ...){}
|
一个 MapKit 没有的功能
iOS 17, SwiftUI MapKit. Has anyone solved for smooth animation of custom annotations?
SwiftUI Map Annotation Coordinate Animation
Map 上的控件在移动时,做不到像 UserAnnotation()
那样顺滑,好像是 withAnimation()
不会生效。