今回は,前回までにテキストエディタで作成した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