#記事一覧
Swift MkMapViewで地図アプリ作成してみた(記事一覧)
#国土地理院のサーバ
国土地理院に、標高を取得するWebAPI が公開されています。
使用方法は上記のリンクを参照してください。
###使用例
ブラウザで上記のURLにアクセスしてみてください。
{"elevation":25.3,"hsrc":"5m\uff08\u30ec\u30fc\u30b6\uff09"}
上記の情報が表示されるWebページが表示されます。
elevationが標高ですので、指定した位置は標高25.3mとなります。
#国土地理院からロングタップした位置の標高を取得する
-
URLを生成する
ロングタップした位置にピンを立て距離を表示するで設定したピンの標高を取得するURLを生成する。
ViewController.swift:URLを生成する// 国土地理院のURL let baseUrl = "https://cyberjapandata2.gsi.go.jp/general/dem/scripts/getelevation.php?" // ロングタップ地点でクエリを設定する let lonUrl = "&lon=" + pointAno.coordinate.longitude.description let latUrl = "&lat=" + pointAno.coordinate.latitude.description // アウトプット形式をJSONに設定する let outtypeUrl = "&outtype=JSON" // URLとクエリを連結 let listUrl = baseUrl + lonUrl + latUrl + outtypeUrl // URLを生成する guard let url = URL(string: listUrl) else { return }
-
標高を取得する
URLSessionで生成したURLにアクセスして標高を取得する。
ViewController.swift:標高を取得する// URLを生成する guard let url = URL(string: listUrl) else { return } URLSession.shared.dataTask(with: url) { (data, response, error) in if error != nil { print(error!.localizedDescription) } guard let data = data else { return } // JSONを取得する let json = try? JSONDecoder().decode(JsonElevation.self, from: data) if nil != json { // mainスレッドで処理する DispatchQueue.main.async { // JSONから標高を取得する self.longTapElevation = (json?.elevation)! } }.resume() }
サブスレッドからメインスレッドに切り替えるためには、DispatchQueue.main.asyncを使用する。
#余談:HTTPを使用する場合に設定すること(HTTPSは不要)
HTTP通信が非推奨のためHTTP通信する場合は、Info.plistを設定しないと実行時エラーとなる。
App Transport Security Settingsを追加して、Allow Arbitrary LoadsにYESを設定する。
これでHTTP通信が可能となる。
#参考文書
国土地理院 ヘルプ