昨日夜10時
「明日までにxxフォルダ内の等高線ベクタデータから100m間隔のデータを作っといて」
とさっくり依頼された。
数百ファイルにわかれて30GBくらいあるんだけど・・・
finds.jpの WMSじゃダメ? と一応聞いてみたが
ローカルに持っておきたいとのこと。
しょうがないので以下の内容(作者さまに感謝)をちょっと変えて
3の倍数でアホになるアレで以下のような処理を行った。
https://code.google.com/p/geospatialpython/source/browse/trunk/subset.py
あ、でも OGR を使えばもっと簡単だったのかも。
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 33 34 35 |
import shapefile import os import fnmatch # データが保存されているパスをセット dir_p = "C:¥¥temp_ctr¥¥" # 拡張子を指定(*.shp) ext = "*.shp" # *.shpのファイル名を抽出しリストにする shplist = fnmatch.filter(os.listdir(dir_p), ext) # データのサブセット処理 try: for i in shplist: # データの読み込み r = shapefile.Reader(dir_p + str(i)) # 書き込みインスタンスを定義(ポリライン) w = shapefile.Writer(shapeType=shapefile.POLYLINE) # 属性フィールドをコピー w.fields = list(r.fields) # 空のリストをつくる sel_list = [] for rec in enumerate(r.records()): # 100の倍数の標高値(8列目の属性フィールドに格納されている)を持つ等高線を抽出し書き込む if rec[1][7] % 100 == 0: sel_list.append(rec) # ジオメトリと属性値を書き込む for rec in sel_list: w._shapes.append(r.shape(rec[0])) w.records.append(rec[1]) # shapefileとして保存する(ファイル名の先頭にctr100mを付与) w.save(dir_p + "ctr100m" + str(i)) except: print "error!" print "finish all" |