ArcPyを使用してシェープファイル内の各ポリゴンの範囲を取得しますか?


20

ArcGIS 10およびPythonでは、シェープファイル内の各ポリゴンの範囲(xmax、ymax、xmin、ymin)情報を取得します。

を使用してシェープファイル全体の範囲を取得できます

file=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
desc=arcpy.Describe(file)
print desc.extent.Xmax

394551.52085039532

しかし、データセットの各行に同じ情報を取得する方法を理解することはできません。

rows = arcpy.SearchCursor("100k_trc_tiles_TVM")
for row in rows:
 print row

データセットの31行を印刷しますが、

for row in rows:
 desc=arcpy.Describe(row)
 print desc.extent.Xmax

エラーが発生します。

実行時エラー:オブジェクト:入力値の説明が有効なタイプではありません

「ジオメトリの計算」を使用して範囲値をテーブルに追加することを考えていましたが、これは重心のみを提供します。次に、row.GetValue( "xmax")のようなものを使用できると思います。

とはいえ、http://www.ian-ko.com/free/free_arcgis.htmの関数を使用してX / Y、max / minを作成できることはわかっていますが、追加する必要がなければ、特に、ArcPyがこれらの値を取得できる場合。

基本的に、データセットのサイズが大きいために分割ツールが失敗するため、ジオプロセシングのために30のデータエリア(1:100,000マップシートによる)をクリップするために、エクステントをクリップツールに取り込む必要があります(Intersectが提供する理由を参照)エラー999999:関数の実行中にエラーが発生しました無効なトポロジ[行数の多いエンドポイント]?)。多くのデータセットで繰り返されるので、これを自動化したいです。

===作業スクリプト===

# Emulates Arc Info SPLIT tool by using Clip but
# Requires a FC from which each row is used as the input clip feature.
# Each row must be rectangular.
# Used on 12GB FGDB with 100 million records.


#Licence: Creative Commons
#Created by: George Corea; georgec@atgis.com.au, coreagc@gmail.com
import arcpy, string

#inFrame=arcpy.GetParameterAsText(0) # Input dataframe FC
#inFile=arcpy.GetParameterAsText(1) # Input FC for splitting
#outDir=arcpy.GetParameterAsText(2) # Output FGDB

inFrame=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
inFile=r"c:\junk\106\data\7_Merge.gdb\FullRez_m2b"
outDir=r"D:\SCRATCH\Projects\206\datasplit\test_slaasp.gdb"
#NameField="Name_1"

#arcpy.env.workspace = r"C:/Workspace"
arcpy.env.overwriteOutput = True

rows = arcpy.SearchCursor(inFrame)
shapeName = arcpy.Describe(inFrame).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    Name = row.Name_1
    print "Executing clip on: "+str(Name)
    extent = feat.extent
    #print extent.XMin,extent.YMin,extent.XMax,extent.YMax
# Create an in_memory polygon
    XMAX = extent.XMax
    XMIN = extent.XMin
    YMAX = extent.YMax
    YMIN = extent.YMin
    pnt1 = arcpy.Point(XMIN, YMIN)
    pnt2 = arcpy.Point(XMIN, YMAX)
    pnt3 = arcpy.Point(XMAX, YMAX)
    pnt4 = arcpy.Point(XMAX, YMIN)
    array = arcpy.Array()
    array.add(pnt1)
    array.add(pnt2)
    array.add(pnt3)
    array.add(pnt4)
    array.add(pnt1)
    polygon = arcpy.Polygon(array)
    ShapeFile = outDir+"\\temp_poly"
    arcpy.CopyFeatures_management(polygon, ShapeFile)

    #print Name
### Set local variables
    in_features = inFile
    clip_features = ShapeFile
    out_feature_class = outDir+"\\"+Name
    xy_tolerance = "0.22"

    # Execute Clip

    try:
        arcpy.Clip_analysis(in_features, clip_features, out_feature_class, xy_tolerance)
        print "Completed: "+str(Name)
    except:
        error = arcpy.GetMessages()
        print "Failed on: "+str(Name)+" due to "+str(error)

