見出し画像

気象データの魔法:天気を読む新しいアプローチ

この記事はiPhoneをお持ちの方で、Scriptableアプリ(無料/英語)を使った新しい気象データの読み方をご紹介します。インストールや使い方の手順は詳しく書いていないので、分かりづらいところがございますが、ご了承ください。

記事・画像などは、一部生成AI(ChatGPT)を活用しております。



本題の前に気象について考えてみよう

本題の前に、気象について考えたいと思います。
天気は私たちの日常生活に密接に関連しており、日々の活動や計画に影響を与えます。しかし、天気は複雑で予測が難しい現象であり、その背後には多くの要因が絡み合っています。

天気の最も基本的な要因の一つは気圧です。気圧は地球の大気中での気体の圧力を表し、高気圧と低気圧が天気に大きな影響を与えます。高気圧地帯では、空気は下降し、晴天が多い傾向があります。一方、低気圧地帯では、空気は上昇し、雨や嵐が発生しやすくなります。気圧の配置は、天気図上で見ることができ、天気予報において重要な情報源となります。

気圧と関連するもう一つの重要な要素は風です。気圧勾配に応じて風が吹き、風向きや風速が異なります。風は大気の移動を担当し、気象パターンの変化を引き起こします。風の向きが変わることで、寒冷前線や温暖前線が移動し、天気が急変することがあります。

これらの情報を迅速かつ便利にアクセスできるアプリは非常に限られており、特に日本において、「天気図」や「衛星画像」に特化したアプリはほとんど存在しないと考えられます。
おそらく一般的なお天気アプリの使い方として、晴れるか雨が降るか、今後の天気が知れれば良いので、あまり需要が少ないと考えられます。


天気図と気象衛星画像を身近に感じよう

普段、天気図や気象衛星画像をご覧になりますか?ニュースで少し見る程度の方が多いのではないでしょうか。スマホが手元にあればいつでも確認出来ると思いますが、案外見る機会は少ないのではないかと思います。

天気図は、大気中の気象データを地図上にグラフィカルに表現したものです。これらの図は、気圧、風速、風向、気温、湿度などの気象情報を示し、天候予測のための貴重なツールとして広く利用されています。
気象衛星画像は、宇宙から地球の大気や地表の情報を撮影するための画像です。これらの画像は、気象予測、環境モニタリング、災害監視などに幅広く活用されています。

天気図と気象衛星画像は、日々の天気予報の根底にある情報源です。これらの情報を通じて、明日の天気や週末の予報を知り、服装や屋外の計画、外出時に適切な服装を選び、雨や嵐が来るときに備えることができます。


雲の衛星写真画像と天気図を比べてみよう

  1. 雲の種類と高度の把握:

    • 雲の種類: 雲の衛星画像を見ると、異なる種類の雲が視覚的に分かります。例えば、高層雲、中層雲、低層雲、積乱雲などがあります。これらの異なる雲の形状と外観は、気象条件や天候の変化を示す手がかりとなります。

    • 高度: 雲の高度は気象に重要な要素で、衛星画像を用いて高度を推定できます。高い雲は寒冷な大気で形成され、低い雲は比較的暖かい大気で形成されます。雲の高度情報は、気圧配置や前線の移動と関連付けて、天候の変化を予測するのに役立ちます。

  2. 天候の変化の予測:

    • 雲の動き: 雲の衛星画像を時間と共に追跡することで、雲の動きや速度を把握できます。これは、低気圧や寒冷前線の接近を示す重要な情報となります。雲の動きと天気図の風向情報を組み合わせることで、天候の変化をより正確に予測できます。

    • 降水の可能性: 雲の形状と密度は、降水の可能性を示す手がかりとなります。特に積乱雲や厚い層積雲は、降水の兆候となることが多く、これらを観察することで、雨や雪の到来を予測できます。

  3. 気象システムの理解:

    • 大気の安定度: 雲の衛星画像と天気図の組み合わせにより、大気の安定度を評価できます。例えば、高層雲の存在があると、大気が不安定になる兆候となり、雷雨や激しい降水の可能性が高まります。これは、気象予報の重要な情報です。

    • 寒冷前線と温暖前線の識別: 雲のパターンと天気図の前線位置を比較することで、寒冷前線と温暖前線を識別できます。これらの前線は、気圧の変化と関連して天候の急変をもたらすことがあります。


気象衛星画像はどうやって撮られているのか

