ArcGIS Desktop

  • ArcGIS Pro
  • ArcMap

  • My Profile
  • Hilfe
  • Sign Out
ArcGIS Desktop

ArcGIS Online

Die Mapping-Plattform für Ihre Organisation

ArcGIS Desktop

Ein vollständiges professionelles GIS

ArcGIS Enterprise

GIS in Ihrem Unternehmen

ArcGIS for Developers

Werkzeuge zum Erstellen standortbezogener Apps

ArcGIS Solutions

Kostenlose Karten- und App-Vorlagen für Ihre Branche

ArcGIS Marketplace

Rufen Sie Apps und Daten für Ihre Organisation ab.

  • Dokumentation
  • Support
Esri
  • Anmelden
user
  • Eigenes Profil
  • Abmelden

ArcMap

  • Startseite
  • Erste Schritte
  • Karte
  • Analysieren
  • Verwalten von Daten
  • Werkzeuge
  • Erweiterungen

Schreiben von Geometrien

  • Geometrie-Erstellung mithilfe von Koordinatenlisten

Mit Einfüge-Cursors und Aktualisierungs-Cursors können Skripte neue Features in einer Feature-Class erstellen oder vorhandene aktualisieren. Ein Skript kann ein Feature definieren, indem es ein Point-Objekt erstellt, dessen Eigenschaften festlegt und es in einem Array platziert. Dieses Array kann anschließend zum Festlegen der Geometrie eines Features mithilfe der Geometrieklassen Polygon, Polyline, PointGeometry oder Multipoint verwendet werden.

import arcpy
fc = "c:/data/gdb.gdb/roads"
cursor = arcpy.da.InsertCursor(fc, ["SHAPE@"])
array = arcpy.Array([arcpy.Point(-77.4349451, 37.5408265),
                     arcpy.Point(-78.6384349, 35.7780943)])
spatial_reference = arcpy.SpatialReference(4326)
polyline = arcpy.Polyline(array, spatial_reference)
cursor.insertRow([polyline])

Wie oben gezeigt, wird ein einzelner Geometrieteil durch ein Punktarray definiert. Ebenso kann ein Multipart-Feature mit demselben Cursor aus einem Array mit Arrays von Punkten erstellt werden, wie weiter unten gezeigt wird.

first_part = arcpy.Array([arcpy.Point(-77.4349451, 37.5408265),                          arcpy.Point(-78.6384349, 35.7780943)]) second_part = arcpy.Array([arcpy.Point(-79.7910143, 36.0786785),                           arcpy.Point(-80.8546435, 35.2315402)])
array = arcpy.Array([first_part, second_part]) spatial_reference = arcpy.SpatialReference(4326) multipart_feature = arcpy.Polyline(array, spatial_reference)
cursor.insertRow([multipart_feature])

Beim Schreiben von Punkt-Features wird nur ein einzelnes Punktobjekt zum Festlegen der Geometrie eines Punkt-Features verwendet. Mit dem Token SHAPE@XY (sowie bei Bedarf den Token SHAPE@M und SHAPE@Z) können Punkte auch einfacher (und effizienter) erstellt werden.

import arcpy
# fc is a point feature class
fc = "c:/data/gdb.gdb/stops"
cursor = arcpy.da.InsertCursor(fc, ["SHAPE@XY"])
xy = (5997594.4753, 2069901.75682)
cursor.insertRow([xy])

Sämtliche Geometrien werden validiert, bevor sie in eine Feature-Class geschrieben werden. Probleme wie eine fehlerhafte Ringausrichtung und sich selbst überschneidende Polygone werden beim Vereinfachen der Geometrie behoben, bevor diese eingefügt wird.

Im folgenden Beispiel wird veranschaulicht, wie ein Koordinatenpaar (definiert durch coords_list) mit mehreren linearen Koordinaten gelesen und anhand der Koordinaten eine neue Feature-Class erstellt wird.

