富士五湖TV

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

貸別荘 ぶらっと河口湖
河口湖北岸、富士山と河口湖が望める一戸建ての貸別荘。

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年>>4月
1 2 3 4 5 6 7 8 9 10 11 12

過去のタイトル(新着順)
PC-98Noteが壊れた。

富士五湖サミット

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

陳情

2024年 勝山さくら祭り

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

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

自動餌やり機

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

漫画にかける青春録

数字であそぼ。

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

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

流石やすし県政報告Vol.20 令和6年1月発行

弾いてみた - Room 335

弾いてみた - Europa

弾いてみた - Hotel California

弾いてみた - Smoke on the Water

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

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

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

会派研修

会派研修

2023年 道の駅かつやま 感謝祭

夜の県庁

1日だけの夏服

足和田地区陳情

*****

農政産業観光委員会の研修

農政産業観光委員会

新しい仲間と、

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

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

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

吉田高校同窓会

今年から、夜の県庁が、赤く

防災センターへ、

最初の仕事

第44回 甲斐の勝山やぶさめ祭り

第12回 富士・河口湖さくら祭り

令和5年 勝山さくら祭り スタンプラリー

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

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

堀内市長へ出馬要請

春には普通インフルエンザに?

12月定例会報告

明けましておめでとうございます。

来年春には、5ルイに

年末年始休まず営業します

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

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

流石やすし

勝山観光協会・勝山民宿組合

ビュー山中湖

Team Let's Fuji

富士河口湖小立オートキャンプ場鼻曲(はなまがり)

風のテラスKUKUNA くくな

中川雄三

インターリゾート東屋 (天野猶治)

富士五湖情報局(富士五湖TV)

富士山五合目観光協会

元祖室

河口湖美術館

社会福祉法人欣寿会・特別養護老人ホーム芙蓉荘

しゅうすいや・SHUSUIYA

くくな 周辺観光用

ニューブリッヂキャンプ場

富士写真家連盟

忍野観光農園 富士忍野ベリーランド

ウッドストック

山中湖レークサイドボウル

河口湖・ボートハウス ハワイ

株式会社ひまわり 山中湖店

フジシロ工業(有)

山中湖ペンション ブルーリボン

しゅんちゃんち

河口湖 観光遊覧屋形船

河口湖アートクラフトフェア

温泉民宿 丸弥荘

サンプル情報


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

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