Mapbox Annotation
種類
# | 意味 | クラス | 想定用途 |
---|---|---|---|
1 | 画像のピン | PointAnnotation | 基本はこれか |
2 | 円形のピン | CircleAnnotation | 色分けだけしたいときに便利そう |
3 | 線 | PolylineAnnotation | 経路表示などに使おう |
- ポリゴンもあるが、省略。市区町村のハイライトに良さそうか
- View Annotation は、別ファイルにする (TODO)
- Style Layers についても、別ファイルで試そう (TODO)
試して分かったこと
- Assets.xcassets に登録した画像であれば簡単
- SF Symbols などを使って動的に読み込んだ画像は、煩雑 (うまくいってないので記載も省略)
準備
サンプルの dest-pin.pdf
を、Assets.xcassets
に追加
- ピン画像のサンプル : https://docs.mapbox.com/ios/files/dest-pin.pdf
サンプル (UIKit)
ポイント
swift
let pointAnnotationManager = mapView.annotations.makePointAnnotationManager()
pointAnnotationManager.annotations = [pointAnnotation]
全文
ViewController.swift
import UIKit
import MapboxMaps
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let mapView = MapView(frame: view.bounds)
// スタイルの設定
mapView.mapboxMap.mapStyle = MapStyle(uri: StyleURI(rawValue: "mapbox://styles/mapbox/standard")!)
// カメラの設定
let center = CLLocationCoordinate2D(latitude: 35.6598, longitude: 139.702389)
let cameraOptions = CameraOptions(center: center, zoom: 13, bearing: 0, pitch: 0)
mapView.mapboxMap.setCamera(to: cameraOptions)
// リサイズ用の設定
mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
let coord = CLLocationCoordinate2D(latitude: 35.6572747, longitude: 139.6910424)
view.addSubview(mapView)
// ★1. 画像ピンの設定
let coord1 = CLLocationCoordinate2D(latitude: 35.65746215456105, longitude: 139.69363342539)
var pointAnnotation = PointAnnotation(coordinate: coord1)
pointAnnotation.image = .init(image: UIImage(named: "dest-pin")!, name: "dest-pin")
pointAnnotation.tapHandler = { context in // ★4. タップのイベントハンドラ登録
print("tapped point annotation at \(context.coordinate)")
return true //
}
let pointAnnotationManager = mapView.annotations.makePointAnnotationManager()
pointAnnotationManager.annotations = [pointAnnotation]
// ★2. 円形ピンの設定
let coord2 = CLLocationCoordinate2DMake(35.666154428709845, 139.7121950099489)
var circleAnnotation = CircleAnnotation(centerCoordinate: coord2)
circleAnnotation.circleColor = StyleColor(.blue)
circleAnnotation.circleRadius = 15
let circleAnnotationManager = mapView.annotations.makeCircleAnnotationManager()
circleAnnotationManager.annotations = [circleAnnotation]
// ★3. 線の設定
let coords = [coord1, coord2]
var lineAnnotation = PolylineAnnotation(lineCoordinates: coords)
lineAnnotation.lineColor = StyleColor(.green)
lineAnnotation.lineWidth = 5
let lineAnnotationManager = mapView.annotations.makePolylineAnnotationManager()
lineAnnotationManager.annotations = [lineAnnotation]
}
}
サンプル (SwiftUI)
ポイント
Map { ... }
内で設定する必要あり
全文
swift
import SwiftUI
import MapboxMaps
struct ContentView: View {
var body: some View {
// スタイルの設定
let mapStyle = MapStyle(uri: StyleURI(rawValue: "mapbox://styles/mapbox/standard")!)
// カメラの設定
let center = CLLocationCoordinate2D(latitude: 35.6598, longitude: 139.702389)
let camera = Viewport.camera(center: center, zoom: 13, bearing: 0, pitch: 0)
Map(initialViewport: camera) {
// ★1. 画像ピン設定
let coord1 = CLLocationCoordinate2D(latitude: 35.6572747, longitude: 139.6910424)
PointAnnotation(coordinate: coord1)
.image(.init(image: UIImage(named: "dest-pin")!, name: "dest-pin"))
.onTapGesture { context in // ★4. タップのイベントハンドラ登録
print("Tapped at \(context.coordinate)")
return true
}
// ★2. 円形ピン設定
let coord2 = CLLocationCoordinate2DMake(35.666154428709845, 139.7121950099489)
CircleAnnotation(centerCoordinate: coord2)
.circleColor(.red)
.circleRadius(15)
// ★3. 線の設定
let coords = [coord1, coord2]
PolylineAnnotation(lineCoordinates: coords)
.lineColor(.green)
.lineWidth(5)
}
.mapStyle(mapStyle)
.ignoresSafeArea()
}
}