dbfの操作は、dbfpyを利用しました。
- 国勢調査のshapeしかテストしていないので、未知の型だと動かないかも
- sjisじゃない文字列だとエラーになりました。
- 最大文字列長ではなく、フィールド定義の文字列数を2倍にしてます。ファイルサイズが気になる方は、先に一回全レコードを走査して最大文字列長を取るといいと思います。
- マイクロソフト版Shift_jis拡張文字コードのcp932を指定
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- from dbfpy import dbf
- import os,sys,shutil
- #http://dbfpy.sourceforge.net/
- def convertDbf(dname):
- #バックアップの作成
- nname = dname[:-4]+".bk"+dname[-4:]
- shutil.move(dname,nname)
- db = dbf.Dbf(nname)
- bfh = dbf.Dbf(dname, new=True)
- #header の作成
- for f in db.fieldDefs:
- (name , type,len,dec) = f.fieldInfo()
- print f
- # KEY_CODE C 11 0
- # SETAI N 10 0
- # X_CODE N 19 5
- if type == "C":
- bfh.addField((name, type, len*2))
- if type == "N":
- bfh.addField((name,"N", len, dec))
- else:
- bfh.addField((name, type, len))
- #data のコピーと文字コード変換
- for rec in db:
- n = bfh.newRecord()
- for f in db.fieldDefs:
- (name , type,len,dec) = f.fieldInfo()
- if type == "C":
- n[name] = unicode(rec[name],"cp932").encode('utf-8')
- else:
- n[name] = rec[name]
- n.store()
- bfh.close()
- #############
- for f in os.listdir(os.getcwd()):
- if os.path.isfile(f) == True and f[-3:] == "dbf":
- print f
- convertDbf(f)
合わせて読む
ogr2ogrでshpefileをKML化
娘のサンプルだとKML化後に文字コード変換しているので、事前に変換しておくとよいかも