Extrahieren von Koordinaten von Polygonscheitelpunkten in ArcMap?


25

Ich habe ungefähr ein Dutzend Polygone in einer in ArcMap 10 geladenen Feature-Class, alle in geografischem WGS 1984.

Wie erhalte ich auf einfache Weise die Koordinaten, die jedem Scheitelpunkt jedes Polygons in dieser Feature-Class zugeordnet sind?

Im Idealfall möchte ich, dass sie in Tabellenform schön tabellarisch dargestellt werden.

Antworten:



12

Dies funktioniert mit einer Standard-ArcGIS-Lizenz:

desc = arcpy.Describe(fcl)
shapefieldname = desc.ShapeFieldName

gebieden = arcpy.UpdateCursor(fcl)

for gebied in gebieden:
    polygoon = gebied.getValue(shapefieldname)
    for punten in polygoon:
        for punt in punten:
            print punt.X, punt.Y


4

Dies ist eine andere Möglichkeit, dies mit einem da.SearchCursor zu tun :

import arcpy
fc=r'C:\TEST.gdb\polygons123'

with arcpy.da.SearchCursor(fc,['OID@','SHAPE@']) as cursor:
    for row in cursor:
        array1=row[1].getPart()
        for vertice in range(row[1].pointCount):
            pnt=array1.getObject(0).getObject(vertice)
            print row[0],pnt.X,pnt.Y

Das Ergebnis sind ObjectID, X und Y, die nach Excel kopiert werden können:

...
1 537505.894287 6731069.60889
1 537533.516296 6731078.20947
1 537555.316528 6731082.53589
1 537562.501892 6731085.47913
1 537589.395081 6731070.52991
1 537617.062683 6731058.29651
2 537379.569519 6729746.16272
2 537384.81311 6729746.06012
2 537396.085327 6729748.62311
2 537404.065674 6729752.75311
2 537425.145325 6729773.72931
2 537429.842102 6729777.07129
2 537442.971313 6729780.10651
2 537450.27533 6729780.51611
...

Kurze Frage, was ist los im 'array1.getObject (0) .getObject (vertice)' Teil?
Rex

@Rex Siehe Hilfeabschnitt für Array: pro.arcgis.com/de/pro-app/arcpy/classes/array.htm . Aus dem Array hole ich jeden Punkt / Eckpunkt: i67.tinypic.com/34gstig.jpg
BERA

Großartig, das hilft mir, es ein bisschen besser zu verstehen. Warum gibt es also ein Array in einem Array und nicht nur ein Array von Punkten? Gibt es noch etwas im ersten Array? Was würde array1.getObject (1) Ihnen geben?
Rex

Dies liegt daran, dass Sie alle Teile in "row [1] .getPart ()" erhalten. Daher besteht Ihr erstes Array aus den verschiedenen Teilen eines mehrteiligen Features. Sie hätten also nur etwas anderes als array1.getObject (0), wenn Sie ein mehrteiliges Feature hätten?
Rex

3

Probieren Sie die Geo-Wizard-Tools von Spatial Technologies aus. Es hat mehrere kostenlose Tools, die tun können, was Sie wollen. Probieren Sie die Get-Polygon-Koordinaten aus. Oder Polygon zu Punkten

et geo-wizards


2

Das folgende Python-Skript (für das ArcGIS 10.1 oder höher erforderlich ist) verwendet arcpy.daein Shapefile als Eingabe und erstellt eine Tabelle mit einem Eintrag für jeden Scheitelpunkt in jedem in der .shp-Datei vorhandenen Polygon. . Objekt- und Sequenz-IDs binden die Punkte an eine bestimmte Position in einem bestimmten Polygon zurück.

H / t an @PaulSmith in diesem Beitrag: Holen Sie sich alle Punkte einer Polylinie, um die explode_to_pointsOption im arcpy.da.FeatureClassToNumPyArrayWerkzeug hervorzuheben

import os
import csv
import arcpy
from os import path
from arcpy import da
from arcpy import env

env.overwriteOutput = True
env.workspace = '/folder/containing/your/shp/here'

