SSブログ

国土数値情報の変換データをむりやりなおす [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


これを
スクリーンショット(2010-01-20-20.30.09).png

こうした。
スクリーンショット(2010-01-20-20.39.19).png
タグ:GIS
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0