# Create a new line feature class using a text file of coordinates.
#   Each coordinate entry is semicolon delimited in the format of ID;X;Y
import arcpy
import os
# List of coordinates (ID, X, Y)
coords_list = [[1, -61845879.0968, 45047635.4861], 
               [1, -3976119.96791, 46073695.0451],
               [1, 1154177.8272, -25134838.3511],
               [1, -62051091.0086, -26160897.9101],
               [2, 17365918.8598, 44431999.7507],
               [2, 39939229.1582, 45252847.3979],
               [2, 41170500.6291, 27194199.1591],
               [2, 17981554.5952, 27809834.8945],
               [3, 15519011.6535, 11598093.8619],
               [3, 52046731.9547, 13034577.2446],
               [3, 52867579.6019, -16105514.2317],
               [3, 17160706.948, -16515938.0553]]
# The output feature class to be created
outFC = arcpy.GetParameterAsText(0)
# Get the template feature class
template = arcpy.GetParameterAsText(1)
cur = None
try:
    # Create the output feature class
    arcpy.CreateFeatureclass_management(os.path.dirname(outFC),
                                        os.path.basename(outFC), 
                                        "POLYLINE", template)
    # Access spatial reference of template to define spatial
    # reference of geometries
    spatial_reference = arcpy.Describe(template).spatialReference
    # Open an insert cursor for the new feature class
    cur = arcpy.da.InsertCursor(outFC, ["SHAPE@"])
    # Create an array object needed to create features
    array = arcpy.Array()
    # Initialize a variable for keeping track of a feature's ID.
    ID = -1
    for coords in coords_list: 
        if ID == -1:
            ID = coords[0]
        # Add the point to the feature's array of points
        #   If the ID has changed, create a new feature
        if ID != coords[0]:
            cur.insertRow([arcpy.Polyline(array)])
            array.removeAll()
        array.add(arcpy.Point(coords[1], coords[2], ID=coords[0]))
        ID = coords[0]
    # Add the last feature
    polyline = arcpy.Polyline(array, spatial_reference)
    cur.insertRow([polyline])
except Exception as e:
    print(e)
finally:
    # Cleanup the cursor if necessary
    if cur:
        del cur

Multipart-Polygon- und Polylinien-Features mit inneren Ringen werden erstellt, indem Sie ein Array mit Arrays erstellen und dieses an die Klassen Polygon und Polyline übergeben.

Geometrie-Erstellung mithilfe von Koordinatenlisten

Geometrie kann auch mithilfe einer Liste von Koordinaten erstellt werden. Dieser Ansatz kann Performance-Verbesserungen bieten, da der mit der Erstellung von Geometrieobjekten zusammenhängende Overhead vermieden wird. Er kann jedoch nur auf Singlepart-Features angewendet werden und nur auf Polygone ohne innere Ringe. Alle Koordinaten müssen die Einheiten des Feature-Class-Raumbezugs aufweisen.

Im Beispiel unten wird ein einzelnes Polygon-Feature anhand einer Liste von XY-Paaren erstellt.

import arcpy
import os
coordinates = [(-117.2000424, 34.0555514), 
               (-117.2000788, 34.0592066), 
               (-117.1957315, 34.0592309), 
               (-117.1956951, 34.0556001)]
# Create a feature class with a spatial reference of GCS WGS 1984
result = arcpy.management.CreateFeatureclass(
    arcpy.env.scratchGDB, 
    "esri_square", "POLYGON", spatial_reference=4326)
feature_class = result[0]
# Write feature to new feature class
with arcpy.da.InsertCursor(feature_class, ['SHAPE@']) as cursor:
    cursor.insertRow([coordinates])

Verwandte Themen

  • Zugreifen auf Daten mit Cursorn
  • Festlegen einer Abfrage in Python
  • Lesen von Geometrien
  • Verwenden von Geometrieobjekten mit Geoverarbeitungswerkzeugen

ArcGIS Desktop

  • Startseite
  • Dokumentation
  • Support

ArcGIS Plattform

  • ArcGIS Online
  • ArcGIS Desktop
  • ArcGIS Enterprise
  • ArcGIS for Developers
  • ArcGIS Solutions
  • ArcGIS Marketplace

Über Esri

  • Über uns
  • Karriere
  • Esri Blog
  • User Conference
  • Developer Summit
Esri
Wir sind an Ihrer Meinung interessiert.
Copyright © 2019 Esri. | Datenschutz | Rechtliches