polygon_shp = path.join(env.workspace, 'your_shapefile_name.shp')
vertex_csv_path = 'your/csv/path/here/poly_vertex.csv'

def getPolygonCoordinates(fc):
    """For each polygon geometry in a shapefile get the sequence number and
    and coordinates of each vertex and tie it to the OID of its corresponding
    polygon"""

    vtx_dict = {}
    s_fields = ['OID@', 'Shape@XY']
    pt_array = da.FeatureClassToNumPyArray(polygon_shp, s_fields, 
        explode_to_points=True)

    for oid, xy in pt_array:
        xy_tup = tuple(xy)
        if oid not in vtx_dict:
            vtx_dict[oid] = [xy_tup]
        # this clause ensures that the first/last point which is listed
        # twice only appears in the list once
        elif xy_tup not in vtx_dict[oid]:
            vtx_dict[oid].append(xy_tup)


    vtx_sheet = []
    for oid, vtx_list in vtx_dict.iteritems():
        for i, vtx in enumerate(vtx_list):
            vtx_sheet.append((oid, i, vtx[0], vtx[1]))

    writeVerticesToCsv(vtx_sheet)

def writeVerticesToCsv(vtx_sheet):
    """Write polygon vertex information to csv"""

    header = (
        'oid',          'sequence_id', 
        'x_coordinate', 'y_coordinate')

    with open(vertex_csv_path, 'wb') as vtx_csv:
        vtx_writer = csv.writer(vtx_csv)
        vtx_writer.writerow(header)

        for row in vtx_sheet:
            vtx_writer.writerow(row)

getPolygonCoordinates(polygon_shp)

Ich habe auch ein Skript geschrieben, das speziell die folgenden Anforderungen erfüllt: Einfügen von Scheitelpunktkoordinaten in ein Polygon, das als Duplikat dieser Frage markiert ist. Der folgende Code lautet:

import os
import arcpy
from os import path
from arcpy import da
from arcpy import env
from arcpy import management

env.overwriteOutput = True
env.workspace = '/folder/containing/your/shp/here'

polygon_shp = path.join(env.workspace, 'your_shapefile_name.shp')
file_gdb = 'your/file/gdb/path/here/temp.gdb'

def addVerticesAsAttributes(fc):
    """Add the x,y coordinates of vertices as attributes to corresponding 
    features.  The coordinates will be in the order the appear in the geometry"""

    polygon_copy = createGdbFcCopy(fc)

    vtx_dict = {}
    s_fields = ['OID@', 'Shape@XY']
    pt_array = da.FeatureClassToNumPyArray(polygon_copy, s_fields, 
        explode_to_points=True)

    for oid, xy in pt_array:
        xy_tup = tuple(xy)
        if oid not in vtx_dict:
            vtx_dict[oid] = [xy_tup]
        # this clause ensures that the first/last point which is listed
        # twice only appears in the list once
        elif xy_tup not in vtx_dict[oid]:
            vtx_dict[oid].append(xy_tup)

    # find that largest number of points that exist within a polygon to determine 
    # the number of fields that need to be added to the shapefile
    max_vertices = 0
    for vtx_list in vtx_dict.values():
        if len(vtx_list) > max_vertices:
            max_vertices = len(vtx_list)

    xy_fields = addXyFields(polygon_copy, max_vertices)

    u_fields = ['OID@'] + xy_fields
    with da.UpdateCursor(polygon_copy, u_fields) as cursor:
        oid_ix = cursor.fields.index('OID@')
        for row in cursor:
            xy_ix = oid_ix + 1
            for vtx in vtx_dict[row[oid_ix]]:
                for coord in vtx:
                    row[xy_ix] = coord
                    xy_ix += 1

            cursor.updateRow(row)

def createGdbFcCopy(fc):
    """Create copy of the input shapefile as a file geodatabase feature class,
    because a huge number of fields may be added to the fc this preferable to shp"""

    if not arcpy.Exists(file_gdb):
        management.CreateFileGDB(path.dirname(file_gdb), 
            path.basename(file_gdb))

    polygon_copy = path.join(file_gdb, 'polygon_shp_copy')
    management.CopyFeatures(polygon_shp, polygon_copy)
    return polygon_copy

