GIS/RS knowledge base

Arcpyはじめのいっぽ

こんなときにはArcpyを使って処理するとべんりです。

pythonのおやくそく

各種処理のサンプル

シンプルな処理をしてみる

	# 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"

たくさんのファイルをあつめてマージしてみる

	# 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"

バッチ処理をしてみる

ここでの例:国土基本メッシュ単位に分割されたレーザー測量データ(カンマ区切りテキスト)を読み込んでESRI shape file 形式に変換する

入力データの生成など

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にファイル名の入った属性フィールドを追加

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の列をリストに変換する

# 各モジュールをインポートする

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]: として繰り返しの処理を行う

polyline 各フィーチャの方位角を属性フィールドに追加する処理

→Arcgis10のツールボックス用です(そのように作るよう頼まれたため)
→各フィーチャは一直線という前提で書いています(フィーチャの始終点の座標から方位角を求めている)

import arcpy
import math

# Script arguments
input_table = arcpy.GetParameterAsText(0)

# local variables

infc = input_table

# input feature class

arcpy.AddField_management(input_table, "azimuth_a", "DOUBLE", "10", "5", "", "", "NULLABLE", "")

# Identify the geometry field
#
desc = arcpy.Describe(infc)
shapefieldname = desc.ShapeFieldName

# Create search cursor
#
rows = arcpy.UpdateCursor(infc)

# Enter for loop for each feature/row
#
for row in rows:
    # Create the geometry object
    #
    feat = row.getValue(shapefieldname)

    #Set start point
    startpt = feat.firstPoint

    #Set Start coordinates
    startx = startpt.X
    starty = startpt.Y

    #Set end point
    endpt = feat.lastPoint

    #Set End coordinates
    endx = endpt.X
    endy = endpt.Y

    radian = math.atan((endx - startx)/(endy - starty))
    degree = radian * 180 / math.pi
    row.azimuth_a = degree
    rows.updateRow(row)

# delete cursor and row objects to remove lock on the data
del row
del rows

GRASSのコマンドを pythonで動かす

vect = 'vector_data_sample'
    for x in ("TS199504","TS199505","TS199506","TS199507","TS199508","TS199509","TS199510","TS199511","TS199512","TS199601","TS199605"):
        grass.run_command("v.to.rast", input = vect, output = str(x) + "_cs", use = "attr", column = str(x))

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS