質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

2354閲覧

地図上で現在範囲内にいるかを判断したい

perrito_20

総合スコア2

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2020/07/16 04:57

【環境】
OS:iOS
言語:Swift

【実現したいこと】
自作アプリで現在地の緯度・経度を取得し、ある地点からの範囲内にいるかどうかを
判断したいと考えています。

現在地の緯度・経度と、ある1地点との距離は算出できたので
半径XXXm以内に存在しているどうかは判断出来ました。
しかし、長方形や正方形などの4地点の緯度・経度で囲われた範囲内に
いるかどうかを判断したい場合のロジックが思いつかない状況です。

A・B・C・D地点それぞれと現在地の方位角を求めて角度を判断してはどうかと
考えてみましたが、いい方法だとは言えずでして
何かヒントになるようなアドバイスを頂けないでしょうか。

※イメージ図
A・B・C・D地点を頂点とする四角形で
●地点は範囲内、◇地点は範囲外と判断したい

A地点       B地点
┌─────────────┐
│ │
│ │
│ ● │◇
│ │
│ │
└─────────────┘
C地点       D地点

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoorwm

2020/07/16 06:01

緯度経度だと無理ですね。球体に円を書いた後に、一か所点を打ってみたとして、その点が外か内か?と考えてみてください。 まずは、投影法を考えてみると良いかと思います。
perrito_20

2020/07/16 11:10

TsukubaDepot様、yoorwm様 ご回答ありがとうございます。 >TsukubaDepot様 内容を見る限り、まさに私のやりたいことでした。 最新のバージョンで同様のことが実現できないか考えてみます。 >yoorwm なるほど、球体に円を書いて、点を打った場合はその点は内か外か判断できないですね。 投影法・・・調べてみます。
guest

回答2

0

ベストアンサー

出典は StackOverflow の質疑

ですが、Swift5 のメソッドに書き換えれば簡単に計算できるようです。

MKMapRect()で領域を作り、contains()で判定するだけで領域内外を判定できました。

Returns a Boolean value indicating whether the specified map point lies within the rectangle.

Swift

1 // 領域の左上、右下 2 var leftUpCoordinate: CLLocationCoordinate2D 3 var rightDownCoordinate: CLLocationCoordinate2D 4 5 // 現在地 6 var myLocation:CLLocationCoordinate2D 7 8 let topLeftPoint = MKMapPoint(leftUpCoordinate) 9 let bottomRightPoint = MKMapPoint(rightDownCoordinate) 10 let mapRect = MKMapRect(x: topLeftPoint.x, y: topLeftPoint.y, width: bottomRightPoint.x - topLeftPoint.x, height: bottomRightPoint.y - topLeftPoint.y) 11 let targetPoint = MKMapPoint(myLocation) 12 13 // 判定結果が Bool 値で表示される 14 let isInside = mapRect.contains(targetPoint)

ただし、上記の計算方法だと赤道近辺、グリニッジ子午線近辺だと当然問題が発生ますので、条件分けするなどの検討は必要かと思います。

投稿2020/07/16 21:15

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

perrito_20

2020/07/16 21:33

TsukubaDepot様 ソースまでアップしていただきありがとうございます。 試させていただきます。
guest

0

ある点が多角形の内側にいるかの判定は下記のページに解説があります。
https://www.nttpc.co.jp/technology/number_algorithm.html

少なくとも日本国内で、平面座標に近似できるような小さいエリアであればそのまま使えます。
(数キロぐらいのエリアでは気にならないレベルかと。県とかのサイズになるとズレは大きくなります。)
子午線をまたぐ場合と大円に近い場合の取り扱いは考える必要があります。

投稿2020/07/16 13:00

編集2020/07/16 13:06
Kaleidoscope

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

perrito_20

2020/07/16 13:14

Kaleidoscope様 ご回答ありがとうございます。 非常に詳細に書かれているサイトですね。 参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問