気象衛星画像は、宇宙から地球の大気と地表の観測を行うために衛星から撮影されます。これらの情報は、気象データ収集の基本的な要素であり、天候予報や気象研究に不可欠なものです。ここでは3点ご紹介します。

  1. 可視光センサーを用いた画像撮影:

    • 天気衛星は、可視光センサーを備えており、これにより目に見える光の波長範囲で地球の表面を撮影します。可視光センサーは通常、日中に最適な性能を発揮しますが、夜間は撮影できません。

    • 地球上の雲、海洋、陸地の特徴が可視光画像に表示されます。これにより、雲の形状や運動、陸地の気象条件などを鮮明に可視化できます。

  2. 赤外線センサーを用いた画像撮影:

    • 赤外線センサーは、地球から放射される赤外線放射を検出し、地球の温度情報を得るために使用されます。これにより、夜間や雲の下でも画像を撮影できます。一般的にニュース等で放送されている気象衛星画像は、赤外線センサーを使ったものを採用しています。

    • 夜間にも適用可能であり、特に雲の高度や温度、降水の存在などを詳細に把握するために重要です。赤外線画像は、気象予測において不可欠な情報源となっています。

  3. ミクロ波センサーを用いた画像撮影:

    • ミクロ波センサーは、ミクロ波帯域の電磁波を検出し、降水、雪、氷、海洋表面温度などの情報を収集します。ミクロ波画像は、厚い雲の下にある地表の情報も提供します。

    • これらの画像は、降水量や海洋の温度分布、ハリケーンの監視などに活用されます。ミクロ波センサーは、特に海洋観測において非常に重要です。


気象衛星画像はどのように収集されているのか

  1. 電磁波の受信と送信:

    • 気象衛星は、地球からの電磁波を受信し、同時に地球に向けて電磁波を送信します。これにより、大気、雲、海洋、陸地などからの情報を捉えます。

    • 衛星は、さまざまな波長帯域のセンサーを使用して、可視光、赤外線、ミクロ波などの情報を収集します。それぞれの波長帯域は、異なる気象要素を測定するために設計されています。

  2. データ送信と受信:

    • 収集された気象データは、衛星から地上の受信局に送信されます。受信局は、大気中の電波をキャッチし、データを解析するための処理を行います。

    • このデータは、地上の気象センターや研究機関に送信され、解析、処理、格納されます。ここで、データの品質チェック、校正、および加工が行われ、気象衛星画像が生成されます。

  3. データの可視化と解釈:

    • 生成された気象衛星画像は、視覚的に表現され、天候予報や気象研究に使用されます。これらの画像は、雲の位置、高度、温度、湿度、降水量などを示します。

    • 画像の可視化と解釈には、コンピューターソフトウェアと気象専門家の専門知識が活用されます。これにより、雲の動き、前線の位置、気象系の発達などを把握し、天気予報の精度向上に貢献します。



iPhoneウィジェットの必要性

では、天気の話はこれくらいにしておいて、ここからはウィジェットの必要性について書きたいと思います。ウィジェットは、便益性や利便性を提供し、私たちのデジタル生活を向上させるために非常に重要なツールです。

  1. 情報への迅速なアクセス:

    • ウィジェットは、スマートフォンやコンピューターのホーム画面に配置できる小さなアプリケーションです。これにより、重要な情報に素早くアクセスできます。例えば、天気ウィジェットは現在の天気予報を一目で確認できるため、外出前に適切な服装を選びやすくなります。

    • ウィジェットは、カレンダーや時計、ニュースフィード、通知など、様々な情報にアクセスするための便利な手段を提供します。情報へのアクセスが迅速で簡単であるため、日常生活の効率を向上させます。

  2. カスタマイズ可能性:

    • ウィジェットは、ユーザーが自分のニーズに合わせてカスタマイズできるため、非常に柔軟です。デザインや表示する情報を調整し、ユーザーにとって最適な情報を提供します。

    • 例えば、ウィジェットを使って特定のアプリのショートカットを作成することができます。これにより、よく使用するアプリケーションに瞬時にアクセスできます。

  3. 生産性の向上:

    • ウィジェットは、生産性向上に貢献します。予定表ウィジェットは次の予定を確認し、タスクリストウィジェットは未完了のタスクを管理するのに役立ちます。これにより、予定のスケジュールを最適化し、タスクの優先順位を設定できます。

    • ウィジェットは、作業フローの一部としてアプリケーションやサービスにアクセスするための手間を減らし、効率的なタスク管理を可能にします。

