Holen Sie sich alle Punkte einer Polylinie


10

Ich habe einige Polylinien-Feature-Objekte in Python. Jetzt möchte ich alle Punkte von Polylinien erhalten.

Zum Beispiel, wenn eine Polylinie einen Startpunkt- [0,0]Endpunkt hat [5,5]. Ergebnis : [1,1];[2,2];[3,3];[4,4];[5,5].

Ich möchte alle ganzzahligen Punkte auf dieser Linie einschließlich der Endpunkte finden. Für gerade Linien ist dies kinderleicht, aber wenn die Polylinie die Geometrietypen Beizer-Kurve, Kreisbogen und Elliptischer Bogen hat, wie kann ich das tun?

BEARBEITEN:

Ich kann nur die Tools verwenden, die in allen Lizenzstufen von ArcGIS verfügbar sind. Zum Beispiel ArcGIS Basic.


2
Im Allgemeinen erhalten Sie nicht oft nette Ganzzahlpunkte. Es funktioniert in Ihrem Beispiel, aber nicht oft im wirklichen Leben. Normalerweise erhalten Sie nur Positionen für Scheitelpunkte, sodass Sie in Ihrem Fall [0,0] und [5,5] erhalten. Die "Zwischen" -Punkte können "angenommen" werden. Sie sind sich nicht sicher, wie Sie dies in Python tun sollen, aber mit verschiedenen Werkzeugen können Sie eine Punktdatei mit Scheitelpunkten aus einer Linie erstellen.
Darren Cope

Antworten:


17

Ich weiß, dass dies alt ist, aber ich habe nach dem gleichen gesucht, da ich ArcInfo für die FeatureVerticesToPoints- Tools nicht habe . Nachdem ich die Suchcursor-Lösung oben verwendet hatte, ging ich weiter, um den Code zu vereinfachen, und stellte fest, dass mit NumPy-Arrays im Datenzugriffsmodul ein einfaches und sehr schnelles Skript erstellt werden konnte. Ich benutze dies als Skript-Tool.

Hinweis: Der Schlüssel ist der explode_to_pointsParameter inarcpy.da.FeatureClassToNumPyArray

Hier ist ein Link zum Speicherort des ArcGIS-Repositorys: Feature-Class zu Punkten

# Feature Class to Points
# 
# Paul Smith (2012) paul@neoncs.com.au

# Imports
import arcpy
import numpy

#Inputs from user parameters
InFc  = arcpy.GetParameterAsText(0) # input feature class
OutFc = arcpy.GetParameterAsText(1) # output feature class

# Spatial reference of input feature class
SR = arcpy.Describe(InFc).spatialReference

# Create NumPy array from input feature class
array = arcpy.da.FeatureClassToNumPyArray(InFc,["SHAPE@XY"], spatial_reference=SR, explode_to_points=True)

# Check array and Exit if no features found
if array.size == 0:
    arcpy.AddError(InFc + " has no features.")

# Create a new points feature class
else:
    arcpy.da.NumPyArrayToFeatureClass(array, OutFc, ['SHAPE@XY'], SR)

Willkommen bei GIS.se Paul :) +1 für einen abgerundeten und überdurchschnittlichen ersten Beitrag mit Code zum Booten. Vielen Dank! Einige Bearbeitungstipps: Wählen Sie Text, Inline oder einen Block aus und ctrl-kwenden Sie dann die Code-Formatierung an (gleich für balt und italisch). Konventionell neigen wir dazu, gesprächige Dinge wie "Hallo", "Danke", "Prost" zu vermeiden. Diese sind immer präsent und tragen dazu bei, die Idee zu bekräftigen, dass sich dieser Ort von den üblichen Foren und E-Mails unterscheidet. Willkommen an Bord.
Matt Wilkie

