質問: 【環境】 OS:iOS 言語:Swift 【実現したいこと】 自作アプリで現在地の緯度・経度を取得し、ある地点からの範囲内にいるかどうかを 判断したいと考えています。 現在地の緯度・経度と、ある1地点との距離は算出できたので 半径XXXm以内に存在しているどうかは判断出来ました。 しかし、長方形や正方形などの4地点の緯度・経度で囲われた範囲内に いるかどうかを判断したい場合のロジックが思いつかない状況です。 A・B・C・D地点それぞれと現在地の方位角を求めて角度を判断してはどうかと 考えてみましたが、いい方法だとは言えずでして 何かヒントになるようなアドバイスを頂けないでしょうか。 ※イメージ図 A・B・C・D地点を頂点とする四角形で ●地点は範囲内、◇地点は範囲外と判断したい A地点 B地点 ┌─────────────┐ │ │ │ │ │ ● │◇ │ │ │ │ └─────────────┘ C地点 D地点
回答: 出典は StackOverflow の質疑 * ios: lat/long within rectangle ですが、Swift5 のメソッドに書き換えれば簡単に計算できるようです。 `MKMapRect()`で領域を作り、`contains()`で判定するだけで領域内外を判定できました。 * contains(_:) > > Returns a Boolean value indicating whether the specified map point lies within the rectangle. > > > ``` // 領域の左上、右下 var leftUpCoordinate: CLLocationCoordinate2D var rightDownCoordinate: CLLocationCoordinate2D // 現在地 var myLocation:CLLocationCoordinate2D let topLeftPoint = MKMapPoint(leftUpCoordinate) let bottomRightPoint = MKMapPoint(rightDownCoordinate) let mapRect = MKMapRect(x: topLeftPoint.x, y: topLeftPoint.y, width: bottomRightPoint.x - topLeftPoint.x, height: bottomRightPoint.y - topLeftPoint.y) let targetPoint = MKMapPoint(myLocation) // 判定結果が Bool 値で表示される let isInside = mapRect.contains(targetPoint) ``` ただし、上記の計算方法だと赤道近辺、グリニッジ子午線近辺だと当然問題が発生ますので、条件分けするなどの検討は必要かと思います。