Anzahl der Eckpunkte in jedem Polygon extrahieren?


14

Ich habe ArcGIS Desktop 10.2 und meine Herausforderung besteht darin, die Anzahl der Eckpunkte in jedem Polygon für alle Funktionen wie diese zu extrahieren:

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Ich habe viele Flurstücke in meiner Feature-Class und möchte die Anzahl der Scheitelpunkte für alle Features separat extrahieren. Anschließend möchte ich die XY-Koordinaten für alle Scheitelpunkte anzeigen.

Für weitere Informationen möchte ich nur Scheitelpunkte für jedes Polygon konvertieren und die Nummer jedes Scheitelpunkts anzeigen. Wenn ich also ein Polygon mit 4 Scheitelpunkten habe, möchte ich ein Polygon in Scheitelpunkte konvertieren und die Anzahl dieser Scheitelpunkte anzeigen (1,2,3,4,5), dann Anzeige von xy für jeden Scheitelpunkt, ich denke, die eigentliche Herausforderung ID, wie alle Polygone in Scheitelpunkte konvertiert und jede Anzahl von Scheitelpunkten ab 1 Nummer.


Möchten Sie, basierend auf Ihrer Bearbeitung, dass jedes Feature eine eindeutige ID (1 ... n) pro Feature und XY-Koordinaten hat? Möchten Sie, dass eine Spalte / ein Feld alle diese Informationen zu Beschriftungszwecken enthält, z. B. [1, 942744.1234, 924654.1234] [2, 952744.1234, 925654.1234] ...?
Aaron

Ja, wenn nicht versehentlich, hat ein Feld eine ID für die Anzahl der Eckpunkte jedes Polygons wie folgt: (1,2,3,4), (1,2,3,4,5), (1,2,3,4, 5,6,), (1,2,3,4,5,6,7,8,9) etc, dann denke ich über xy leicht sein kann , wenn wir xy Werkzeug aus ArcToolbox genannt hinzufügen
GIS Mann

Antworten:


5

Der folgende Code kombiniert die anderen Antworten und fügt ein Bit hinzu, um die Eckpunkte zu nummerieren. Ergebnisse

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)

Die Punkte sind in Zeichnungsreihenfolge beschriftet. Der letzte Punkt (unter dem ersten) hat keine Beschriftung und kann gelöscht werden, indem alle Punkte mit Nullwerten oder eindeutigen "DRAW_ORDER" -Werten ausgewählt werden, wenn sie nicht für die Rekonstruktion benötigt werden. Mit einer Definitionsabfrage können die überlappenden Punkte aus der Anzeige entfernt werden.

XY-Daten sind vorhanden, aber ich überlasse dies Ihren Beschriftungs- / Anzeigewünschen. Siehe Aarons Antwort zum Hinzufügen eines XY-Felds zur Beschriftung.

Ich spielte auch mit FeatureClass, um Array zu numpieren, aber ich beendete dies zuerst.


danke @ gm70560, ich habe Ihre Codevariablen verfolgt und als .py gespeichert, aber wenn ich es ausführen möchte, wird die Fehlermeldung "Der angegebene Feldname existiert nicht in der Tabelle" angezeigt. Was kann ich also tun? ?
GIS Man

Hier ist eine Druckmaske für meinen PC. Ich habe nur den Pfad für die Ziel-Feature-Class und den Pfad für die Ausgabe der neuen Feature-Class in Ihrem Code festgelegt. fvsozep
GIS Man

Das Feld (?) Wurde nicht hinzugefügt. Was ist weiter oben in den Ergebnissen passiert? Ich habe einen Chatraum, in dem ich die vollständigen Ergebnisse anzeigen kann. Hinterlasse einen Kommentar, damit ich das Zimmer überprüfen kann.
gm70560

22

Der einfachste Weg, dies zu tun, besteht darin, der Attributtabelle des Parzellen-Layers ein neues Ganzzahlfeld hinzuzufügen. Führen Sie dann den Feldrechner mit dem folgenden Ausdruck aus:

