前回は1つの標高データをRubyで編集し,GMTを使って描画しました.
今回は複数の標高データをRubyで編集します.
1.データの表示
はじめに,エディターを起動させてください.
「EoS」にある「ruby」のフォルダに「mems2z.rb」という名前でRubyスクリプトを作成します.
all_2nd_mesh = ["523601","523602","523603","523604","513601","513602","513603","513604"]
p all_2nd_mesh
上のように入力して,rubyを実行すると,
["523601","523602","523603","523604","513671","513672","513673","513674"]
と入力されます.
ここで,Rubyでの配列は[]で表します.
配列とはデータを入れる引き出しのようなものです.
付け加えて,
p all_2nd_mesh.size
と入力すると,
8
と表示されます.
これは,all_2nd_mesh内のデータの数が8個である,ということを表しています.
更に,
p all_2nd_mesh[3]
と入力すると,
"523604"
と表示されます.
これは,all_2nd_meshの[]の中にある前から4番目の値を表しています.
なぜ[3]なのに4番目なのかというと,Rubyでは番号を0から数えるからです.
次に,all_2nd_meshを上4個と下4個のデータでまとめようと思います.
all_2nd_mesh = [ ["523601","523602","523603","523604"],["513671","513672","513673","513674"] ]
と書き直してください.
そして,mems2z.rbを実行させると,
["523601","523602","523603","523604"],["513671","513672","513673","513674"]
2
nil
と表示されるはずです.
ここで,nilとはNo-Dataという意味です.(データが2個しかないのに,4番目の値があるわけがないですよね)
2.リージョンの設定
まず,前に入力した「p all_2nd_mesh」は以後使用しないので,コメントアウトして表示しないようにします.
「all_2nd_mesh」,「p all_2nd_mesh」,「p all_2nd_mesh.size」,「p all_2nd_mesh[3]」の前にシャープ(#)を入力してください.
データの範囲を指定するのに,データの左上(北西)と右下(南東)の位置で指定します.
ここで,1次メッシュの緯度をfN,経度をfE,2次メッシュの緯度をsN,経度をsEとする.
ここでは,練習を兼ねて,範囲を523501~513674にします.
region = ["523501","513674"]
そして,1個目のデータの経度を表示させます.
p fE1 = region[0][2,2]
変数の名前はできるだけ後で見ても意味のわかるようなものが望ましいです.fE1というのの意味は,1次メッシュ(first)の「f」,East-Westの「E」,配列1列目の「1」です.
これを実行すると,
"35"
と表示されるはずです.
どうしてこの結果になったのかというと,まず,「region[0]」でregionの1個目,つまり"523501"を指定しています.
次に,「[2,2]」で"523601"の前から3個目の文字から2文字を指定し,一番初めの「p」で表示させています.
つまり,
ということです.
今度は上の"35"を整数値として表示させます(デフォルトでは文字列です).
p fE1 = region[0][2,2].to_i
すると,今度は
35
と表示されたはずです.
同じように,regionの緯度と下一桁(2次メッシュの横の個数)を整数表示させます.
p fE1 = region[0][2,2].to_i
p fE2 = region[1][2,2].to_i
p sE1 = region[0][5,1].to_i
p sE2 = region[1][5,1].to_i
そして,上の4つの値を代入して横方向の2次メッシュの個数mを計算します.
p m = (fE2 - fE1) * 8 + sE2 - sE1 +1
ここで,(fE2 - fE1)を8倍しているのは2次メッシュが8進数だからです.
これを実行すると,
35
36
1
4
12
と表示されると思います.
同じように,regionの経度と下から2桁目(2次メッシュの縦の個数),縦方向の2次メッシュの個数nを表示させます.
p fN1 = region[0][0,2].to_i
p fN2 = region[1][0,2].to_i
p sN1 = region[0][4,1].to_i
p sN2 = region[1][4,1].to_i
p n = (fN1 - fN2) * 8 + sN1 - sN2 +1
ここで,結果が
52
51
0
7
2
となればOKです.
以上の値が合っていたら,それぞれの関数の先頭にある「p」を消してしまってください.
3.メッシュの読み込み
縦横の2次メッシュの数がn=12,m=2だとわかりました.
ここで,複数のメッシュのデータを1つのデータとしてまとめるスクリプトを書いていきます.
まず,空っぽの配列「all_2nd_mesh」を作ります.
データを入れるための棚を先に作っておくということです.
all_2nd_mesh = []
そして,はじめの北緯fNとsNをfN1,sN1としておきます.
fN = fN1; sN = sN1
では,横m個の2次メッシュを読み込むのを縦n個分繰り返すので,
n.times do |j|
と入力します.
sNを1個ずつ引いていくことになりますが,そのときに,「-1」となる値を「7」とします.
同じように,sEを1個ずつ足していくことになりますが,そのときに「8」を「0」にします.
fN = fN1; sN = sN1
n.times do |j|
if sN < 0
sN = 7; fN = fN - 1
end
fE = fE1; sE = sE1
m.times do |i|
if sE > 7
sE = 0; fE = fE + 1
end
p fN.to_s + fE.to_s + sN.to_s + sE.to_s
sE = sE + 1
end
sN = sN - 1
end
表示される結果が「"523501"」から「"513674"」になればOKです.
このとき,「to_s」というのは文字列にするという意味なので,表示される結果も文字列になります.
注意:上のスクリプトは半角スペースの代わりに全角スペースを入れています.これをコピー&ペーストする場合は,おそらくそのままではエラーが出ると思いますので,文末にリンクしているスクリプト全文からコピーするか,全角スペースを半角スペースに書き換えてください.
結果が正しければ,「p fN.to_s + fE.to_s + sN.to_s + sE.to_s」を配列「row」に代入することにします.
下のように書き換えてください.
書き換えた部分には「*」を表示しています.
n.times do |j|
if sN < 0
sN = 7; fN = fN - 1
end
row = [] *
fE = fE1; sE = sE1
m.times do |i|
if sE > 7
sE = 0; fE = fE + 1
end
row << fN.to_s + fE.to_s + sN.to_s + sE.to_s *
sE = sE + 1
end
all_2nd_mesh << row *
sN = sN - 1
end
p all_2nd_mesh *
上を実行すると,
[["523501","523502","523503","523504","523505","523506","523507","523600","523601","523602","523603","253604"],["513571","513572","513573","513574","513575","513576","513577","513670","513671","513672","513673",513674"]]
と表示されるはずです.
注意:上のスクリプトは半角スペースの代わりに全角スペースを入れています.これをコピー&ペーストする場合は,おそらくそのままではエラーが出ると思いますので,文末にリンクしているスクリプト全文からコピーするか,全角スペースを半角スペースに書き換えてください.
今回最終でできたスクリプトは
ここに表示しています.
もしよろしければ参考にどうぞ!
最終更新:2008年05月27日 13:59