国土数値情報の変換データをむりやりなおす [GIS]
国土数値情報データ変換ツールでシェープファイルに変換したデータはフィールド型が文字列になってしまうようだ。あと、フィールド名が仮名漢字だったりする。ということで、土地利用3次メッシュデータを変換したシェープファイル(正確にいうとshpファイルではなくdbfファイル)のフィールド名をローマ字にして、フィールド型を整数にするRubyスクリプトをかいてみた。参考にしたのはシェープファイルの技術情報。
これを
こうした。
#!/usr/bin/ruby # -*- coding: utf-8 -*- ## 国土数値情報コンバータで生成されたL03-a-*.dbfの ## フィールド名とフィールド型を変換する # プログラム名 progName = "L03C2N.rb" # フィールド名 fldName = ["Suiden", # 田 "Nouyouti", # その他の農用地 "Sinrin", # 森林 "Areti", # 荒地 "Tatemono", # 建物用地 "Koutuu", # 幹線交通用地 "Sonota", # その他の用地 "KasenKosyo", # 河川地及び湖沼 "Kaihin", # 海浜 "Kaisui", # 海水域 "Golf"] # ゴルフ場 numFld = fldName.length # フィールドの数 hdrSize = 32 # ヘッダーのバイト数 fldSize = 32 # 1フィールドのバイト数 fldNameSize = 11 # フィールド名のバイト数 buffSize = 4096 # 1度に読み込むバイト数 if (ARGV.length == 0) $stderr.print("usage: " + progName + " file1 file2 ...\n") else ARGV.each do |path| file = File.basename(path) if (!File.exist?(path)) $stderr.print(path + ": file not found.\n") elsif (!File.fnmatch("L03-a*.dbf", file)) $stderr.print(path + ": invalid file.\n") else $stderr.print("processing: " + path + "\n") oldpath = path + ".orig" newpath = path + ".temp" if ((fi = open(path, "r")) && (fo = open(newpath, "w"))) # 先頭部分の読み込み if (buf = fi.read(buffSize)) (0 .. (numFld - 1)).each do |i| # フィールドの先頭位置 p = hdrSize + fldSize * i # フィールド名を置換 s = (fldName[i] + "\0" * fldNameSize)[0, fldNameSize] buf[p, fldNameSize] = s # フィールド型を"N"に置換 buf[p + fldNameSize] = "N" end fo.write(buf) end # 残り while (buf = fi.read(buffSize)) fo.write(buf) end else abort("file error.\n") end fi.close() fo.close() # rename File.rename(path, oldpath) File.rename(newpath, path) end end end
これを
こうした。
タグ:GIS
コメント 0