今回は,前回までにテキストエディタで作成した3つのメソッド(region2mn,all_2nd,make_z)を,新たにMEM2Zとして一つにまとめる作業を行います.
classで3つをまとめる
コマンドプロンプトを立ち上げます.
いつもの作業場所(C:\EoS\ruby)に移動して,
copy mems2z.rb mems2z080603.rbを実行します.
ディレクトリ(dir)をとってmems2z080603.rbファイルが作られているか確認してください.
これは前回のゼミの際につくった内容を別名(mems2z080603.rb)で保存しておいて,mems2Zに新たに手を加えるためです.
こまめにディレクトリをとって,中身を確認するようにしてください☆
エディタを立ち上げてmems2z.rbを開きます.
まずはじめにregion,ディレクトリ,出力するファイル名等を定義します.
ファイルの一番最初に,以下のように書いてください.
region = ["523601","513674"];dir = "O:/DATA/Japan2/";out_file = "temp.z" #定義
3つのメソッドをまとめて一つに統合したいので,一番上にclassを入れます.
classを使って新たにMEM2Zを作ります.
"class"のあとは必ず1つスペースを空けて,先頭は大文字にしなければならないという決まりごとがあります.
また単語の前に"@"がついているものがありますが,これをつけるとlocal変数をインスタンス変数に変えることが出来ます.
例えばただの"region"の場合だと,"region"の中でしか使うことが出来ませんが,"@"をつけるとregion以外の場所でも使うことが出来るようになります.便利ですね.
さきほどの続きから以下のように書いてください.
class MEM2Z
#Initialize
def initialize(region,dir,out_file) #定義
@region = region #regionを@regionに代入
@dir = dir #dirを@dirに代入
@out_file = out_file #out_fileを@out_fileに代入
end
def process #processを定義
region2mn
p [@m,@n] #m,nの計算結果を表示
all_2nd
p @all_2nd_mesh #2次メッシュ番号を表示
make_z
end
これで最初の定義が終わりました.
region2mnの箇所に手を加えます.
fE1,sE1,fN1,sN1(同様にfE2,sE2...も),m,nの前にそれぞれ"@"をつけてください.
また"def region2mn"の行以降すべての行の頭を2つ下げてください.
これは最後の行にendを加え,classの頭と揃えるためです.
# m,nの計算
def region2mn
@fE1 = @region[0][2,2].to_i #fはfirst,Eは東西
@fE2 = @region[1][2,2].to_i
@sE1 = @region[0][5,1].to_i
@sE2 = @region[1][5,1].to_i
@m = (@fE2 - @fE1) * 8 + @sE2 - @sE1 + 1
@fN1 = @region[0][0,2].to_i #fはfirst,Eは東西
@fN2 = @region[1][0,2].to_i
@sN1 = @region[0][4,1].to_i
@sN2 = @region[1][4,1].to_i
@n = (@fN1 - @fN2) * 8 + @sN1 - @sN2 + 1
#[m,n,fE1,sE1,fN1,sN1]
end
#m
,n,fE1,sE1,fN1,sN1 = region2mn(region) #コメント文にする
#p
[m,n]
ここで,m,nがきちんと計算されるかどうか確かめます.
m,nの計算結果のみを見たいので,ここでは残り2つ(all_2ndとmake_z)は先頭に#をつけてしまいます.
def process
region2mn
p [@m,@n]
all_2nd
#p @all_2nd_mesh
#make_z
end
コマンドプロンプトでruby mems2z.rbを実行して
[4,2]
と表示されればokです.
つぎに,all_2nd_meshについて部分的に書き換えます.
# 全2次メッシュ番号配列作成
def all_2nd
@all_2nd_mesh = []
fN = @fN1; sN = @sN1
@n.times do |j|
if sN < 0
sN = 7; fN -= 1
end
fE = @fE1; sE = @sE1
row = []
@m.times do |i|
if sE > 7
sE = 0; fE += 1
end
row << fN.to_s + fE.to_s + sN.to_s + sE.to_s
sE += 1
end
@all_2nd_mesh << row
sN -= 1
end
end
#m
,n,fE1,sE1,fN1,sN1 = region2mn(region)
#p
all_2nd_mesh = all_2nd(m,n,fE1,sE1,fN1,sN1)
#make_z
#__END__
そしてさきほどの"#p @all_2nd_mesh"の"#"だけを消します.
def process
region2mn
p [@m,@n]
all_2nd
p @all_2nd_mesh
#make_z
end
コマンドプロンプトで再びruby mems2z.rbを実行させます.
うまく,
[4,2]
[["523601","523602","523603","523604"],["513671","513672","513673","513674"]]
と表示されればokです!
最後のmake_zについてですが,今回のゼミでは最後までできなかったので,次回の内容に加わることになると思います.
make_zについて途中までですが,のせておきます.
未完成ですが,参考にしていただければ幸いです☆
# 標高値ファイルtemp.zの作成
def make_z
out = open("@out_file","w")
@all_2nd_mesh.each do |row|
f_mesh = { }
201.times do |j|
row.each do |mesh|
if j == 0
first_mesh = mesh[0,4]
p file = @dir + first_mesh + "/" + mesh + ".mem"
if File.exist?(file)
f_mesh[mesh] = open(file); puts file
f_mesh[mesh].gets
end
else
line = f_mesh[mesh].gets
200.times do |i|
z = line[9+i*5,4] #9+i*5桁目から4個とってくる
out.puts z
end
end
end
end
f_mesh.each{|mesh,f| f.close}
end
out.close
end
end #最初のclassと対応
#m
,n,fE1,sE1,fN1,sN1 = region2mn(region)
#p
[m,n,fE1,sE1,fN1,sN1]
#p
all_2nd_mesh = all_2nd(m,n,fE1,sE1,fN1,sN1)
#make_z
########################################################
pro = MEM2Z.new(region,dir,out_file)
pro.process
__END__
@をつける箇所が多いので,見落とさないように注意してください☆
今回の作業はここまでです.お疲れ様でした☆
最終更新:2008年06月23日 16:57