富士五湖TV

気象庁発表の天気予報をHPに表示する。

共和タクシー
9人乗りジャンボタクシーで富士山・富士五湖観光

by Fujigoko.TV

ホーム/ 掲示板各種/ 気象庁発表の天気予報をHPに表示する。

富士五湖.TVに広告を出してみませんか?

特報、連載中の葛飾北斎の視点(凱風快晴)
NHK歴史秘話ヒストリア」(2017年4月21日放送)で検証されました

掲示板&投稿集

富士五湖いろいろ掲示板
イベント掲示板
地元掲示板
口コミ掲示板

富士五湖特派員報告
富士五湖TV報告
特派員外も五湖便り
投稿画像コーナー
富士山ベストショット
ライブカメラ画像集
ライブカメラ殿堂
FujigokoTVでつぶやく

富士山ライブカメラ

山中湖高台180度
山中湖平野(望遠)
山中湖長池
忍野富士
忍野八海
忍野高台
富士山五合目(望遠)
富士吉田中曽根(望遠)
河口湖母の白滝
河口湖富士山遥拝所
河口湖船津
河口湖逆さ富士
河口湖北岸(望遠)
河口湖大石湖畔
河口湖大石高台
河口湖勝山
鳴沢村公園(望遠)
西湖・樹海
精進湖子抱き
本栖湖千円札
富士ドクタービレッジ
富士ヶ嶺ゴルフ場
職業訓練センター(望遠)
大原学園富士宮(望遠)
富士宮市柚野
富士市茶畑(望遠)
河口湖畔
河口湖畔道の駅
山中湖畔
明見湖(広角)
国139昭和大入口
マップ交通カメラ
富士五湖YouTube


気象庁発表の天気予報をHPに表示する。





2024年2月13日20時26分


久保覚 (富士五湖TV代表)

Profile 全投稿表示

気象庁発表の天気予報をHPに表示する。

googleの生成AIのBardがGeminiになった。その実力を見るために何かプログラムを作って確かめてみた。

気象庁では定期的にXMLフォーマット形式の電文を配信している。
このXMLファイルを定期的に自動で読み込めばHP上に天気予報を表示できるので実際にGoogleGeminiを使用してプログラムしてみた。

以下に表示に至るまでの方法をステップごとに備忘録として記録する。
===========
ステップ1.気象庁のXMLフォーマット形式の電文を定期的に取り込む。
 サーバーのcrontabで定期的にXMLファイルを取り込むよう設定。
 気象庁のファイルは「https://www.data.jma.go.jp/developer/xml/feed/regular_l.xml」にある。
 読み込む方法はfreeBSDならfetchコマンドで取り込む。
 fetch -mp -o /自分のサーバーのパス/weatherJapan.rdf https://www.data.jma.go.jp/developer/xml/feed/regular_l.xml
 以上で、自身のサーバー内にweatherJapan.rdfファイルとして取り込み完了。
---------------
ステップ2.取り込んだデータから「山梨県の最新データ」を取り込む。
 「ステップ1」で取り込んだ気象庁のデータは全国の気象データのindexのようなものなので、そこから山梨県の最新気象データを抽出する。
 具体的には、indexに並んでいるデータ群(過去データもある)から目的のデータを見つける。
 山梨県の気象予報なら、甲府気象台の「https://www.data.jma.go.jp/developer/xml/data/データの日付_0_VPFD51_190000.xml」となる。
 データは過去のアーカイブを含むので最新のデータ、つまりリストの先頭のindexを引く。
 indexの引き方はunixのshellScriptで自動化する。
 生成AIで、「VPFD51_190000を含むリストの先頭の文字を取り出すshellScriptを書け」と命令。
 weatherF=$(grep -Eo 'https:\/\/www\.data\.jma\.go\.jp\/developer\/xml\/data\/(.*)VPFD51_190000\.xml' /自分のサーバーのパス/weatherJapan.rdf | awk -F/ '{print $NF}' | head -1)
 上記の回答を得る。
 次は変数weatherFを使用して山梨県のXMLデータをfetchで読み込む。
 fetch -mp -o /自分のサーバーのパス/weatherYamanashi.rdf https://www.data.jma.go.jp/developer/xml/data/"${weatherF}"
 以上で、自身のサーバー内にweatherYamanashi.rdfファイルとして取り込み完了。