Sie müssen einen Platzhalter für die where_clause in diese Zeile des Code-Arrays = arcpy.da.FeatureClassToNumPyArray (InFc, ["SHAPE @ XY"], "", räumliche_Referenz = SR, explode_to_points = True) einfügen
Tristan Forward

4

Wie ich verstanden habe, müssen Sie die Anzahl der Scheitelpunkte für Ihre Polylinien-Features erhöhen. Außerdem können alle Segmente "Beizer-Kurve, Kreisbogen, Elliptischer Bogen" in mehrere Liniensegmente umgewandelt werden.

Für diese Aufgabe in ArcGIS können Sie das Werkzeug Verdichten (Bearbeiten) in ArcToolbox verwenden.

Anschließend können Sie die Scheitelpunkte Ihrer Polylinien in Punkt- Features konvertieren, wie von Darren Cope und Artwork21 vorgeschlagen.

Wenn Sie dies lieber in ArcMap tun möchten, lesen Sie das Erstellen neuer Punkte entlang eines Linienhilfethemas .


3

Folgendes sollte für Polylinien und Polygone funktionieren:

import arcpy

infc = r"D:\Projects\GDBs\slowbutter.gdb\fc"

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

rows = arcpy.SearchCursor(infc)
for row in rows:
    # Create the geometry object
    feat = row.getValue(shapefieldname)
    print "Feature %i: " % row.getValue(desc.OIDFieldName)
    partnum = 0
    # Step through each part of the feature
    for part in feat:
        print "Part %i: " % partnum
        part_list = []
        for pnt in feat.getPart(partnum):
            if pnt:
                # Add to list
                part_list.append([pnt.X, pnt.Y])
            else:
                # If pnt is None, this represents an interior ring
                print "Interior Ring:"
        partnum += 1  
        print part_list

Für einige britische Straßendaten erhalte ich dies; Eine verschachtelte Liste von X, Y-Paaren für jeden Scheitelpunkt, aus dem die Polylinie besteht:

Feature 7: 
Part 0: 
[[-0.48053999999996222, 51.482510000000048], [-0.48032999999992398, 
51.482609000000082], [-0.48026999999996178, 51.48273800000004], 
[-0.48043999999993048, 51.482891000000052], [-0.48065999999994347, 51.482948000000079],
[-0.48123999999995704, 51.483009000000038]]

Ich habe das auf der ESRI-Seite gesehen. Aber wenn Sie in ihrer Beschreibung genau hinschauen, gibt dieser Code nur die Endpunkte zurück, nicht die Punkte zwischen ihnen
Benutzer

2
@crucifiedsoul - Ja, dies ist eine Variation dieser ESRI-Stichprobe , aber es gibt das X, Y-Paar aller Punkte, nicht nur die Endpunkte. Das ist was du willst, richtig?
Chad Cooper

Ich verstehe es nicht Das einzige , was ändert Sie ersetzen print pnt.X, pnt.Ymit part_list.append([pnt.X, pnt.Y]). Und Sie drucken dies am Ende der Schleife. Wie kann Ihr Code alle Punkte einer Linie erhalten, der ESRI-Code jedoch nicht?
Benutzer

Die Beschreibungsmethode hat bei mir nicht funktioniert. Ich musste nur mein Formfeld angeben - arcpy.da.SearchCursor (fc, ["SHAPE @"])
jbalk

1

Wie von Darren Cope vorgeschlagen, kann das Konvertieren Ihrer Ebene in Punktscheitelpunkte mit dem Werkzeug Feature-Scheitelpunkte in Punkte erfolgen .

Hier ist der Python-Code snippedt:

# import system modules 
import arcpy
from arcpy import env

# Set environment settings
env.workspace = "C:/data"

# Set local variables
inFeatures = "majorrds.shp"
outFeatureClass = "c:/output/output.gdb/majorrds_midpt"

# Execute FeatureVerticesToPoints
arcpy.FeatureVerticesToPoints_management(inFeatures, outFeatureClass, "MID")
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.