2
あなたは例えば、単にメモリのポリゴンに使用し、ディスクにクリップ機能を記述する必要はありません:ポリゴン= arcpy.Polygon(配列)arcpy.Clip_analysis(in_features、多角形、out_feature_class、xy_tolerance)
user2856

TKS。行の範囲だけでなく、使用するように行を新しい形状ファイルにエクスポートする方法はありますか?これは、長方形以外のクリップも処理できるようにするためです。
GeorgeC

1
同じスクリプトでその機能でクリップする場合は、機能オブジェクトを使用します。繰り返しますが、形状ファイルにエクスポートする必要はありません。例:arcpy.Clip_analysis(in_features、feat、out_feature_class、xy_tolerance)
user2856

シェープファイル用か、シェープファイル内の各ポリゴン用か?ここでは、2つの別個のことについて話しているように見えます。
レイナー

シェープファイルにポリゴンオブジェクトが1つだけありますか?そうでない場合は、オブジェクトの範囲にforループを使用します。
アラゴン

回答:


26

カーソルでシェイプオブジェクトを取得し、extentプロパティにアクセスします。ArcGISヘルプでPythonでのジオメトリの操作を参照してください。

shapeName = arcpy.Describe(inFeatures).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    extent = feat.extent
    print extent.XMin,extent.YMin,extent.XMax,extent.YMax

1
ありがとうルーク。これはうまくいきました。誰かがツールを使用したい場合は、新しい作業コードを作成するために質問を編集します-Clipツールセットを繰り返し使用して、大きなフィーチャクラスの長方形の領域をクリップします。10GBのFGDBと1億レコードのデータセットでクラッシュすることなく、アーク情報分割ツールの機能をエミュレートします。
GeorgeC

一つのこと-名前属性を次のように試して、Name = row.Name_1に相当する列の名前をハードコーディングしなければなりませんでした。NameField = "Name_1"; Name = row.NameField; またはName = row + "。" + NameFieldで、NameField = arcpy.GetParameterAsText(2)で、NameはName_1列に保持されます。何か案は?注:「;」を使用しました 新しい行を示します。
GeorgeC

1
上記を考え出した-gis.stackexchange.com/questions/16586/からのrow.GetValue
GeorgeC

7

バウンディングコンテナツールセットは、正確に何をしたいん。コードスニペットだけが必要な場合は、スクリプト内の関数を調べて、エクステントを明示的に処理します。

編集

スクリプトは、後続の処理に使用できる、作成された出力ファイルの左、右、上、および下のフィールドに値を追加することを追加する必要があります


ありがとう。それをチェックアウトします。Pythonスクリプト/モデル内でコードを使用できることを願っています。
GeorgeC

2

ArcGIS 10で最小境界ジオメトリ(エンベロープ)(データ管理)を試したところ、すべてのフィールドでまったく同じように見えます。


1

別の方法は、シェープファイルでSearchCursor()を実行することです。その後、row.shape.extentを使用できます。

rows = arcpy.SearchCursor(shapefileName)

for row in rows:
   extent = row.shape.extent
   ...
   ...

1

ArcMapでのポリゴン頂点の座標の抽出で説明したように ポリゴンの頂点を取得してから、各頂点のx座標とy座標を属性テーブルのフィールドとして追加できます。これには、最大/最小座標を各ポリゴンに直接付加しないという制限がありますが、これはいくつかの方法で実現できます。

私が最もよく知っている方法は、pyshpモジュールを使用してxおよびyフィールドをpythonリストに読み込むことです。pyshpモジュールは、ソートして各ポリゴンの最大値と最小値を見つけることができます。次に、Pyshpを使用してライタークラスを開き、元のポリゴンに新しいフィールドを追加し、これらの最大値と最小値を正しいポリゴンに書き込みます。

これはarcpyを使用して行うことができると信じていますが、ジオプロセッサを使用して9.3でシェープファイルに書き込む際に多くの問題があったため、pyshpメソッドを好みますが、arcpyモジュールがこれらの問題を解決したかどうかはわかりません。


0

「XMax」の「M」を大文字にしてみましたか?私はそれがあるはずだと思う:

print desc.extent.XMax

の代わりに

print desc.extent.Xmax

ドキュメントに従って。もちろん、最初のコードスニペットがどのように機能したのか不思議に思います。どちらにしても、試してみてください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.