<Gemini最初の指令>
https://www.data.jma.go.jp/developer/xml/feed/regular_l.xml
にあるXMLファイルから
https://www.data.jma.go.jp/developer/xml/data/*****_VPFD51_190000.xml
の部分を抽出し、抽出した先頭のみを表示するシェルを書け。
ただし、「*****」は任意の文字列。
解答→正規表現とgrepのパターンを提示してきた。正規表現はエラーになったのでgrepを使用し改良して使用。
---------------
ステップ3.「ステップ1」と「ステップ2」をcrontabで定期的に実行するようサーバーに記述する。
<weatherYamanashi.rdfファイルの中身例>
前段あり〜
<DateTime>2024-02-13T17:00:00+09:00</DateTime>
<Duration>PT7H</Duration>
<Name>今夜</Name>
</TimeDefine>
<TimeDefine timeId="2">
<DateTime>2024-02-14T00:00:00+09:00</DateTime>
<Duration>P1D</Duration>
<Name>明日</Name>
</TimeDefine>
<TimeDefine timeId="3">
<DateTime>2024-02-15T00:00:00+09:00</DateTime>
<Duration>P1D</Duration>
<Name>明後日</Name>
</TimeDefine>
</TimeDefines>
<Item>
<Kind>
<Property>
<Type>天気</Type>
<DetailForecast>
<WeatherForecastPart refID="1">
<Sentence>晴れ</Sentence>
<Base>
<jmx_eb:Weather type="天気">晴れ</jmx_eb:Weather>
</Base>
</WeatherForecastPart>
<WeatherForecastPart refID="2">
<Sentence>晴れ 昼過ぎ から くもり</Sentence>
<Base>
<jmx_eb:Weather type="天気">晴れ</jmx_eb:Weather>
</Base>
<Becoming>
<TimeModifier>昼過ぎ から</TimeModifier>
<jmx_eb:Weather type="天気">くもり</jmx_eb:Weather>
</Becoming>
</WeatherForecastPart>
<WeatherForecastPart refID="3">
<Sentence>くもり 後 一時 雨</Sentence>
<Base>
<jmx_eb:Weather type="天気">くもり</jmx_eb:Weather>
</Base>
<Temporary>
<TimeModifier>後 一時</TimeModifier>
<jmx_eb:Weather type="天気">雨</jmx_eb:Weather>
</Temporary>
</WeatherForecastPart>
</DetailForecast>
<WeatherPart>
<jmx_eb:Weather refID="1" type="天気">晴れ</jmx_eb:Weather>
<jmx_eb:Weather refID="2" type="天気">晴れ後くもり</jmx_eb:Weather>
<jmx_eb:Weather refID="3" type="天気">くもり後一時雨</jmx_eb:Weather>
</WeatherPart>
<WeatherCodePart>
<jmx_eb:WeatherCode refID="1" type="天気予報用テロップ番号">100</jmx_eb:WeatherCode>
<jmx_eb:WeatherCode refID="2" type="天気予報用テロップ番号">111</jmx_eb:WeatherCode>
<jmx_eb:WeatherCode refID="3" type="天気予報用テロップ番号">212</jmx_eb:WeatherCode>
</WeatherCodePart>
</Property>
</Kind>
<Kind>
<Property>
<Type>風</Type>
〜以下続く
---------------
ステップ4.定期的に取り込んだ山梨県の天気予報データ(weatherYamanashi.rdf)を解析する。
 解析にはperlプログラムを使用する。
 必要な部分のみperlの正規表現を使用してプログラムしようとしたが、今回は「XML::Simple;」を使用することにした。
