気象データを解く〜データをパソコンで解析する その1

  • 2012.08.13 Monday
  • 12:19


 気象データを解析しようと思うが、
どこから入手すればいいのか、どうやって解析すればいいのかについて覚え書き

できるだけ多くの気象に興味のある人(特にこれから研究しようとしている学生さん)に、
気象の知識だけでなく、コンピュータで気象解析ができるようになってくれればと思っています。


これまではテキストエディタ上でデータを見てきたが、
これを毎回行うのは非常に困難である。

できれば自動化してデータを閲覧、さらには解析できるようにしたい。

解凍ツールをそのまま載せてしまっても良いのだが、
できれば自分でプログラミングしていく方が良いと思うので(どのみち解析するのに、必要となることなので)、
難しいロジックの考え方だけ書いて書いておくことにする。

なお、使用する言語はVisual Basic 2008(これ以降ならどれでも良い。もしC#で書きたい人はそのままを翻訳すれば良いと思う)で書く。

また、Visual Basicはマイクロソフトのページから無料でダウンロードできるので、
この機会に是非ダウンロードして使ってみて欲しい。

使い方に関してはいつも通り他力ちゃんなので、ネットや本を読んでください。



なお、ソースはあくまで参考程度に必要最低限しか書いていないので、
バグを含んでいる可能性があるので、丸ごとコピーせずに考えながら処理していただきたい。



続きを読む >>

関連投稿
気象データを解く〜データを入手する
気象データを解く〜データを開く、前に用語とか整理
気象データを解く〜データを開く まずは基本的な第0節から
気象データを解く〜データを開く 第1節を読む
気象データを解く〜データを開く 第3節を読む
気象データを解く〜データを開く 第4節を読む
気象データを解く〜データを開く 第5節を読む
気象データを解く〜データを開く 第7節を読む
気象データを解く〜データを開く 続くデータを見ていく
気象データを解く〜データを開く surfファイルを読む

気象データを解く〜データをパソコンで解析する その2
気象データを解く〜データをパソコンで解析する その3
気象データを解く〜データをパソコンで解析する その4
気象データを解く〜データをパソコンで解析する その5

単位変換や気象計算覚え書き
単位変換覚え書き〜風向風速
 

さて、まずはファイルを開かなくてはいけない。

ファイルはバイナリファイルであるので、
 
Dim stFile As IO.FileStream = New IO.FileStream("データファイルのパス", IO.FileMode.Open)
Dim brFile As IO.BinaryReader = New IO.BinaryReader(SourceStream)
‌ 
Dim rByte() As Byte = brFile.ReadByte(stFile.Length)

とすれば、バイナリデータで読むことができる。
なお、データが長いので、処理の速さやメモリの使用などを考えると、
必要な時に必要な長さを取得していく方が良いかもしれない。
 
rByte = brFile.ReadByte(必要な長さ)

詳しい仕様はBinaryReaderのリファレンスを見てください。

今回は難しいことは抜きにしてrByteに全データを取得して読み取っていくことにする。


さて、話を先に進める前に、ファイルは開いたら閉じなければいけません。
 
Call brFile.Close
'Call brFile.Dispose 'BinaryReaderにはDisposeはない
brFile = Nothing
‌ 
'Call stFile.Close() 'Disposeが内部で呼び出されているので不要
Call stFile.Dispose
stFile= Nothing

これでファイルの読み取りは終わりである。
※Closeの処理内にDisposeがあるので、Disposeを書く必要はないけれど、念のため

では、データを読んでいくことにする。

基本的にオクテット(バイト)単位で読み取って行くわけで、
切り出す位置もほぼ固定なので、第5節までは単純に読み取れると思う。

たとえば、第0節は
先頭4バイトは次のようになるはずである。

rByte(0) → &H47 → Chr(&H47) → G
rByte(1) → &H52 → Chr(&H52) → R
rByte(2) → &H49 → Chr(&H49) → I
rbyte(3) → &H42 → Chr(&H42) → B

※配列の先頭は1番目ではなく0番目から始まる。
なので、rByte(0)となる。
ちなみに、末尾は stFile.Length - 1 番目となる。
これはプログラム言語の仕様ですので、ここでは詳しく解説しません。


プログラムで読み込んだファイルがGRIBファイルか確認する意味で
 
If rByte(0= &H47 AndAlso rByte(1= &H52 AndAlso rByte(2= &H49 AndAlso rbyte(3= &H42 Then
 '続きのバイト列を読む
Else
 Call MessageBox.Show("GRIBデータではありません。")
End If

とすれば誤ったファイルを読み込まなくても済む。

続く9〜16オクテットはデータ解読の通りですが、1オクテットは256進なので、数式がやや変わり、

03 x 256 x 256 x 256 = 50331648
02 x 256 x 256 = 131072
E9 x 256 = 59648
61 = 97

となる。

これを単純にプログラムするなら、
 
Dim fLength As Int64 = rByte(8) * 256L * 256L * 256L * 256L * 256L * 256L * 256L _
                     + rByte(9) * 256L * 256L * 256L * 256L * 256L * 256L _
                    + rByte(10) * 256L * 256L * 256L * 256L * 256L _
                    + rByte(11) * 256L * 256L * 256L * 256L _
                    + rByte(12) * 256L * 256L * 256L _
                    + rByte(13) * 256L * 256L _
                    + rByte(14) * 256L _
                    + rByte(15)

であるが、あまりソースとしては美しくないので、
 
For intB = 8I To 15I
‌ 
 fLength *= CLng(&H100)'&H100 = 256
 fLength += CLng(rByte(intB))
‌ 
Next intB

と書いた方が256L * 256L *・・・と書くより誤りがない(ただグルグル回すので処理速度は落ちるかもしれない)

なお、ビット演算が得意であれば、ビットシフトでも計算できる。
(VBではやや処理が遅くなると感じたので、自分はForループで処理している)


他の複数にまたがるオクテットも同じように行えばよいが、いちいちForループを書くのはこれまた誤りが生じるので、演算の部分を関数化してみると。
 
Private Function ByteToInt(ByRef Source() As Byte, ByVal Start As Int32, ByVal Length As Int32) As Int64
'Int32でもよいが、オーバーフローを考えるとUint32かInt64の方がいい
‌ 
        Dim rVal As Int64 = 0L
        Dim intB As Int32
        Dim intE As Int32 = Start + Length - 1I
‌ 
        For intB = Start To intE
‌ 
            rVal *= CLng(&H100)
            rVal += CLng(Source(intB))
‌ 
        Next intB
‌ 
        Return rVal
‌ 
End Function

といった感じになる。

値を取得するときは
 
Dim rValue As Int64 = ByteToInt(rByte, 8I, 8I)

と書けばよい
※9オクテット目は配列で言うなら9-1=8なので、引数Startには8を入れることになる。

さて、取得した値と実際のファイルの長さが正しいかどうかを確認するために、
 
If rValue = rByte.Length Then
  '正しい長さ
End If

と書けばよいだろう。

続く



あくまでサンプルソースですので、異常処理などは一切書いていません。
その辺は自分で悩んで処理を追加してください。
また、あらかじめ参照やインポートしているライブラリや端折って書いていることがあります。
その辺は暗黙で書いているので、サンプルをそのままコピペしても異常や注意情報が上がることがあります。
詳しくはネットや本を調べれば分かることなので、その辺も悩んで見てください。



関連投稿
気象データを解く〜データを入手する
気象データを解く〜データを開く、前に用語とか整理
気象データを解く〜データを開く まずは基本的な第0節から
気象データを解く〜データを開く 第1節を読む
気象データを解く〜データを開く 第3節を読む
気象データを解く〜データを開く 第4節を読む
気象データを解く〜データを開く 第5節を読む
気象データを解く〜データを開く 第7節を読む
気象データを解く〜データを開く 続くデータを見ていく
気象データを解く〜データを開く surfファイルを読む

気象データを解く〜データをパソコンで解析する その2
気象データを解く〜データをパソコンで解析する その3
気象データを解く〜データをパソコンで解析する その4
気象データを解く〜データをパソコンで解析する その5


単位変換や気象計算覚え書き
単位変換覚え書き〜風向風速


■修正
一部誤ったソースがあったので修正

 
コメント
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
<< June 2018 >>

search this site.

よく使う、検索される投稿

categories

アマゾン

楽天

selected entries

archives

recent comment

  • SharePointの容量がパンパン!?〜OneNoteの容量確認と履歴の完全削除
    rockecco (06/12)
  • SharePointの容量がパンパン!?〜OneNoteの容量確認と履歴の完全削除
    haru (05/24)
  • Thumbs.dbでフォルダが削除、名前の変更ができない件
    rockecco (05/18)
  • Thumbs.dbでフォルダが削除、名前の変更ができない件
    rockecco (05/18)
  • Thumbs.dbでフォルダが削除、名前の変更ができない件
    BWM (05/16)
  • Thumbs.dbでフォルダが削除、名前の変更ができない件
    通りすがり (05/09)
  • Windows Updateのサービスが起動していない
    rockecco (04/25)
  • Windows Updateのサービスが起動していない
    hiro (04/21)
  • Windows10 1607 のタスクスケジューラの挙動がおかしい?
    rockecco (03/27)
  • Windows10 1607 のタスクスケジューラの挙動がおかしい?
    Hiro (03/27)

recent trackback

profile


※当ブログはリンクフリーですが、 取材や雑誌等で掲載される場合は、事前にお知らせください

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM