GPS測位で得た緯度・経度を使ってリアルタイム天気情報をPythonで取得する方法

この記事では、GPSアンテナで高精度に取得した位置情報(緯度・経度)を使い、最新の天気情報を簡単に取得・活用する方法をご紹介します。

例えば、「自宅や現場の正確な位置の天気を知りたい」「旅行先の詳細な気象状況をリアルタイムで把握したい」といったニーズに応える内容です。

筆者は北海道足寄町(善意の基地局として公開中)でGPSデータを取得し、それを使ってWeatherbit.ioのAPIから天気情報を取得するPythonコードを実行しました。

この記事を通じて、その流れとポイントをシンプルに解説します。

ちなみにWeatherbit.ioのドキュメントはこちら

なぜGPSで取得した緯度・経度が重要なのか?

スマートフォンやカーナビの位置情報とは違い、GPSアンテナを用いたGNSSクラス測位では、非常に高精度の座標データを取得できます。

これにより、一般的な地名指定よりもピンポイントに位置を特定できるため、より正確で詳細な天気情報の取得が可能です。

例えば、北海道足寄町の緯度「43.25437900」、経度「143.55497500」という座標を直接Weatherbit.io APIへリクエストを送ることで、その場所専用の天気情報が入手できます。

取得できるデータリスト

データ種類 説明
温度(temp) 現在の気温(摂氏または華氏)
体感温度(app_temp) 体感気温(風などの影響を含む温度)
露点温度(dew_point) 空気中の水蒸気量を示す指標
湿度(rh) 相対湿度(%)
気圧(pres) 大気圧(ヘクトパスカル)
風速(wind_spd) 風の速さ(m/s)
風向(wind_dir) 風の向き(度)
雲量(clouds) 空の曇り具合(%)
降水量(precip) 降水量(mm)
降雪量(snow) 降雪量(cmまたはmm)
積雪深(snow_depth) 地上の積雪深さ
視界(vis) 視程距離(kmまたはm)
紫外線指数(uv) 紫外線の強さを示す指数
太陽放射量(solar_rad) 地表に到達する太陽放射エネルギー
大気質指数(aqi) 空気の総合的な大気質評価スコア
主要汚染物質濃度 PM2.5、PM10、CO、一酸化炭素、NO2、二酸化窒素、O3、オゾン、SO2、二酸化硫黄等
花粉情報 草、雑草、樹木、カビの花粉データ
雷情報(lightning) 雷の発生有無や頻度
天気状態(weather.description) 晴れ、曇り、雨、雪などの気象状態の説明
昼夜情報(day/night) 現在が昼か夜かの判別
日の出・日の入時刻(sunrise, sunset) その地点の日の出・日の入りの時間
加熱・冷却度日数(Heating/Cooling Degree Days) エネルギー需要分析用の気温指標
蒸発散量(evapotranspiration) 土壌と植物からの蒸発散量(農業用途)

取得できるデータの種類もかなり豊富。
せっかく高精度のGPS情報があるのですから、旅先でも有効活用したいですよね。

Weatherbit.io APIとは?

Weatherbit.ioは、世界中の4万以上の気象観測所や衛星データ、最新の気象モデルを用いて高精度な気象データを提供しているクラウドAPIサービスです。

無料プランでも毎日100回以上のAPIリクエストが可能で、初心者からプロまで幅広く利用されています。

取得可能な情報は多岐に渡り、温度や湿度、風速はもちろん、紫外線指数や大気質指数、雷情報、さらには過去の天気履歴や近未来の天気予報までカバーしています。

プラン名 月額料金 APIリクエスト数 利用可能データ・機能 適した用途
Free (Limited) 無料 1日あたり約100~150件 基本的な現在の天気、過去天気、短期予報(最大16日)、限定的な大気質・警報提供 個人・趣味・小規模開発、API性能テスト用
Free Trial (21 Days) 無料(21日間限定) 無料プランより多い(トライアル期間中無制限に近い場合も) 標準機能フルアクセス(多種多様な気象データ) 初めての利用性能試験、本格利用検討前のテスト
Standard $45/月 大量APIリクエスト可能 拡張機能あり(詳細大気質予測、警報範囲拡大、商用利用可) 中規模サービス・商用利用
Plus $195/月 更に大量リクエスト可能 上位プラン向け高度データアクセス、高度なAPIエンドポイント 大規模ビジネス利用や高頻度データ取得
Business $495/月 無制限に近い(商談ベース) SLA保証、専用サポート、大量・高頻度データ利用向け 大企業・大規模サービス向け

実際に使ったPythonサンプルコード紹介

以下は、GPSアンテナで測定した足寄町の緯度経度を使って、現在の天気を取得・表示するPythonコードの一例です。