!Shape!.pointCount-!Shape!.partCount

Das !Shape!.pointCountgibt die Gesamtanzahl der Scheitelpunkte in dem Feature zurück. Der erste Scheitelpunkt jedes Teils wird jedoch am Ende wiederholt, um das Feature zu schließen. Subtrahieren Sie dazu für jedes Teil einen Scheitelpunkt mit -!Shape!.partCount.

Beachten Sie, dass Sie den Python-Parser verwenden müssen, damit dieser Ausdruck funktioniert.

Feldrechner


Das ist wirklich ziemlich cool, liefert aber nicht das XY für jeden dieser Eckpunkte. Die Antwort scheint darin zu bestehen, beide Antworten (dh auch @Aarons) zu verwenden, um alle angeforderten Informationen abzurufen.
Roland

@ Roland Sie haben Recht ... Ich habe den Teil der Frage über XY-Eckpunkte verpasst. In diesem Fall müssen Sie die SearchCursorMethode in Aarons Antwort oder ein Geoverarbeitungswerkzeug wie Feature-Stützpunkte zu Punkten verwenden (für dieses Werkzeug ist jedoch eine ArcGIS for Desktop Advanced-Lizenz erforderlich).
dmahr

Vielen Dank @dmahr, ich denke, es fehlt ein Schritt. Wenn ich den Wert berechne, wird die Anzahl der Scheitelpunkte gezählt. Wenn ich also eine Parcel-Feature-Class mit 5 Scheitelpunkten habe, möchte ich sie wie folgt anzeigen: 1,2,3 , 4,5 auf jedem Eckpunkt, nicht alle Eckpunkte in einer Nummer zählen, die eigentliche Herausforderung ist es, wie die Nummer für jeden Eckpunkt ab 1 Nummer für jedes Paket angezeigt wird.
GIS Man

12

dmahr bot eine gute Lösung zum Zählen von Eckpunkten. Verwenden Sie den folgenden Arbeitsablauf, um jeden Punkt nicht programmgesteuert mit den XY-Koordinaten zu kennzeichnen:

  1. Feature-Stützpunkte zu Punkten
  2. Füge zwei neue Felder (Typ: double) in den neuen Punkt FC "X", "Y" ein
  3. Geometrie berechnen. Rechtsklickfeld> Geometrie berechnen ...> X-Koordinate des Punktes (Wiederholung für Y-Feld)
  4. Füge ein weiteres Feld "XY" hinzu (Typ: Text)
  5. Berechnen Sie das Feld "XY" im Feldrechner, wobei XY =

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

  6. Beschriften von Features. Klicken Sie mit der rechten Maustaste auf Ebene> Beschriftungen> Beschriftungsfeld: XY

Dies führt zu folgenden Ergebnissen:

Bildbeschreibung hier eingeben

Sie können diese Aktionen auch programmgesteuert explode_to_pointsmit einem Suchcursor ausführen (als Start).

Dekonstruieren Sie ein Feature in seine einzelnen Punkte oder Scheitelpunkte. Wenn explode_to_points auf True gesetzt ist, wird ein Mehrpunkt-Feature mit beispielsweise fünf Punkten durch fünf Zeilen dargestellt.

(Der Standardwert ist False.)

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

Anscheinend würde man einen Nachbearbeitungsprozess benötigen oder @ dmahrs Antwort verwenden, um eine Feature-Summierung der Anzahl der Eckpunkte zu erhalten.
Roland

4

Wenn man kein neues Feld berechnen und nur eine Anzahl von Eckpunkten pro Ebene erhalten möchte sehr schnell zurückerhalten (zum Zwecke der Verallgemeinerung, z. B. wenn Sie die Datensätze im Web verfügbar machen), können Sie ein benutzerdefiniertes Skript-Tool in a erstellen Toolbox oder machen Sie den Code als Python-Add-In verfügbar.

Benutzerdefinierter Skript-Tool-Code:

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-Add-In-Code (wählen Sie eine Ebene im Inhaltsverzeichnis aus, um die Scheitelpunkte zu zählen):

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.