- 追加された行はこの色です。
- 削除された行はこの色です。
[[GIS/RS knowledge base]]
#contents
*Arcpyはじめのいっぽ [#o9e760e6]
こんなときにはArcpyを使って処理するとべんりです。
--バッチ処理をしたいとき
--GUIで処理しようとしたら意味不明なエラーが出てきたとき
--マシンのスペックが低くてGUIを起動するだけで精いっぱいなとき~
結構簡単なのでお試しください。
--python用のエディタを用意するとよいです(Pythonインストール時に付いてくるIDLEでもよいです)~
テキストエディタでもよいですがpython用のエディタはインデント(pythonでは重要です)や関数などをわかりやすく整理・表示することができます。~
**シンプルな処理をしてみる [#h35c4c01]
# arcpyをインポートする
import arcpy
# 必要なエクステンションがあるかどうかをチェックする
# spatial analyst = "spatial"
# 3D analyst = "3D"
arcpy.CheckOutExtension("spatial")
# 入出力する変数を定義する
# パスとファイル名はダブルコーテーションで囲う
# パス区切りは\\で行う
hexagons_shp = "D:\\test\\hexagons.shp"
dem50gsi_j2ku54_img = "D:\\test\\dem50gsi_j2ku54.img"
output_table = "D:\\temp\\zst_slope_02.dbf"
# 処理コマンド中に上記変数を入力する
# 上記の変数以外の設定値はダブルコーテーションで囲って指定する
# どのような変数が必須かはHELPを参照する
arcpy.gp.ZonalStatisticsAsTable_sa(hexagons_shp, "Unique_ID", dem50gsi_j2ku54_img, output_table, "NODATA", "ALL")
# 処理が終了したらfinishという文字を表示させる
print "finish"
**たくさんのファイルをあつめてマージしてみる [#nffd14a7]
-ワイルドカード(*)を用いて複数ファイルを指定して実行する手順~
# globモジュールをインポートする
import glob
# arcpyをインポートする
import arcpy
# 出力ファイルのパスと名前を指定
outputdata = "C:\\temp\\ps_merge_all.shp"
# ワイルドカードを使用して入力データリストを指定
files = glob.glob('C:\\temp\\*.shp')
# Process: マージ (Merge)
arcpy.Merge_management(files, outputdata)
# 処理終了時にfinishと出力する
print "finish"
**バッチ処理をしてみる[#pc87b7e6]
ここでの例:国土基本メッシュ単位に分割されたレーザー測量データ(カンマ区切りテキスト)を読み込んでESRI shape file 形式に変換する~
-for文を使って複数ファイルに同じ処理を実施する~
# arcpyをインポートする
import arcpy
# 入力および出力ファイルのディレクトリを指定
input_dir = "D:\\last_p"
output_dir = "D:\\last_p_out"
# 以下より処理内容
try:
for x in [111, 222, 333, 444, 555, 666, 777, 888, 999]:
#変数の宣言
fc = input_dir + "\\13lf" + str(x) + "_l_org_h.txt"
fc2 = str(x) + "_la"
fc3 = output_dir + "\\13lf" + str(x) + "_p_j2kxy13.shp"
# Process: XY イベント レイヤの作成(Make XY Event Layer
arcpy.MakeXYEventLayer_management(fc, "x", "y", fc2, "", "z")
# Process: フィーチャのコピー(Copy Features)
arcpy.CopyFeatures_management(fc2, fc3, "", "0", "0", "0")
# 処理が1サイクル正常に終了したら出力ファイル名を表示させる
print str(x) + "_p_j2kxy13.shp"
# どこかで処理が停止した場合 "error" と表示させる
except:
print "error"
# すべての処理が正常に終了したら"finish"と表示させる
print "finish"
**pythonのおやくそく [#neeb3e44]
-見やすいコードが好ましいです。リストなどが長くなる場合は適宜改行を入れるとよいです。
-括弧の中は改行できる~
for x in [111, 222, 333, 444,
555, 666, 777, 888, 999]:
-文字列の改行にはトリプルクォーテーションを使う~
"""geometric~
correction"""~
みたいな感じ
**入力データの生成など[#pc87b7e6]
250m間隔で最大60kmまでテキストを出力~
(ex.250 500 750 1000・・・・)
# process for defining break value
# define minimum number
min_v = 250
# define maximum number
max_v = 60000
# define output text file
out_put = "C:\\temp\\output.txt"
# define range value
ini_v = min_v + min_v
end_v = max_v + min_v
int_v = min_v
# define break value
break_v = min_v
# set repeat number and interval
for x in range(ini_v,end_v,int_v):
break_v = str(break_v) + " " + str(x)
# process text file output
f = open(out_put, 'w')
f.write(break_v)
f.close()
print break_v
print "finish"
**フォルダ内すべてのshapefileにファイル名の入った属性フィールドを追加 [#xc1bac01]
import arcpy
import glob
import os.path
# set target directory
T_path = "C:\\temp\\"
# get file list as fullpath
listgps = glob.glob(T_path + "*.shp")
for f in listgps:
# Process: Add Field
arcpy.AddField_management(f, "orig_name", "TEXT", "", "", "100", "", "NULLABLE", "NON_REQUIRED", "")
# get file name from fullpath
f2 = os.path.basename(f)
# set formula into a specific format
f3 = "\"" + f2 + "\""
# Process: Calculate Field
arcpy.CalculateField_management(f, "orig_name", f3, "PYTHON", "")
print "finish"
** for文に挿入するためCSVの列をリストに変換する [#kb0e5f45]
スプレッドシート上に入力されたファイル名やIDに該当するデータのみを選択して処理したい、というケースに使います~
・特定のデータのみを選択して処理したい~
・選択するファイルの名称やIDがスプレッドシートに入力されている~
というケースに使います~
# 各モジュールをインポートする
import csv
import sys
# CSVファイルのフルパスを指定する
csvfile=open("C:\\temp\\list.csv")
# 各行のデータおよび各行の列数を格納するリストをそれぞれ宣言する
rowlist = []
colnum = []
# 1行毎にリストにし列数をカウントする
for row in csv.reader(csvfile):
rowlist.append(row)
colnum.append(len(row))
# 行列変換 (各列の要素をリストにする)
collist = []
for colnum in range(max(colnum)):
eachcollist = []
for rownum in range(len(rowlist)):
eachcollist.append(rowlist[rownum][colnum])
collist.append(eachcollist)
# 行数(レコード数数)および列数の確認
print str(len(rowlist)) + " 行(レコード)"
countcol = len(collist)
print countcol,"列",
# 指定した行をリストとして表示し確認
# ただし指定列数から1を引いた値を指定すること (1列目だったら0と指定)
print collist[0]
あとは
for x in collist[0]:
として繰り返しの処理を行う