見出し画像

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)
}

いいなと思ったら応援しよう!