ゾーン統計2は、致命的なエラーを引き起こすことになります。代替手段はありますか?

Aug 19 2020

最近、ゾーン統計では処理されないポリゴンが重複しているため、通常の「ゾーン統計」の代わりに「テーブル2としてのゾーン統計」補足ツールを使用するように切り替えました。ただし、ゾーン統計2を数回実行しようとしましたが、夜間に何時間も実行した後、致命的なエラーが発生し、終了しません。この問題を改善する方法がわかりません。100,000を超えるバッファーポリゴン内の平均標高を計算しようとしていますが、他のラスターレイヤーでこれを複数回実行する必要があります。ツールにコマンドを完了するための代替手段または方法はありますか?

回答

2 FelixIP Aug 19 2020 at 06:59

これを解決するには、ポリゴンをオーバーラップせずにグループに分割する必要があります。グラフ彩色と呼ばれます。

以下のスクリプトを機能させるには、a)networkxパッケージをインストールし、b)実行します。

PolygonNeighbors("POLYGONS", "neighbours", area_overlap="AREA_OVERLAP")

脚本:

'''
creates non-adjacent groups of polygons
'''
import arcpy
import networkx as nx
infc = arcpy.GetParameterAsText(0)
table = arcpy.GetParameterAsText(1)

sourceList=[f.name for f in arcpy.ListFields(table)]
FTO=sourceList[1:3]
fromto=arcpy.da.TableToNumPyArray(table,FTO)
try:arcpy.AddField_management(infc, "COLOR","Short")
except:pass
G=nx.Graph()
G.add_edges_from(fromto)

allGroups=sorted(nx.connected_components(G), key = len, reverse=True)

arcpy.AddMessage("%i connected groups found" %len(allGroups))
D={}
for item in allGroups:
    arcpy.AddMessage(len(item))
    subG=G.subgraph(item)
    d = nx.coloring.greedy_color(subG, strategy=nx.coloring.strategy_largest_first)
    D.update(d)
    with arcpy.da.UpdateCursor(infc,("OID@","COLOR")) as cursor:
        for row in cursor:
            if row[0] not in item:continue
            row[1]=D[row[0]]+1
            cursor.updateRow(row)
arcpy.AddMessage("Done")

フィールド「COLOR」に範囲(1..4)の数値を追加して入力します。これは理論上の範囲であり、重複の程度に応じて、より大きなものが予想されます。最悪のシナリオは7色だと思います。2つのパラメーターを持つツールにスクリプトを割り当てたくない場合は、入力フィーチャクラス(infc)と隣接テーブル(table)をハードコーディングすることができます。

スクリプトは島のポリゴンをスキップすることに注意してください。これにより、フィーチャクラスのソースに応じて、フィールドCOLORの値がNoneまたは0になります。

続行する方法について、いくつかのオプションがあります。

  1. 定義クエリ(「COLOR」= 1など)を使用してPOLYGONSからn個のレイヤーを手動で定義し、それぞれに対してゾーン統計を実行します。結果をマージします。
  2. 上記のタスクを自動化するためのスクリプトを作成するか、モデルを開発します。

処理範囲とセルサイズの環境設定を台無しにするか、ラスターとバッファーで異なる投影法を使用しない限り、これがゾーン統計2が舞台裏で行うこととまったく同じであると思われます。失敗する理由はわかりません。