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

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

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

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

Q&A

1回答

255閲覧

swiftUIで高度を取得したい

_Shinamon_

総合スコア1

Swift

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

0グッド

0クリップ

投稿2024/08/13 07:43

実現したいこと

標高を取得する

前提

SwiftUIで標高を取得するアプリを作っています。

問題点

以下のソースコードを試したが、他アプリやAppleWatchのコンパスアプリでの確かめると数値が異なる
また、家の階を移動しても(1階から2階へ移動した)数値に変化が見られなかった

該当のソースコード

swiftUI

1import UIKit 2import CoreLocation 3 4class ViewController: UIViewController, CLLocationManagerDelegate { 5 6 @IBOutlet private weak var altitudeLabel: UILabel! 7 8 private let locationManager = CLLocationManager() 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 // Do any additional setup after loading the view. 13 14 locationManager.requestWhenInUseAuthorization() 15 locationManager.distanceFilter = kCLDistanceFilterNone 16 locationManager.desiredAccuracy = kCLLocationAccuracyBest 17 locationManager.startUpdatingLocation() 18 locationManager.delegate = self 19 } 20 21 22 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 23 if let lastLocation = locations.last { 24 let altitude = lastLocation.altitude 25 print(altitude) 26 altitudeLabel.text = String( altitude) 27 } 28 } 29}

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

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

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

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

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

guest

回答1

0

SwiftUIで標高を取得するアプリを作っています。
また、家の階を移動しても(1階から2階へ移動した)数値に変化が見られなかった
import UIKit

質問はSwiftUIだけどUIKitのコードが記載されていますね。
「該当のソースコード」をどのように(SwiftUIとして)確認しているのかによっても回答が変わってくるかもしれませんね・・

緯度経度の内容は情報が多いですが、標高はあまり情報がない印象ですね。
iOSシミュレーターでは確認できなそうですし・・(できるのでしたら教えてください)

ドキュメントには次のような記載もあります。
精度の問題はどうでしょうか?

More accurate location data also takes more time to become available.
After you request high-accuracy location data, your app might still get data with a lower accuracy for a period of time. During the time it takes to determine the location within the requested accuracy, the location service keeps providing the data that’s available, even though that data isn’t as accurate as your app requested. Your app receives more accurate location data as that data becomes available.
(機械翻訳)また、精度の高い位置情報データは、利用可能になるまでに時間がかかります。
高精度の位置情報データを要求した後も、アプリは一定期間、精度の低いデータを取得する可能性があります。位置情報サービスは、要求された精度内で位置を特定するのにかかる時間の間、利用可能なデータを提供し続けますが、そのデータはアプリが要求したほど正確ではありません。データが利用可能になると、アプリはより正確な位置情報を受け取ります。

desiredAccuracy | Apple Developer Documentation

verticalAccuracyプロパティから精度を確認することができるみたいですので、アプリの項目としてこのプロパティも表示してみて確認してみたらいかがでしょうか。

verticalAccuracy | Apple Developer Documentation


あまり関係ないかもしれませんが、locationManager.desiredAccuracykCLLocationAccuracyBestよりkCLLocationAccuracyBestForNavigationの方が精度が高いみたいですので(余計にバッテリーを消費するみたいですが)、こちらの値も試してみるとか?

kCLLocationAccuracyBestForNavigation | Apple Developer Documentation

追記です。

コメントありがとうございます。
その後、ドキュメントを見ていたら、高度について2種類あるみたいでしたので追記します。
一つは平均海面からの高度で、もう一つはWGS84楕円体からの高度のようです。
*下の方に測地系についての引用画像を貼り付けておきますが、後者の楕円体の方がよりシンプルに(単純に)モデル化した(より大雑把な)感じになるのかなと思います。

altitude
The altitude above mean sea level associated with a location, measured in meters.
(機械翻訳)ある場所の平均海面からの高度をメートル単位で表したもの。

altitude | Apple Developer Documentation

ellipsoidalAltitude
The altitude as a height above the World Geodetic System 1984 (WGS84) ellipsoid, measured in meters.
(機械翻訳)世界測地系1984(WGS84)楕円体からの高さで、単位はメートル。

ellipsoidalAltitude | Apple Developer Documentation

ジオイドと地球楕円体の引用です。

地球は山や谷など凹凸が存在し、このままの形状を基準とすると非常に複雑になります。そのため地球の凹凸をシンプルな形状にモデル化する必要があります。代表的な地球の形状のモデルにジオイドがあります。ジオイドは水が地球の重力や遠心力に逆らわず上を覆ったと仮定した場合の海洋面形状です。
img1
しかし、モデル化されたジオイドにも起伏が存在し、不規則な形状です。そこで、ジオイドをシンプルなモデルで単純化し地球の形に近似した回転楕円体である地球楕円体が考案されました。
img2

測地系 | ESRIジャパン座標系/空間参照 | GIS 基礎解説 | ESRIジャパン


lastLocation.verticalAccuracyプロパティも表示してみてコメントでどのような値になっているか教えてもらえると助かります。

四捨五入についての追記です。

コメントありがとうございます。
同じ結果が取得できたようで良かったです。

これを四捨五入してvarに代入することは可能でしょうか?

四捨五入はStringのイニシャライザでフォーマット文字列を指定すると良いかなと思います。
下の例は2なので小数点以下2桁まで表示される感じです。

swift

1String(format: "%.2f", altitude)

init(format:_:) | Apple Developer Documentation
fprintf

投稿2024/08/13 09:32

編集2024/08/13 14:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

_Shinamon_

2024/08/13 14:00

追記確認しました kCLLocationAccuracyBestForNavigationを使用したら標準コンパスアプリと同じ結果(正確には四捨五入すれば正しい)が出ました これを四捨五入してvarに代入することは可能でしょうか?
_Shinamon_

2024/08/13 14:33

あのあと確認したのですが、コンパスアプリで50mになっているのにアプリでは63と表示されており、やっぱりおかしいようです 四捨五入はいけました
退会済みユーザー

退会済みユーザー

2024/08/13 14:49

回答のコメントに書き込むと通知が届かないかもしれませんがコメントしますね。 > あのあと確認したのですが、コンパスアプリで50mになっているのにアプリでは63と表示されており、やっぱりおかしいようです そうなのですね。 先ほど同じ結果が取得できたとのことですので、精度の高いデータを取得するまでの時間のように思いますがいかがでしょうか。 回答にも書いた下の引用部分です。 *条件によっては精度の高いデータが取得できないこともあるかな? *常に同じ精度になる保証がないように思いました。 > (機械翻訳)また、精度の高い位置情報データは、利用可能になるまでに時間がかかります。 > 高精度の位置情報データを要求した後も、アプリは一定期間、精度の低いデータを取得する可能性があります。位置情報サービスは、要求された精度内で位置を特定するのにかかる時間の間、利用可能なデータを提供し続けますが、そのデータはアプリが要求したほど正確ではありません。データが利用可能になると、アプリはより正確な位置情報を受け取ります。 精度に関するところは`lastLocation.verticalAccuracy`プロパティの内容も確認してみた方が良さそうですので、こちらも表示してみてください。 > `lastLocation.verticalAccuracy`プロパティも表示してみてコメントでどのような値になっているか教えてもらえると助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問