個々のアプリを開かなくても、多様な情報に素早くアクセスできる点は、非常に評価すべき点かなと考えています。




Scriptableのアプリ紹介

お待たせしました。そろそろ本題に入ります。
Scriptableアプリを使用して、カスタマイズされた天気情報ウィジェットを作成する方法を解説します。
最終的なウィジェットの仕上がりは、以下の画像を参考にしてください。
今回は、衛星画像と天気図が並んだウィジェットを作成します。
画像を左右に並べることで、天気図と雲の様子が分かりやすく表現されているかと思います。
天気図は10分おきに変わるものでは無く、1日に4〜6回作成されます。エリアによっても異なりますが「朝、昼、夕方、夜」のイメージですね。

衛星画像と天気図が並んでいるウィジェット

アプリのインストール

Scriptableアプリが必須なので、まだ入手されていない方はインストールします。このアプリは無料ですが英語です。
英語のアプリなので、英語が苦手な人は辛いかもしれませんが、簡単なのでチャレンジしてみましょう。

Scriptableアプリは、iOSのホーム画面にカスタマイズ可能なウィジェットを作成できる機能を提供します。ユーザーは自分の情報やデータを表示するウィジェットを作成し、ホーム画面に配置できます。これにより、カスタムダッシュボードや情報の一元表示が可能になります。

手順の説明

ウィジェットの動作には下記ソースコードが必要なので、ソースコードを1行残らず全部コピーしてご利用ください。カスタマイズは各自でどうぞ。
画像のソースはYahoo Japanを利用しております。気象庁などお好みのサイトがありましたら、そちらに書き換えても面白そうですね。

ソースコード

バージョン 1.7.13で動作確認済みです。
2023年11月4日時点のYahoo Japan!の天気サイトで動作確認済みです。
サイトのデザインが変更になった場合は、動作不可になる可能性がございますので、ご了承ください。

// ウィジェットの更新インターバル
const AdjustedUpdateInterval = 5;

// 枠のカーブ
const CornerRadius = 12;

// Yahoo天気予報からデータ取得
async function loadurl() {
    try {
        let result = {};
        // 衛星写真 (日本付近)
        const req1 = await new Request("https://weather.yahoo.co.jp/weather/satellite/");
        const code1 = await req1.loadString();
        const found1 = code1.match(/src="([^"]*)\.jpg/g);
        result.imageurl1 = found1[0].replaceAll('src=\"', '');
        result.imagetime1 = getTimeFromImageUrl(result.imageurl1);

        // 天気図
        const req2 = await new Request("https://weather.yahoo.co.jp/weather/chart/");
        const code2 = await req2.loadString();
        const found2 = code2.match(/src="([^"]*)\.jpg/g);
        result.imageurl2 = found2[0].replaceAll('src=\"', '');
        result.imagetime2 = getTimeFromImageUrl(result.imageurl2);

        return result;

    } catch (error) {
        // if everything else has failed, use the default (or the old
        // cached version if we came here because that was older than a
        // week but the update didn't work)
    }

}

// URLから時間を抽出する関数
function getTimeFromImageUrl(url) {
    // URLを分割してファイル名を取得
    const fileName = url.split("/").pop();

    // ファイル名から時間を抽出(ここでは"-180000.jpg"の部分)
    const timeString = fileName.split("_").pop().split("-")[1].split(".")[0];

    // 時間のフォーマットを整える(例: "18:00")
    const hours = timeString.substring(0, 2);
    const minutes = timeString.substring(2, 4);
    const formattedTime = `${hours}:${minutes}`;

    return formattedTime;
}

// ScriptableのRequestモジュールを利用した画像データ取得
async function loadImage(url) {
    let req = new Request(url);
    return req.loadImage();
}

