ディレクトリに格納されている複数の航空レーザ測量のデータ(xxxx.txt)を
さっくりESRI shapefile形式(ポイント)に変換したいという相談があったので
pythonで書いてみました。
カンマで区切られたテキストの2列目がx 3列目がy 2列目がz
となっていたのでそれにあわせて書いてあります。
ogr2ogr使えばいいんだけど
筋トレ的に書いたので気にしない気にしない。
pyshpというライブラリが必要です。
コマンドプロンプトから
pip install pyshp
または
easy_install pyshp
でインストールできます。
pip も easy_install もインストールされていない場合は
このあたりからバイナリ(pyshp-1.2.0.win-amd64-py2.7.exe)をダウンロードして
インストールしてください。
その後以下をテキストエディタ等で適宜名前(ex. lp2shp.py)をつけて
Python27\Lib
直下に保存してください。
# 10/9追記:余計な処理をしてメモリを無駄に消費していたので修正
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import shapefile import csv import glob import os.path def lp2shp(fd): # ファイルリストの作成 flist = glob.glob(fd + "*.txt") # ファイルリスト毎に繰り返し処理 for i in flist: # テキストファイルの読み込み cobj = csv.reader(open(i, "rb")) # ESRI shapefile(point)をつくる w = shapefile.Writer(shapefile.POINT) # 属性フィールド elev(標高値)を float, 出力フィールド幅:15, 精度:5, で作成する w.field("elev", "F", 15, 5) # 属性フィールド flagを integer 出力フィールド幅:5 で作成する w.field("flag", "N", 5) # テキストの行毎の情報をもとにポイント作成 for j in cobj: # 2列目をx座標 3列目をy座標としてポイント作成 w.point(float(j[1]),float(j[2])) # 最初の属性フィールド(elev) に テキストファイル 4列目の情報を入力 # 2番目の属性フィールド(flag) に テキストファイル 5列目の情報を入力 w.record(float(j[3]),int(j[4])) # テキストファイルのフルパス情報からファイル名のみ抽出 os.path.basename(i) # ESRI Shapefileの保存(テキストファイルのファイル名に"_p"を追加した名称を付与) w.save(str(i)[0:-4] + "_p.shp") print "finished" if __name__ == '__main__': print "this is code block" |
その後、python(command line) 等で
1 2 |
import lp2shp as l l.lp2shp("C:\\temp\\") |
とテキストデータの入っているディレクトリを指定して実行してください。
同じディレクトリ内に xxxx_p.shp というファイル名でshapefileが出力されます。