import requests

API_KEY = "あなたのAPIキーをここに入れてください"

def get_current_weather(lat, lon):
    url = "https://api.weatherbit.io/v2.0/current"
    params = {
        "lat": lat,
        "lon": lon,
        "key": API_KEY,
        "units": "M",
        "lang": "ja"  # 日本語で返す場合
    }
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = response.json()
        if "data" in data and len(data["data"]) > 0:
            weather = data["data"][0]
            print(f"【地点】北海道足寄町(GPS測位データ)")
            print(f"緯度: {lat}")
            print(f"経度: {lon}")
            print(f"天気: {weather['weather']['description']}")
            print(f"気温: {weather['temp']} °C")
            print(f"体感温度: {weather['app_temp']} °C")
            print(f"湿度: {weather['rh']}%")
            print(f"風速: {weather['wind_spd']} m/s")
            print(f"気圧: {weather['pres']} hPa")
        else:
            print("天気情報が取得できませんでした。")
    else:
        print(f"APIリクエスト失敗: ステータスコード {response.status_code}")

if __name__ == "__main__":
    lat = 43.25437900
    lon = 143.55497500
    get_current_weather(lat, lon)

登録時に国を選ぶ場面がありますが、ここで日本語を選択しているのだと思われます。

実行結果はすべて日本語で出力されます。
例えばテストコードでの実行結果です。

【地点】北海道足寄町(GPSアンテナ測位)
緯度: 43.254379
経度: 143.554975
天気: Clear sky
気温: 20.7 °C
体感温度: 21.1 °C
湿度: 85%
風速: 1.8 m/s
気圧: 977 hPa

コードを動かす前のポイント

  • 事前にWeatherbit.ioの無料APIキーを取得してください。
  • Python環境に requests ライブラリが入っていない場合は pip install requests でインストールを。
  • APIキーが発行されてから約30分のプロビジョニング時間が必要なので、すぐに使えなくても焦らず待ちましょう。

天気予報について

Weatherbit.ioのAPIでは、最大16日先までの天気予報を取得することが可能です。
しかし、日付を指定して特定の日の天気予報を得るには、主に「予報API」でその日の予報データを含むレスポンスから該当日を抽出する形になります。

日付単独での直接指定取得というよりは、16日間分などの予報を一括で取って、その中から目的の日付の情報を取得するのが一般的な使い方です。

もし特定の日の天気予報を日時指定で詳細に取りたい場合は、レスポンスにある各日のデータをプログラム上でフィルタリングしてください。

それ以上の長期予報(16日以上先)や日時ピンポイント取得は現在のWeatherbit.ioの標準APIでは対応していません。

競合サービスリスト

天気情報に関しては他にも競合がたくさんありますので、一部を紹介しておきます。

サービス名 主な特徴 料金例 備考
OpenWeatherMap 無料プランあり、多様な気象データ。衛星・レーダー・気象ステーション情報を統合。APIリクエスト数制限は無料で60/分。 無料〜月額数十ドル 世界カバー、複数言語対応、豊富なAPI種類
Tomorrow.io (旧 ClimaCell) 米国中心の高解像度降水予報。多言語対応、約500気象パラメータ。アクション重視の気象インテリジェンス。 無料プランあり、カスタム企業価格 短期予報に強み、ビジネス向け機能豊富
Meteoblue 14日間予報、30年以上の履歴データ。中央欧州限定の高解像度モデルあり。多様な気象パラメータ。 要問い合わせ ヨーロッパ中心の高精度データ提供
Weatherstack リアルタイムと過去データに強い。簡単なJSONレスポンス、HTTPS対応(有料)。 無料〜月額約100ドル ウェブ・モバイル向け低コストソリューション
AccuWeather API 商用での高い信頼性。詳細な15日予報やアラート豊富。40言語以上対応。 $25〜数百ドル/月 グローバル展開、商用サービスに適合
Visual Crossing 長期の過去気象データと詳細予報。気象統計解析向け。 無料トライアルあり、$35/月〜 気象履歴利用や分析ニーズに

M5Stackでの実装例

例えば、M5Stack上でWeatherbit.ioのAPIを使うことももちろん可能。
AボタンでGPS測定し、Bボタンでその計測した緯度・経度をもとに天気情報を取得・表示するプログラムは十分実装可能といえます。

  • M5StackはESP32搭載マイコンで、MicroPythonまたはArduino環境で開発できます。
  • GPSモジュール(M5Stack GPSユニットや外付けGPSモジュール)から緯度・経度を取得。
  • urequestsのようなHTTPクライアントライブラリを使えば、Weatherbit.ioのREST APIにGETリクエストを送れる。
  • ボタンAでGPS取得、ボタンBで天気API呼び出しと画面表示を制御が可能。
  • 画面はM5StackのLCDにテキスト表示できるため、天気情報の結果を見やすく表示できます。

