Skip to content

Instantly share code, notes, and snippets.

@zoshigayan
Last active June 8, 2023 02:42
Show Gist options
  • Select an option

  • Save zoshigayan/312b43ac06ddd10a07d2a8ec22eecdc8 to your computer and use it in GitHub Desktop.

Select an option

Save zoshigayan/312b43ac06ddd10a07d2a8ec22eecdc8 to your computer and use it in GitHub Desktop.
天気予報APIのハマりどころ

無料かつ利用制限がないAPIということで、以下を利用してみました。

Free Open-Source Weather API | Open-Meteo.com

例として、一週間の東京の天気を取得する関数はこんな感じで定義できます。

const tokyo = {
  latitude: 35.7,       // 緯度
  longitude: 139.6875,  // 経度
};

const fetchWeather = async (city) => {
  const queries = new URLSearchParams({
    latitude: city.latitude.toString(),
    longitude: city.longitude.toString(),
    daily: "weathercode",
    timezone: "Asia/Tokyo",
  });
  const url = `https://api.open-meteo.com/v1/forecast?${queries}`;
  const response = await fetch(url);
  const body = await response.json();

  return body;
}

レスポンスはこんな感じです。 daily.time[i] のときの天気が daily.weathercode[i] に対応しているっぽいです。

{
  "latitude": 35.7,
  "longitude": 139.6875,
  "generationtime_ms": 0.22995471954345703,
  "utc_offset_seconds": 32400,
  "timezone": "Asia/Tokyo",
  "timezone_abbreviation": "JST",
  "elevation": 43,
  "daily_units": {
    "time": "iso8601",
    "weathercode": "wmo code"
  },
  "daily": {
    "time": [
      "2023-06-07",
      "2023-06-08",
      "2023-06-09",
      "2023-06-10",
      "2023-06-11",
      "2023-06-12",
      "2023-06-13"
    ],
    "weathercode": [
      63,
      55,
      65,
      61,
      63,
      61,
      61
    ]
  }
}

天気がテキストではなく気象コードという謎の概念で返ってくるので、表示にあたっては良い感じに変換してあげる必要があります。ざっとドキュメントを読んだ雰囲気ですが、こんな感じになるのかなと思います…。

// WMOの気象コードをテキストに変換します
// see: https://open-meteo.com/en/docs
const convertWeathercodetoText = (weathercode) => {
  switch (weathercode) {
    case 0:
      return "晴れ"
    case 1:
    case 2:
    case 3:
      return "晴れ時々曇り"
    case 45:
    case 48:
      return "霧"
    case 51:
    case 53:
    case 55:
      return "霧雨"
    case 56:
    case 57:
      return "雨氷"
    case 61:
    case 63:
    case 65:
      return "雨"
    case 66:
    case 67:
      return "雨氷"
    case 71:
    case 73:
    case 75:
      return "雪"
    case 77:
      return "霧雪"
    case 80:
    case 81:
    case 82:
      return "豪雨"
    case 85:
    case 86:
      return "豪雪"
    case 95:
    case 96:
    case 99:
      return "雷雨"
    default:
      return "-"
  }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment