緯度・経度から高度を取得する
最近は、GPSを使って緯度・経度をかなり正確に取得できるようになりました。そして高度も取得できますが、こちらは今一つ正確性に欠けます。確かに昔から見たら正確になったのですが、状況によってはズレすぎの時もあります。
また、気圧高度計はブレが少ないですが、最初に高度調整が必要なことと、気圧が時間によって大きく変わる日には、やはりズレてしまいます。
そこで、緯度・経度に対する高度情報を内部に持った地図アプリケーションもいいけれど、他に何かないかを探してみると、国土地理院のサービスにありました。
試験公開ですけれど、国土地理院のサーバーにアクセスして高度情報を取得します。サーバーをアクセスするので、アクセスを最小限にする必要がありますが、精度が高ければ使えそうです。そこで、非公開のアプリケーションに組み込んでみました。
1.Http通信
サーバーにアクセスする必要があるので、Http通信のプログラムを組みます。以下の記事を参考にさせて頂きました。
今回のロジックは参考記事に準拠しておりますが、こちらでもソースを載せます。
2.build.gradle
dependenciesで、http通信のライブラリを指定します。
implementation 'com.squareup.okhttp3:okhttp:4.0.0-alpha02’
3.Http通信専用関数を作る
Http通信は非同期で動かす必要があるので、専用関数を用意します。呼び出し元には、標高を保持する文字列変数「mAltitude」と、画面描画をする関数「myDraw」があることを念頭に置いてください。
public void GetGSIAltitude(String url) throws IOException {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request)
.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
mAltitude = "EEEEEE" ;
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
final String jsonStr = response.body().string();
try{
JSONObject json = new JSONObject(jsonStr);
final String wAltitude = json.getString("elevation"); // outputパラメータ指定
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() {
@Override
public void run() {
// ここで、標高を画面表示する
mAltitude = wAltitude ;
myDraw() ;
}
});
}catch(Exception e){
mAltitude = "EEEEE2" ;
}
}
});
}
4.動作結果
このように、高度の取得ができました。なかなか正確ではないでしょうか。
今回の仕組みは非常に有用ですが、国土地理院のサーバーにアクセスするので、常に高度を取得するわけにはいきません。また、アプリケーション側も非同期を連発するのは良くありません。
そのため、今回の仕組みは正確な高度を知りたい時だけに使うと良いでしょう。そして、気圧高度計、GPS高度と併用して使うと、高度の取得が充実するでしょう。
※テストで使ったアプリケーション「北海道周辺マップ」は、非公開で、公開の予定もありません。