오프라인으로 날씨를 예측할 수 있는 스마트폰 앱 만들기

입문


맑은 날, 기분이 좋아요.

사진은 넬리 현 타이완 원산에서 찍은 거예요.
이런 날에는 오토바이를 타고 외출하면 진전이 있을 것이다.
하지만 난 이때는 몰랐어...그다음에 큰비에 맞았어요.
이렇게 고통스럽고 싶지 않아서 오프라인으로 작동하는 청우계 프로그램을 만들었어요.
오프라인이므로 재해 발생 시 및 활성 회선 혼잡 시 등 네트워크 연결이 어려운 모든 상황에서 사용할 수 있습니다.
이 기사에서 신기술을 활용한 내용은 아니지만 스마트폰에 내장된 센서를 활용해 색다른 앱을 만들고 싶다.
한편 본 보도는 DeNA20 졸업생 이벤트 일정로 집필되었다.저에게 이런 작문의 계기를 주셔서 감사합니다.
※ 높은 정밀도의 날씨 예측을 목표로 하는 것은 아닙니다.그리고 저도 기상 전문가가 아니니 용서해 주세요.

날씨 예측 방침


스마트폰이 내장된 기압 센서를 사용하다


스마트폰에는 가속도, 팽이, 지자기, 조도, 접근, 기압, GPS 등 다양한 센서가 내장되어 있어 오프라인 환경에서도 주변 정보를 얻을 수 있다.
이 센서들 중에서 기압 센서는 날씨 예측에 사용할 수 있다.날씨와 기압은 밀접한 관계가 있다고 하기 때문이다.
상승기류로 구름이 생기는 동안 지면의 공기는 얇아진다.따라서 일반적으로 기압이 떨어지면 비가 온다.
실제로 기압계는 17세기에 발명된 이후 일기예보로 기압계는 어부와 농가에 의해 소중히 여겨졌다.
현재 등산용 일부 시계에도 기압을 기반으로 한 날씨 예측 기능이 탑재된 제품이 있다.

고도 해수면 기압에 대한 수정


기압만 사용하는 맑은 비가 예측하는 약점 중 하나는 고도의 변화에 비례해 기압도 변화한다는 것이다.특히 스마트폰은 휴대하기 때문에 더욱 영향을 받는다.하지만 다행히도 스마트폰을 탑재한 GPS를 통해 고도의 정보를 얻을 수 있다.하식을 통해 기압센서의 값을 해수면 기압으로 수정하여 고도로 인한 기압 변화의 영향을 낮춘다.
$$\normalsize P_0=P\left(1-{\large\frac{0.0065h}{T+0.0065h+273.15}}\right)^{-5.257}\…(1)$$
h: 현재 해발
P:현재 소재지의 기압
T:기온(이번에는 15도로 설정)

해수면 기압에 기초한 날씨 예측


날씨 예측은 머신러닝을 하고 싶은 곳이지만 수론으로 시간을 내기가 어려워 이번 결정에서 기압과 날씨를 연결시켰다.
다음 그림은 기상청이 공개한 나라 2018년 꼬박 1년간의 기상 데이터를 토대로 한 것으로, 강수량당 평균 해수면 기압이다.

기본적으로 강수량이 증가함에 따라 평균 기압은 낮아진다.
비가 내리기 시작하는 시간은 강수량 0mm와 0.5mm 사이이기 때문에 각자의 평균 기압 1016hPa와 1011.8hPa 사이의 1013.9hPa를 기준으로 이보다 낮으면 비, 높으면 맑음으로 설정한다.
한편 기상청이 공개한 과거 기상 데이터는 여기 에서 표시, 다운로드할 수 있다.

응용 프로그램 만들기


