xyk blog

最近は iOS 開発の記事が多めです。

マップ(MKMapView)上のある座標が円領域内に含まれるかどうかを判定する方法

検証環境:
Xcode 12
Swift 5.3

マップ(MKMapView)上のある座標が円領域内に含まれるかどうかを判定する方法。
CLCircularRegionを使うと簡単にできる。

import MapKit
// 対象の座標(CLLocationCoordinate2D)
let location = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)

// 円の中心の緯度経度(CLLocationCoordinate2D)
let center = CLLocationCoordinate2D(latitude: 35.6809591, longitude: 139.7673068)
// 半径のメートル指定
let radius: CLLocationDistance = 100
let circularRegion = CLCircularRegion(center: center, radius: radius, identifier: "identifier")
if circularRegion.contains(location) {
    // 含まれる
}

例えばマップ上に複数のアノテーションが密集していて、選択したアノテーションの半径10m以内にある別のアノテーションを検出したい場合のサンプル

extension ViewController: MKMapViewDelegate {

    // アノテーションビューの1つが選択された時に呼ばれるデリゲート
    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
        
        if let selectedCoordinate = view.annotation?.coordinate {
            for annotation in mapView.annotations where annotation.coordinate != selectedCoordinate {
                let circularRegion = CLCircularRegion(center: selectedCoordinate, radius: 10, identifier: "identifier")
                if circularRegion.contains(annotation.coordinate) {
                    print("半径10m以内にある別のアノテーション")
                }
            }
        }
    }   
}

直近の記事で MKMapRectMKCoordinateRegionMKCircleMKPolygonを使って判定する方法も書いた。

xyk.hatenablog.com

xyk.hatenablog.com