IDLEでArcpyを使用して、消去機能の処理時間を短縮する


8

私は18,000のフィーチャクラス(ファイルGDBに保存)を処理しており、それぞれ海域で約500レコード(ポリゴンフィーチャ)を持っています。また、Erase関数を使用して、海岸と重なるエリアを削除するスクリプトを実行しています。スクリプトは正常に実行されていますが、文字どおり完了するまでに数日かかります。一部のファイルの処理には数秒かかります(これは、海岸線と重複していないことが確認されているためです)、一部のフィーチャクラスの処理には1時間以上かかります。

私は自分のコンピューターでローカルで作業し、32ビットWindows 7、3.33 GHz Intel DuoCore、4 GB RAMコンピューター上のArcGIS 10.1(すべてのライセンス)を使用してIDLEでスクリプトを実行しています。

私はPythonでロープを学んでいます。処理時間を短縮するために実行できる手順がある場合は、スクリプトのヒントを本当に感謝しています。ありがとうございました!

# Import modules
import arcpy
import sys
import os
from arcpy import env

arcpy.env.overwriteOutput = True
print arcpy.env.overwriteOutput

#Erase coastline from selected buffers.
workspace = "C:\\DIR\\points_buff\\"
arcpy.env.workspace = workspace
erase_output = workspace+"erased.gdb\\"
erasedirectorypath = "C:\\DIR\\points_buff\\selectedbuff.gdb"
fileList = []

for dirpath, dirnames, erases in arcpy.da.Walk(erasedirectorypath,
                                              datatype="FeatureClass",
                                              type="Polygon"):
    for erase in erases:
        fileList.append(os.path.join(dirpath, erase))
        filenameparts = erase.split('_')
        if int(filenameparts[1]) > int(1967):

            try:
        #Set variables for Erase tool
                in_features = erasedirectorypath+"\\"+erase
                coastline_feat = "C:\\DIR\\Basic_NE.gdb\\Coastline_Eastern_US"
                out_erase_feat = erase_output+erase[:-4]+"_er"
                arcpy.Erase_analysis(in_features, coastline_feat, out_erase_feat, '')
                print arcpy.GetMessages()
                print "Coastline has been erased from " + erase + " and saved to " + erase_output

            except:
                print arcpy.GetMessages()

回答:


7

空間データを確認せずにスクリプトのトラブルシューティングを行うことは困難ですが、いくつかのトリックやアイデアがワークフローに役立つ場合があります。まず、データセットをサブセット化し、さまざまなアプローチを試します。タイムクロックをスクリプトに組み込んで、操作がどれほど速いか、または遅いかを実感してください。コマンドをtime.clock。でラップしてみてください。例えば:

import time
StartTime = time.clock()
arcpy.Erase_analysis(in_features, coastline_feat, out_erase_feat, '')
EndTime = time.clock()
print "Erase finished in %s hours" % ((EndTime - StartTime)/3600)
time.sleep(2.5)
  • インメモリワークスペースの機能を活用してみてください。一般に、実行される操作in_memoryは、ディスクに書き込まれる操作よりも高速です。in_memory中間操作に使用します。

  • Eraseコマンドを使用する代わりに、次の一連のコマンドを使用して同様のワークフローを実行します。

フィーチャレイヤーの作成(データ管理)

場所によるレイヤーの選択(データ管理)

機能の削除(データ管理)

コピー機能(データ管理)

  • ポリゴンが過度に複雑になっていますか? Dissolve(Data Management)が役立ちます。
  • 可能であればマスクを使用して、ラスターベースのアプローチを検討してください。

2
時間の計算は、特にデータの小さなサブセットに対して多くの異なるアプローチを試みている場合、メソッドを比較するために非常に貴重です。
アーロン

2
はい、削除(データ管理)を使用すると、スクリプト内のin_memoryファイルを簡単に削除できることに注意してください。
アーロン

4
コーストラインファイルにはフィーチャがいくつありますか。フィーチャの頂点の一般的な数はいくつですか。それはどのくらいの面積をカバーしていますか?フィーチャクラスは通常、どのくらいの面積をカバーしていますか?海岸線ファイルに非常に大きく複雑な機能がある場合、それが速度低下の原因である可能性があります。それが問題である場合、それを調整するために使用するいくつかの方法があります。
blord-castillo 2013

2
私は実際には反対のルートに行きます。最初にフィーチャをディゾルブし、次に大きなポリゴンを1つのポリゴンのいくつかの個別のフィーチャクラスに分割します。これらのサブセット化された単一フィーチャコーストラインフィーチャクラスの1つだけを、時間がかかった(および交差した)フィーチャクラスの1つに対して実行してみてください。それがあなたに何らかの改善をもたらすかどうか見てください。あなたの交差点のエンベロープは単に大きすぎて、オーバーレイ分析にすでに組み込まれているパフォーマンスの微調整をすべて取り除いていると思います。
blord-castillo 2013

4
テストする別のワークフロー。Minimum Bounding GeometryグループオプションALLとジオメトリタイプを使用して、ターゲットフィーチャクラスで実行しますENVELOPE。巨大な海岸線を使用して、結果のエンベロープフィーチャクラスを消去します。その消去からの出力を使用しClipて、元のターゲットフィーチャクラスで実行します。これにより、複雑なステップである消去が簡素化され、より小さな機能に対してより安価なクリップに置き換えられます。
blord-castillo 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.