def addXyFields(fc, vtx_count):
    """Add fields to the feature class that will hold the x, y coordinates for each
    vertex, the number of fields is twice the number of most vertices in any polygon"""

    field_list = []
    f_type = 'DOUBLE'
    for i in range(1, vtx_count+1):
        f_names = ['x{0}'.format(i), 'y{0}'.format(i)]
        for fn in f_names:
            management.AddField(fc, fn, f_type)

        field_list.extend(f_names)

    return field_list

addVerticesAsAttributes(polygon_shp)

Das erste Python-Skript macht das, wonach HPY gefragt hat! Das geht sehr schnell! Vielen Dank, Grant Humphries!
ArisA

1

Daher habe ich die Lösung noch nicht abgeschlossen, aber es sieht so aus, als könnten Sie dieses Tool verwenden:

Konvertierung> JSON> Funktionen zu JSON.

Dadurch wird Ihr Shapefile (in meinem Fall 81 Polygone) in eine JSON-Datei konvertiert. Sie können dies mit einem Texteditor öffnen, um zu sehen, dass tatsächlich alle Eckpunkte für jedes Polygon aufgelistet sind.

Darüber hinaus behandelt die Python-Standardbibliothek (import json) die json-Objekte als Wörterbücher. Sie können dann einfach Ihre Wörterbücher durchlaufen, um die Eckpunkte (und alle anderen gewünschten Attribute) in eine CSV-Datei zu schreiben. Wenn ich es zum Laufen bringe, komme ich zurück und poste die Lösung.


0

Ich brauchte nur die x- und y-Koordinaten für die Polylinie und das Polygon. Ich habe ToolBox -> Datenverwaltungstools -> Features -> Feature to Point verwendet. Dadurch wurde eine Punktformdatei erstellt. Anschließend habe ich XY-Koordinaten aus demselben Menü "Features" hinzugefügt, um XY-Koordinaten zu generieren. Dann extrahierte ich die Informationen aus der Shapes-Attributtabelle in eine Excel-Tabelle. Dies löste mein Problem, nicht sicher, ob Sie das gleiche suchen.


Gibt dies nicht nur einen Punkt (X, Y) pro Polylinie / Polygon, wenn die Frage nach einem Punkt (X, Y) für jeden Scheitelpunkt in jeder Polylinie / jedem Polygon fragt?
PolyGeo

-2

Hier ist ein Workaround in verzweifelten Zeiten:

  • Beginnen Sie mit der Bearbeitung der Feature-Class oder des Shapefiles
  • Wählen Sie das Polygon-Feature aus und klicken Sie mit der rechten Maustaste auf "Eckpunkte bearbeiten".
  • Klicken Sie mit der rechten Maustaste auf einen der Eckpunkte und wählen Sie "Skizzeneigenschaften".
  • Ein Fly-Out mit den Koordinaten der aufgelisteten Scheitelpunkte wird angezeigt
  • Machen Sie einen Screenshot der Koordinatenliste
  • Fügen Sie den Screenshot in Ihren bevorzugten Foto- / Bildeditor ein und speichern Sie ihn als JPEG / PNG / BMP usw
  • Google 'Kostenlose Online-Texterkennung' Wählen Sie eine aus den Ergebnissen aus (einige sind besser als andere)
  • Laden Sie Ihre Datei des Koordinaten-Screenshots hoch und konvertieren Sie sie
  • Wählen Sie Ihren Ausgabedateityp (txt, Excel usw.)
  • Überprüfen Sie die Ergebnisse, da einige OCR-Konverter Müll sind !!!
  • Verwenden Sie das Hinzufügen von X- und Y-Daten in Arcmap, um einen Punktdatensatz zu erstellen.

Diese Methode ist für kleine Datensätze in Ordnung, aber die Abhängigkeit / Einschränkungen von den OCR-Konvertern sind das Hauptanliegen. Mit Vorsicht verwenden.

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.