1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Swift MkMapViewで地図アプリ作成してみた(11)- ロングタップした位置の標高を国土地理院から取得する

Last updated at Posted at 2019-12-21

#記事一覧
Swift MkMapViewで地図アプリ作成してみた(記事一覧)

#国土地理院のサーバ

国土地理院に、標高を取得するWebAPI が公開されています。
使用方法は上記のリンクを参照してください。

###使用例

https://cyberjapandata2.gsi.go.jp/general/dem/scripts/getelevation.php?lon=140.08531&lat=36.103543&outtype=JSON

ブラウザで上記のURLにアクセスしてみてください。

{"elevation":25.3,"hsrc":"5m\uff08\u30ec\u30fc\u30b6\uff09"}

上記の情報が表示されるWebページが表示されます。
elevationが標高ですので、指定した位置は標高25.3mとなります。

#国土地理院からロングタップした位置の標高を取得する

  1. 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 }
    
  2. 標高を取得する

    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を設定しないと実行時エラーとなる。

Qiita(11)-01.png

App Transport Security Settingsを追加して、Allow Arbitrary LoadsにYESを設定する。
これでHTTP通信が可能となる。

#参考文書
国土地理院 ヘルプ

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?