マップ(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以内にある別のアノテーション") } } } } }
直近の記事で MKMapRect
、MKCoordinateRegion
、MKCircle
、MKPolygon
を使って判定する方法も書いた。