use File::Slurp;
use XML::Simple;
use Data::Dumper;
my $xml = read_file("weatherYamanashi.rdf"); #ファイルの読み
my $parser = XML::Simple->new(); #XML::Simple使用準備
my $parser_data = $parser->XMLin( $xml); #取り込み
print Dumper($parser_data); #結果表示
〜取り込まれたデータ例
$VAR1 = {
'xmlns' => 'http://xml.kishou.go.jp/jmaxml1/',
'xmlns:jmx' => 'http://xml.kishou.go.jp/jmaxml1/',
'Control' => {
'DateTime' => '2024-02-11T01:34:15Z',
'Status' => "\x{901a}\x{5e38}",
'PublishingOffice' => "\x{7532}\x{5e9c}\x{5730}\x{65b9}\x{6c17}\x{8c61}\x{53f0}",
'EditorialOffice' => "\x{7532}\x{5e9c}\x{5730}\x{65b9}\x{6c17}\x{8c61}\x{53f0}",
'Title' => "\x{5e9c}\x{770c}\x{5929}\x{6c17}\x{4e88}\x{5831}\x{ff08}\x{ff32}\x{ff11}\x{ff09}"
},
'Head' => {
'xmlns' => 'http://xml.kishou.go.jp/jmaxml1/informationBasis1/',
'TargetDateTime' => '2024-02-11T11:00:00+09:00',
'Headline' => {
'Text' => {}
},
'InfoKind' => "\x{5e9c}\x{770c}\x{5929}\x{6c17}\x{4e88}\x{5831}",
'TargetDuration' => 'P2DT13H',
'EventID' => {},
'Serial' => {},
'Title' => "\x{5c71}\x{68a8}\x{770c}\x{5e9c}\x{770c}\x{5929}\x{6c17}\x{4e88}\x{5831}",
'InfoType' => "\x{767a}\x{8868}",
'InfoKindVersion' => '1.0_1',
'ReportDateTime' => '2024-02-11T11:00:00+09:00'
},
'xmlns:jmx_add' => 'http://xml.kishou.go.jp/jmaxml1/addition1/',
'Body' => {
'xmlns' => 'http://xml.kishou.go.jp/jmaxml1/body/meteorology1/',
'xmlns:jmx_eb' => 'http://xml.kishou.go.jp/jmaxml1/elementBasis1/',
'MeteorologicalInfos' => [
{
'TimeSeriesInfo' => [
{
'Item' => [
{
'Area' => {
'Code' => '190010',
'Name' => "\x{4e2d}\x{30fb}\x{897f}\x{90e8}"
---------------
ステップ5.必要な部分のみ取り出す
 例えば、天気予報の部分を取り出す
sub getJMAWeatherTenki{
my $data = shift; #取り込んだハッシュ
my $place_id = shift; #地域コード:富士五湖=1
my $time_id = shift; #今日=1,明日=2、明後日=3

my $content;
foreach my $weather_define ( @{$data->{Body}{MeteorologicalInfos}[0]{TimeSeriesInfo}[0]{Item}[$place_id]{Kind}[0]{Property}{WeatherPart}{'jmx_eb:Weather'}} ){
if( $weather_define->{refID}==$time_id ){
$content = $weather_define->{content};
}
}
return $content;
}
戻り値例:「くもり後晴れ」

<Gemini最初の指令>
weatherYamanashi.rdfを解析し、天気データ「{jmx_eb:Weather}」の「{refID}」が一致する文字列「{content}」を得よ。
解答→得た答えを修正して上記を仕上げた。
---------------
ステップ6.天気予報の文字から画像を作成する
 まず以下の画像データを意味付けしたファイル名で作成する。
 文字列から画像ファイル名を構成する。
sub getJMAWeatherImg{
my $weather_str = shift; #天気文字列
my $time_id = shift; # my %exDayId = ( '今日' => 1, '明日' => 2, '明後日' => 3 );

use constant WEATHER_CODES => { '晴れ' => 1, 'くもり' => 2, '雨' => 3, '雪' => 4, };
use constant TIME_CODES => { '時々' => 1, '後' => 2, };

my @parts = split(/(後|時々)/, $weather_str);
my $a = WEATHER_CODES->{ $parts[0] } || 0;
my $b = TIME_CODES->{ $parts[1] } || 0;
my $c = WEATHER_CODES->{ $parts[2] } || 0;
my $p = 0;
my $name; #以下は「今夜」の場合を考慮する
foreach my $time_define ( @{$exParserData->{Body}{MeteorologicalInfos}[0]{TimeSeriesInfo}[0]{TimeDefines}{TimeDefine}} ){
if( $time_define->{timeId}==$time_id ){
$name = $time_define->{Name};
}
}
Jcode::convert( \$name, 'utf-8'); #ファイル内はUTF-8だが、そのままでは使用できない
my $fDayw = Jcode::convert( '今夜', 'utf-8'); #そのため比べる両者をUTF-8で再矯正する
if( $name eq $fDayw ){ $p = 1; }
my $fileImg = sprintf("tnk%04d.png", $p . $a . $b . $c);
return $fileImg;
}
 何故か文字化けが発生し苦労したが上記の方法で回避

<Gemini最初の指令>
「晴れ」、「晴れ後くもり」、「雨時々雪」と言った文字列があります。
「後」と「時々」をキーに文字列を前後に分けて上の例なら、
「晴れ」、「晴れ」「後」「くもり」、「雨」「時々」「雪」と文字列を分解するperlプログラムを書け。

得た文字列を、「晴れ」=1、「くもり」=2、…のように3桁の数字に置き換えよ。
解答→得た答えを修正して上記を仕上げた。
---------------
ステップ7.以上のプログラムを半分以上生成AIに手伝ってもらい完成させた。
 あとは自分の環境に合わせて関数化し汎用ライブラリーとして保管。
---------------

 以上、動作例は「https://live.fujigoko.tv/?n=30」等を参照。

今回は自身と気象庁のサーバー負荷を考え以上のようにしたが、「ステップ1」と「ステップ2」を省いて全てperlで記述すればその都度全国の気象データを得ることができる。
具体的には、https://www.data.jma.go.jp/developer/xml/feed/regular_l.xmlから全国の気象データを抽出すれば良いようにプログラムをさらに汎用化し公開もできる。
が、自身のサーバーでそのサービスを提供するメリットがあるかどうかと考えてしまった。

#コンピュータ #AI #人工知能 #プログラム 

コメント

削除修正新規









 
富士山周辺特派員MENU
すべての投稿報告
広域公共情報報告(標準表示)
会員のプライベート報告
富士五湖TVから報告

<<2024年>>10月
1 2 3 4 5 6 7 8 9 10 11 12

過去のタイトル(新着順)
静岡市立蒲原東小学校にて葛飾北斎の講演会を行いました

葛飾北斎の冨嶽三十六景「尾州不二見原」の模型の量産化できた

葛飾北斎の冨嶽三十六景のひとつ「尾州不二見原」の試作模型ができた。

富士市にて葛飾北斎の講演会を行います

フラックスを作る

PC-98顛末記その2 FD1238Tのベルト交換

PC-98Noteが壊れた。

2024年4月14日富士山火入れ野焼きの空撮動画

金庫の仕組みを3Dプリンターで

LEDで点滅する北斎の冨嶽三十六景

自動餌やり機

気象庁発表の天気予報をHPに表示する。

漫画にかける青春録

数字であそぼ。

Suno AI, chatGPT, 最新のAIでどこまで楽曲ができるか? その2

Suno AI, chatGPT, 最新のAIでどこまで楽曲ができるか?

弾いてみた - Room 335

弾いてみた - Europa

弾いてみた - Hotel California

弾いてみた - Smoke on the Water

弾いてみた - 傷だらけの天使

過去のFacebookから転載「SONY VECTRON」

過去のFacebookから転載「T-Boardについて」

chatGPTとともにLUAで動画配信OBSでカメラシーンを切り替えるスクリプトのプログラム

蝙蝠オーグのアジトは河口湖ステラシアターだった⁉

五合目のライブカメラの復旧

ChatGPTが予言したAIの支配するシナリオ

今話題のChatGPTでAI本人と人工知能の将来を語ってみた

3Dプリンターでアポロ11号月面着陸船

公開されている3Dプリンター用のデータについて

最近のプラモデルは

パソコンでメインに使用している4K液晶が突然消えた。

3Dプリンターで宇宙戦艦ヤマトシリーズ

3Dプリンターで反射衛星砲を作成。

3DプリンターでT-Rex

3Dプリンターでシェルビー・コブラ

3Dプリンターでメルセデスベンツ SSK

富士宮市秋のまつり

河口湖は紅葉の時期を迎えました

3Dプリンターでシン・ゴジラ

iPhone14Proでスキャニング〜3D印刷

2022年火祭り交通規制

噴火かぁ

映画コンテイジョン

映画マトリックス再び

4月21日(水)22:30〜NHK歴史探偵に出演します。

富士山ライブ動画のタイムラプス 2021年3月26日、河口湖母の白滝から望む花火。

富士山で発生した火災の記録 - 20210204 Mt. Fuji fire.

富士山、樹海、河口湖、紅葉の空撮動画3本

忍野村の富士山写真コンクールの最優秀写真が合成との件

過去の投稿者(新着順)
久保覚 (富士五湖TV代表)


 
ホーム / 掲示板各種/ 気象庁発表の天気予報をHPに表示する。
 

Copyright (C) 2001 Fujigoko.TV. All Rights Reserved.