요구 사항

  • 오프라인 작업
  • 기상 API를 사용하지 않고 터미널 내의 센서 값만 사용
  • 스마트폰(iOS)에서 실행
  • Swift 언어로 구현
  • 실시


    기압의 획득

        import CoreMotion   // 気圧取得(CMAltimeter)に必要
    
        let altimeter = CMAltimeter()
        public private(set) var pressure: Double?
        // 気圧取得開始のリクエスト
        func requestPressure() {
            if (CMAltimeter.isRelativeAltitudeAvailable()) {
                altimeter.startRelativeAltitudeUpdates(to: .main, withHandler:
                    {
                        data, error in
                        if error == nil {
                            self.pressure = Double(truncating: data!.pressure) * 10 // hPaで取得
                        }
                })
            }
        }
    

    고급 가져오기

        import CoreLocation // 高度取得(CLLocationManager)に必要
    
        let locationManager = CLLocationManager()
        public private(set) var altitude: Double?
    
        // 位置情報取得権限のリクエスト
        func requestAuthorization() {
            locationManager.requestAlwaysAuthorization()
        }
    
        // 位置情報(高度情報)取得のリクエスト
        func requestLocation() {
            if (CLLocationManager.locationServicesEnabled()) {
                locationManager.delegate = self
                locationManager.startUpdatingLocation()
            }
        }
    
        // 位置情報(高度情報)が更新されるたびに呼ばれる
        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
            altitude = locations.first!.altitude
        }
    
    위치 정보 액세스 권한을 얻으려면 Info를 수행합니다.plist는 다음을 추가해야 합니다.Privacy - Location When In Use Usage Description

    해수면 기압에 대한 수정 처리


    공식(1)을 사용하여 계산
    
        func calcSeaLevelPressure(altitude: Double, pressure: Double) -> Double {
            let temperature = 15.0
            let num1 = 1.0 - ( 0.0065 * altitude) / (temperature + 0.0065 * altitude + 273.15)
            let num2 = pow(num1, -5.257)
            let seaLevelPressure = pressure * num2
            return seaLevelPressure
        }
    

    개발된 응용 프로그램


    애플리케이션 개요


    다음 UI 어플리케이션 완료!

    각각의 기능은 다음과 같다.
    ① 기압에 따라 날씨 아이콘이 나타난다.날씨 아이콘 아래의 술집은 기압을 표시한다.
    ② 기압을 표시합니다(해수면 수정 완료).
    ③ 과거의 기압 변화에 따라 날씨의 변화를 예측한다.이번에 기압이 올라가면 비→맑음, 내려가면 비→맑음을 나타낸다.
    ④ 최대 12시간 동안 기압의 변화를 그래프로 나타낸다.
    GitHub는 여기입니다.

    사용 결과


    나는 단지 이틀을 시험해 보았는데, 맑은 날과 흐린 날이 비교적 적합합니까?
    비가 오는 날에는 아직 시도하지 못했기 때문에, 나는 결과를 다시 실었으면 좋겠다고 생각한다.

    향후


    먼저 발표합니다.
    그 다음으로 급격한 기압이 떨어질 때 알려주는 기능 등을 추가하고 싶다.
    최종적으로도 기압을 입력으로 하고 몇 시간 후에 맑음, 흐림, 비를 출력하는 기계 학습 모형을 사용하고 싶다.

    끝내다


    스마트폰만으로 날씨를 예측하는 것은 실용적인 정밀도에 이르지 못할 수도 있지만 코디로 재미있게 할 수 있다면 좋겠다.
    또한 스마트폰도 옆에 있는 센서 블록으로 많이 놀 수 있으니 여러분도 꼭 한번 해 보세요!
    그럼 Qiita 투고가 끝나면 수론을 쓰기 위해 대학으로 돌아갑니다.
    나는 즉시 이 앱으로 날씨가 맑다는 것을 확인한 후에 다시 갈 것이다.(싫은 예감만)
    끝까지 읽어주셔서 감사합니다!
    Weather Doctor's Weather People and History: The Invention of the Barometer, http://www.islandnet.com/~see/weather/history/barometerhistory1.htm  
    해수면 수정기압의 계산, http://www.es.ris.ac.jp/~nakagawa/met_cal/sea_press.html
    기상청, 과거 기상데이터·다운로드, http://www.data.jma.go.jp/gmd/risk/obsdl/index.php

    좋은 웹페이지 즐겨찾기