各ポリゴンの頂点の数を抽出していますか?


14

私はArcGIS Desktop 10.2を持っていますが、私の挑戦は、このようなすべての機能の各ポリゴンの頂点数を抽出する方法です。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

フィーチャクラスに多数のパーセルがあり、すべてのフィーチャの頂点の数を個別に抽出し、すべての頂点のXY座標を表示したい。

詳細については、各ポリゴンの頂点を変換し、1つの数字から始まる各頂点の数を表示するだけなので、ポリゴンがあり、4つの頂点がある場合、ポリゴンを頂点に変換するには、このような頂点の数を表示します(1、2、3、4、5)、各頂点のxyを表示し、実際のチャレンジIDに、すべてのポリゴンを頂点に変換し、頂点の数を1から開始する方法を考えます。


編集に基づいて、各フィーチャに、フィーチャおよび XY座標ごとに一意のID(1 .... n)を持たせますか?たとえば、[1、942744.1234、924654.1234] [2、952744.1234、925654.1234]などのように、ラベル付けの目的でこの情報すべてを1つの列/フィールドに含めることを希望しますか?
アーロン

ええ、間違いではありませんが、1つのフィールドには、このような各ポリゴンの頂点数のIDがあります(1,2,3,4)、(1,2,3,4,5)、(1,2,3,4、 5,6、)、(1,2,3,4,5,6,7,8,9)など、次に、arctoolboxからadd xyツールを呼び出した場合、xyが簡単になると思う
GIS Man

回答:


5

以下のコードは、他の回答を組み合わせて、頂点に番号を付けるためにビットを追加します。 結果

import arcpy
arcpy.env.workspace = "in_memory"
#paths
fc = r"...\polygons"
fc_out = r"...\vertices"
arcpy.MakeFeatureLayer_management(fc, "lyr")
# add fields if needed
for FIELD in ["DRAW_ORDER", "COUNT"]:
    if FIELD not in [field.name for field in arcpy.ListFields(fc)]:
        try:
            arcpy.AddField_management("lyr", FIELD, "SHORT")
        except Exception as e:
            print e
# get the number of points minus overlapping (@dmahr - GSE)
arcpy.CalculateField_management("lyr", "COUNT", "!Shape!.pointCount-!Shape!.partCount", "PYTHON")
# dict to iterate and check count
OIDS = {}
for row in arcpy.da.SearchCursor("lyr", ["OBJECTID", "COUNT"]):
    OIDS[row[0]] = row[1]
del row
# get vertices as points and add XY (@Aaron - GSE)
arcpy.FeatureVerticesToPoints_management("lyr", fc_out)
arcpy.AddXY_management(fc_out)
# start adding a number to the points
for OID in OIDS:
    order_count = 1
    rows = arcpy.da.UpdateCursor(fc_out, ["DRAW_ORDER", "COUNT"], "ORIG_FID = %d"%OID)
    for row in rows:
        # will leave the overlapping as NULL
        if order_count <= OIDS[OID]:
            row[0] = order_count
            rows.updateRow(row)
            order_count += 1
##        # this can set the overlapping to 0 or some unique value (999)
##        else:
##            row[0] = 0
##            rows.updateRow(row)

ポイントには描画順にラベルが付けられます。最後のポイント(最初のポイントの下)にはラベルがありません。再構築に不要な場合は、ヌルまたは一意の「DRAW_ORDER」値を持つすべてのポイントを選択することで削除できます。定義クエリを使用して、重複するポイントを表示から削除できます。

XYデータは存在しますが、それはラベル付け/表示の要望にお任せします。ラベル付けのためのXYフィールドの追加に関するアーロンの回答を参照してください。

また、FeatureClassでnumpy配列をいじっていましたが、最初にこれを終了しました。


@ gm70560に感謝します。コード変数に従って.pyとして保存しましたが、実行しようとすると、「指定されたフィールド名がテーブル内に存在しません」というエラーメッセージが表示されます。 ?
GISマン14

ここで、あなたのコードを使用する方法についてのガイドラインを作ることができる場合、私はちょうど、ターゲットフィーチャクラスパスを設定し、出力新しいフィーチャクラスのパス、あなたのコードでは、印刷画面が自分のPCを形成しているimageshack.com/i/ fvsozep
GISマン

