MKMapViewで表示領域の東西の距離を取得する
こんにちは。ママさんエンジニアのトモヨです。
MKMapViewで表示領域の東西の距離を取得してみます。
やりたいこととしては、地図をズームインズームアウトしたときに画面に表示されている東西の距離をリアルタイムで出すことです。
使用環境
SwiftUI
Xcode13.3
Swift5
記載したコード
①MKMapViewのExtensionを作成
extension MKMapView {
// 画面上に表示されている東西の距離(m)
func regionInMeter() -> CLLocationDistance {
// region.span.latitudeDeltaはマイルなのでkmに変換する。1mile = 111km
// mで使用したいので1000をかける
return region.span.latitudeDelta * 111 * 1000
}
}
②mapViewDidChangeVisibleRegion内で取得する
import SwiftUI
import MapKit
import Combine
import UIKit
struct MapView: UIViewRepresentable {
@ObservedObject var viewModel: MapViewModel
~ 略 ~
final class Coordinator: NSObject, MKMapViewDelegate {
var parent: MapView
init(_ parent: MapView) {
self.parent = parent
}
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
guard parent.viewModel.shouldCalcDistance else { return }
parent.viewModel.shouldUpdateView = false
// MapView側に通知する
parent.viewModel.distanceSubject.send(mapView.regionInMeter() as Double)
// 取得できてるか確認
print(mapView.regionInMeter())
}
}
}
これだけです
失敗したコード
visibleMapRectを使用した場合ズームアウト→ズームインで表示領域より外の距離まで取得しているようです。
多分、画面外に残っている地図の分も計算しているような気がします。
どなたか知っている方がいらっしゃいましたらコメント欄などで教えてくださると助かります🙇🏻♀️
func regionInMeter() -> CLLocationDistance {
let eastMapPoint = MKMapPoint(x: visibleMapRect.minX, y: visibleMapRect.midY)
let westMapPoint = MKMapPoint(x: visibleMapRect.maxX, y: visibleMapRect.midY)
return eastMapPoint.distance(to: westMapPoint)
}