Swift MkMapView로 지도 어플리케이션을 만들어 보았습니다(12). - 긴 클릭 위치와 현재 위치의 해발 차이를 파이프 발에 표시합니다.

문장 목록


Swift MkMapView로 지도 어플리케이션을 만들어 보았습니다(기사 일람).

국토지리원에서 현재 위치의 해발을 얻다


국토지리원 WebAPI에서 높이를 얻는 방법에 대한 자세한 정보는 국토지리원에서 머리를 길게 빼는 위치의 해발을 얻다 를 참조하십시오.

  • URL 생성
    국토지리원제 역할 JSON에서 현재 위치의 해발 URL을 얻습니다.
    ViewController.swift:URL 생성
    // 国土地理院のURL
    let baseUrl = "https://cyberjapandata2.gsi.go.jp/general/dem/scripts/getelevation.php?"
    // 現在位置でクエリを設定する
    let lonUrl = "&lon=" + mapView.userLocation.coordinate.longitude.description
    let latUrl = "&lat=" + mapView.userLocation.coordinate.latitude.description
    // アウトプット形式をJSONに設定する
    let outtypeUrl = "&outtype=JSON"
    // URLとクエリを連結
    let listUrl = baseUrl + lonUrl + latUrl + outtypeUrl        
    // URLを生成する
    guard let url = URL(string: listUrl) else { return }
    
    현재 위치 가져오기에서 현재 위치가 유효하게 수신되는 경우 mapView.현재 위치는 userLocation에서 자동으로 설정됩니다.

  • 고도를 얻다
    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.currentElevation = (json?.elevation)!
            }
        }.resume()
    }
    
    하위 스레드에서 주 스레드로 전환하기 위해 DispatchQueue.main.async 사용.
  • 핀에 긴 공사의 위치와 현재 위치의 표고차를 표시합니다


  • 고도차를 계산하다
    국토지리원에서 머리를 길게 빼는 위치의 해발을 얻다 해발의 차
    ViewController.swift: 고도차 계산
    self.lblDiffElevation = "高低差:" + (round(((self.longTapElevation - self.currentElevation)*10))/10).description + " m"
    // ロングタップしたアノテーション情報を更新する
    updateLongTapPointAno()
    
    소수 1위가 되기 위해 "*10)"/10"으로 설정합니다.

  • 파이프 발에 고도차를 표시하다
    긴 공사의 위치에 핀을 세워 거리를 표시하다에서 설정한 인용 제목과 연결됩니다.
    ViewController.swift: 파이프 발에 고도차 보이기
    // ロングタップしたアノテーション情報を更新する
    func updateLongTapPointAno() {
        // 現在位置とタッウプした位置の距離(m)を算出する
        let distance = calcDistance(mapView.userLocation.coordinate, pointAno.coordinate)
    
        // ピンに設定する文字列を生成する
        var str:String = Int(distance).description
        str = str + " m"
    
        // yard
        let yardStr = Int(distance * 1.09361)
        str = str + " / " + yardStr.description + " y"
    
        // 標高差を連結する
        str = str + "\n" + lblDiffElevation.description
    
        if pointAno.title != str {
            // ピンまでの距離に変化があればtitleを更新する
            pointAno.title = str
            mapView.addAnnotation(pointAno)
        }
    }
    
    시뮬레이터의 실행 결과는 다음과 같다.

  • 참조 파일


    국토지리원 도움

    좋은 웹페이지 즐겨찾기