フィールド(?)は追加されませんでした。結果でさらに何が起こったのですか?すべての結果をダンプするチャットルームがあります。部屋を確認できるようにコメントを残してください。
gm70560 14

22

これを行う最も簡単な方法は、パーセルレイヤーの属性テーブルに新しい整数フィールドを追加することです。次に、次の式を使用してフィールド計算機を実行します。

!Shape!.pointCount-!Shape!.partCount

!Shape!.pointCountフィーチャの頂点の総数を返します。ただし、フィーチャを閉じるために、各パーツの最初の頂点が最後で繰り返されます。これを処理するには、を使用して各パーツの1つの頂点を減算し-!Shape!.partCountます。

この式が機能するには、Pythonパーサーを使用する必要があることに注意してください。

フィールド計算機


これは非常にクールですが、これらの頂点のそれぞれにXYを提供しません。答えは、両方の応答(つまり、@ Aaronも)を使用して、要求されたすべての情報を取得することです。
ローランド14年

@Rolandあなたは正しいです...私はXY頂点に関する質問の一部を見逃しました。その場合はSearchCursor、Aaronの回答にある方法、またはFeature Vertices To Pointsなどのジオプロセシングツールを使用する必要があります(ただし、このツールにはArcGIS for Desktop Advancedライセンスが必要です)。
dmahr

@dmahr、ありがとうございました、値を計算すると、結果は頂点のカウント数であるため、ステップが欠落していると思いますので、5つの頂点を持つパーセルフィーチャクラスがある場合、この1,2,3のように表示したいです、4,5、各頂点で、すべての頂点を1つの数字でカウントするのではなく、実際の課題は、各区画の1つの数字から始まる各頂点の数字の表示方法です。
GISマン14年

12

dmahrは、頂点をカウントするための優れたソリューションを提供しました。XY座標で各ポイントにラベルを付ける非プログラム的な方法については、次のワークフローを試してください。

  1. ポイントへの機能頂点
  2. 新しいポイントFC「X」、「Y」に2つの新しいフィールド(タイプ:double)を追加します
  3. ジオメトリを計算します。フィールドを右クリック>ジオメトリを計算...>ポイントのX座標(Yフィールドに対して繰り返し)
  4. 別のフィールド「XY」を追加(タイプ:テキスト)
  5. フィールド計算機で「XY」フィールドを計算します。XY=

    str(!x!)+ "、" + str(!y!)

  6. ラベル機能。右クリックレイヤー>ラベル>ラベルフィールド:XY

これにより、次の結果が生成されます。

ここに画像の説明を入力してください

またexplode_to_points検索カーソルを使用して(開始として)これらのアクションをプログラムで実行することもできます

フィーチャを個々のポイントまたは頂点に分解します。explode_to_pointsがTrueに設定されている場合、たとえば5つのポイントを持つマルチポイントフィーチャは5つの行で表されます。

(デフォルト値はFalseです)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})

いくつかの後処理が必要になるか、@ dmahrの答えを使用して、頂点数の機能ごとの合計を取得するようです。
ローランド14年

4

新しいフィールドを計算するのではなく、レイヤーごとの頂点の数を非常にすばやく取得したい場合(Webでデータセットを公開するときなどの一般化目的)、カスタムスクリプトツールを作成することができますツールボックスを使用するか、コードをPythonアドインとして公開します。

カスタムスクリプトツールコード:

import arcpy
in_fc = arcpy.GetParameterAsText(0)

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])
arcpy.AddMessage("***************************************")
arcpy.AddMessage("Number of vertices in the layer: {0}".format(count_vertices))
arcpy.AddMessage("***************************************")

Pythonアドインコード(目次でレイヤーを選択して頂点をカウントする):

import arcpy
import pythonaddins

arcpy.env.overwriteOutput = True
mxd = arcpy.mapping.MapDocument("current")
in_fc = pythonaddins.GetSelectedTOCLayerOrDataFrame()

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])

pythonaddins.MessageBox(count_vertices, 'Number of vertices in {0}'.format(in_fc.name), 0)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.