// ウィジェットの作成
async function createWidget(jsonData) {
    const widget = new ListWidget();
    // 横のサイズ
    const stackWidth = 324;
    // 1LINEの高さ
    const stackHeightTitle = 16;
    // イメージの幅
    const stackWidthImage = 160;
    // イメージの高さ
    const stackHeightImage = 120;

    // 外枠
    const widgetStack00 = widget.addStack();
    widgetStack00.size = new Size(stackWidth, stackHeightTitle);
    widgetStack00.centerAlignContent();

    // 内枠(1)
    const widgetStack001 = widgetStack00.addStack();
    widgetStack001.size = new Size(stackWidthImage, stackHeightTitle);
    let text1 = `  衛星画像   ${jsonData.imagetime1}更新`;
    const title1 = widgetStack001.addText(text1);
    title1.textColor = Color.dynamic(Color.black(), Color.white());
    title1.textOpacity = 0.9;
    title1.font = Font.semiboldSystemFont(13);
    widgetStack001.cornerRadius = CornerRadius;
    widgetStack001.addSpacer(); // 左寄せ

    // 2つのパーツのスペース
    widgetStack00.addSpacer(4);

    // 内枠(2)
    const widgetStack002 = widgetStack00.addStack();
    widgetStack002.size = new Size(stackWidthImage, stackHeightTitle);
    let text2 = `  天気図     ${jsonData.imagetime2}更新`;
    const title2 = widgetStack002.addText(text2);
    title2.textColor = Color.dynamic(Color.black(), Color.white());
    title2.textOpacity = 0.9;
    title2.font = Font.semiboldSystemFont(13);
    widgetStack002.addSpacer();
    widgetStack002.cornerRadius = CornerRadius;

    widget.addSpacer(4);

    // 外枠
    const widgetStack01 = widget.addStack();
    widgetStack01.size = new Size(stackWidth, stackHeightImage);
    widgetStack01.centerAlignContent();

    // 内枠(1)
    let image1 = await loadImage(jsonData.imageurl1);
    const imageElement = widgetStack01.addImage(image1);
    imageElement.imageSize = new Size(stackWidthImage, stackHeightImage);
    imageElement.url = "https://weather.yahoo.co.jp/weather/satellite/";
    imageElement.cornerRadius = CornerRadius;

    widgetStack01.addSpacer(4);

    // 内枠(2)
    let image2 = await loadImage(jsonData.imageurl2);
    const image2Element = widgetStack01.addImage(image2);
    image2Element.imageSize = new Size(stackWidthImage, stackHeightImage);
    image2Element.url = "https://weather.yahoo.co.jp/weather/chart/";
    image2Element.cornerRadius = CornerRadius;

    // Widgetの更新時間設定
    widget.refreshAfterDate = new Date(Date.now() + 1000 * 60 * AdjustedUpdateInterval);

    return widget;
}

// main
console.log("start.");

let jsonData = {};
jsonData = await loadurl();
console.log(jsonData);

// ウィジェットの作成
let widget = await createWidget(jsonData);
if (config.runsInWidget) {
    Script.setWidget(widget);
} else {
    widget.presentMedium();
}
Script.complete();


Scriptの新規作成

Scriptableのアプリを起動て、右上に「+」マークのアイコンがあるので、タップしてスクリプトの新規作成画面に移動します。

右上の「+」が新規追加です。


新規作成画面が表示されたら、画面を長押しして「ペースト」します。

新規作成画面


「Untitled Script」の部分をタップすると名前が変更できます。
以下の画像は「weatherYahoo」に変更しています。

最終的なイメージです。weatherYahooと名前を付けました。


ウィジェットの配置

ウィジェットの配置はホーム画面を長押しして、左上のプラスマークから「Scriptable」を選択し、中くらいのサイズを選択して配置しましょう。

ウィジェットの追加画面

ウィジェットを配置したら、作成したスクリプトを選んで終了です。

ホーム画面: 長押しして設定画面を開きます

スクリプトの選択画面

設定画面:Scriptは先ほど作成したものを選択

完成図

これで完成です!
ウィジェットに衛星画像と天気図が出てきたでしょうか?

最終的な仕上がり


まとめ

天気に関する様々な要点について、長々と探求してきました。
気象学の世界は非常に複雑で興味深いものであり、手持ちのiPhoneを利用して気象衛星画像や天気図から天気の奥深さを学び、天気に関する知識を深めてみてはいかがでしょうか。

Scriptableアプリは非常に優秀なアプリで、これまで自作が必要だったものを簡単に作ることが出来ます。ちょっとしたものを作るにもそれなりの学習時間と知識が必要になりますが、HTMLとJavaScriptの知識とテクニックがあれば、ウィジェットを作成できる魅力を感じていただければと考えています。
私は他にも素敵なウィジェットを作成しておりますので、また別な記事でご紹介したいと考えております。

最後まで読んでいただいてありがとうございました。
またお付き合いください。


この記事が気に入ったらサポートをしてみませんか?