実装例の大まかな流れ

  1. GPSデータをUARTやI2Cなどで取得し、緯度・経度をパース
  2. ボタンA押下時にGPS測位し、測位成功時は緯度・経度を保存
  3. ボタンB押下時に保存した緯度・経度を使い
    https://api.weatherbit.io/v2.0/current?lat=緯度&lon=経度&key=API_KEY&units=M&lang=ja へHTTP GET
  4. 返ってきたJSONから天気情報をパースし、画面に表示

以下はESP32などArduino環境で使いやすいWiFiClientSecure+HTTPClientを使い、GPSから取得した緯度・経度を元にWeatherbit.io APIから現在の天気情報を取得してシリアルモニタに表示する簡単なサンプルコード例です。

※実装テスト前&デバッグ前

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

// Wi-Fi設定
const char* ssid = "あなたのSSID";
const char* password = "あなたのWiFiパスワード";

// Weatherbit.io APIキー
const char* API_KEY = "65e211da6c5e4faea401aeec11b12e92";

// GPSで取得した座標(例:43.25437900, 143.55497500)
double latitude = 43.25437900;
double longitude = 143.55497500;

void setup() {
  Serial.begin(115200);
  delay(1000);

  // Wi-Fi接続開始
  Serial.print("Connecting to WiFi");
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.println("WiFi connected.");
}

void loop() {
  if ((WiFi.status() == WL_CONNECTED)) {
    HTTPClient http;

    // APIのURLを作成。lang=jaで日本語表記も可能
    String url = String("https://api.weatherbit.io/v2.0/current?lat=") + String(latitude, 8) +
                 "&lon=" + String(longitude, 8) +
                 "&key=" + API_KEY +
                 "&units=M&lang=ja";

    http.begin(url);
    int httpResponseCode = http.GET();

    if (httpResponseCode > 0) {
      String payload = http.getString();

      // JSON解析用にArduinoJsonを使う(ArduinoJsonライブラリの導入が必要)
      DynamicJsonDocument doc(2048);
      DeserializationError error = deserializeJson(doc, payload);

      if (!error) {
        JsonObject weatherData = doc["data"][0];

        Serial.println("【地点】GPS計測地点");
        Serial.print("緯度: ");
        Serial.println(latitude, 8);
        Serial.print("経度: ");
        Serial.println(longitude, 8);
        Serial.print("天気: ");
        Serial.println(weatherData["weather"]["description"].as<const char*>());
        Serial.print("気温: ");
        Serial.print(weatherData["temp"].as<float>());
        Serial.println(" °C");
        Serial.print("体感温度: ");
        Serial.print(weatherData["app_temp"].as<float>());
        Serial.println(" °C");
        Serial.print("湿度: ");
        Serial.print(weatherData["rh"].as<int>());
        Serial.println(" %");
        Serial.print("風速: ");
        Serial.print(weatherData["wind_spd"].as<float>());
        Serial.println(" m/s");
        Serial.print("気圧: ");
        Serial.print(weatherData["pres"].as<float>());
        Serial.println(" hPa");
      } else {
        Serial.print("JSON parse error: ");
        Serial.println(error.c_str());
      }
    } else {
      Serial.print("HTTP request failed, error: ");
      Serial.println(httpResponseCode);
    }
    http.end();
  } else {
    Serial.println("WiFi not connected");
  }

  delay(60000); // 1分待機してから再取得
}

Wi-Fi接続やAPIなどその他情報はINIファイルで整理するのがおすすめです。

また、何かアイディアがありましたら、当サイトのブログで紹介します。

まとめ

GPSの緯度・経度を活用して、独自の位置に基づく高精度な天気情報を得ることは、アウトドアや農業、物流、観光など幅広い分野で役立ちます。
PythonとWeatherbit.io APIの組み合わせは、初心者でも気軽に始められる上に拡張性も高く、ぜひ自分のプロジェクトに取り入れてみてください。

読んでいただき、ありがとうございました!

朝比奈幸太郎

音楽家:朝比奈幸太郎

神戸生まれ。2025 年、40 年近く住んだ神戸を離れ北海道・十勝へ移住。
録音エンジニア五島昭彦氏より金田式バランス電流伝送 DC 録音技術を承継し、 ヴィンテージ機材で高品位録音を実践。
ヒーリング音響ブランド「Curanz Sounds」でソルフェジオ周波数音源を配信。
“音の文化を未来へ”届ける活動を展開中。