Mehr

Bearbeiten von Endpunkten in Polyline mit ArcPy?


Ich versuche, ein Polylinien-Endpunkt-Fangwerkzeug in Python mit ArcGIS 10 zu erstellen. Mit einem Suchcursor lese ich die Werte in ein Array von Linienobjekten ein (die die Feature-ID der Linie und zwei "EndPoint" -Objekte enthalten - zuerst und first last - die jeweils die X- und Y-Koordinate enthalten), verarbeiten Sie dann eine Dateninterpolation der Punkte, um allen Punkten ihre korrekten Werte zu geben.

Bisher funktioniert das Teil einwandfrei. Wenn ich jedoch versuche, zurückzugehen und das Shapefile zu bearbeiten, kann ich die Daten sehen, die ich ändere, aber ich kann sie anscheinend nicht bearbeiten.

Hier ist der Code zum Aktualisieren der Felder:

# -------------------------- # # Aktualisieren Sie die Datei mit den neuen EPs # # ------------ -------------- # Update-Cursor erstellen # rows = arcpy.UpdateCursor(outputDirectory + "" + Trails_fc + ".shp") # For-Schleife für jedes Feature/jede Zeile eingeben # i = 0 für Zeile in Zeilen: # Geometrieobjekt erstellen # feat = row.getValue(shapefieldname) partnum = 0 if feat.getPart(partnum)[0].X != allLines[i].startEP.x: arcpy.AddMessage ("Ändern: " + str(feat.getPart(partnum)[0].X) + " zu " + str(allLines[i].startEP.x) ) feat.getPart(partnum)[0].X = allLines [i].startEP.x rows.updateRow(row) arcpy.AddMessage("Jetzt ist: " + str(feat.getPart(partnum)[0].X)) i+=1

Meine Anzeige besteht aus Aussagen wie dieser:

Änderung: -105.512166832 in -105.699533165 Jetzt: -105.512166832

Aus irgendeinem Grund werden die Zeilen nicht aktualisiert. Und für mein Leben kann ich kein Tutorial oder eine Anleitung zum Bearbeiten eines bestimmten Punkts in einer Polylinie finden. Ich kann nur finden, wie man einen Punkt als Feld in einem Punkt-Shapefile bearbeitet.

Hat jemand Ideen?


Leider können Sie der vorhandenen Geometrie eines Features nicht direkt neue Werte zuweisen. Stattdessen müssen Sie ein neues Geometrieobjekt erstellen und das Formfeld des Features mit diesem neuen Objekt aktualisieren. Glücklicherweise haben die Array-Objekte aersetzenMethode. Anstatt also zu versuchen, die X-Koordinate des Punkts innerhalb des Arrays direkt zu ändern, müssen Sie Folgendes tun:

  • Erstelle eine neuearcpy.PointObjekt mit den richtigen Koordinaten (scheint so zu sein, als hätten Sie dies bereits getan)
  • Holen Sie sich eine Kopie des Array-Objekts, das im Shape-Feld der Zeile gespeichert ist
  • Verwenden Sie dieersetzenMethode, um den gewünschten Punkt in Ihrem Array mit Ihrem modifizierten Punkt zu setzen
  • Erstellen Sie ein neues Polyline-Objekt mit diesem Array
  • Verwenden Sie die des ZeilenobjektssetValueMethode zum Aktualisieren des Formfelds mit Ihrer neuen, korrekten Polylinie
  • Verwenden Sie die Cursor-ObjekteupdateRow-Methode, um die geänderte Zeile in das Dataset einzufügen.

Konkret:

für r in cur: ary = r.getValue("SHAPE").getPart(0) ary.replace(0,correct_point_object) # first arg 0 ersetzt den ersten Punkt in der Linie newLine = arcpy.Polyline(ary) r.setValue ("SHAPE",newLine) cur.updateRow(r)

Beachten Sie dasersetzen-Methode nimmt einen Index und einen Wert an. Leider werden z.B. -1 als Index zum letzten Punkt im Array. Aber man kann sagenmy_array[my_array.count].

Es sieht so aus, als ob Sie die X-Koordinaten woanders vorberechnen und später abrufen. Wenn dies der Fall ist, würde ich wahrscheinlich alles daran setzen und neue Polylinien-Objekte mit den richtigen Punkten für jede Linie erstellen, während Sie die richtigen Koordinaten berechnen. Dies wird wahrscheinlich einfacher und sauberer sein. So könnte Ihr Code ähnlicher sein

row_num = 0 für r in cur: r.setValue(shapeField,correct_geometry_list[row_num]) cur.updateRow(r) row_num += 1

Was, zumindest für mich, etwas klarer ist… aber das ist stilistisch!

Bearbeiten, um hinzuzufügen:

Ich konnte das nicht in einen Kommentar einfügen. Ohne Ihren Code zu sehen, ist es schwer zu sagen, wo er umfallen könnte. Hier ist ein vollständig getestetes Skript, das für mich funktioniert. Hoffentlich dient es als Referenz. Beachten Sie, dass ich hier die neue Geometrie direkt aus der alten berechne, anstatt zwei Durchgänge durchzuführen. Dies kann möglich sein oder auch nicht, je nachdem, wie Sie Ihre Fangpositionsberechnungen durchführen. Auch dieses Mal konstruiere ich ein brandneues Array, das auf dem alten basiert, anstatt das zu verwendenersetzenMethode, falls dies notwendig ist.

import arcpy def offsetPoint(old_point,X_distance,Y_distance): """Triviale Funktion zum Versetzen eines Punkts - ersetzen Sie durch das, was Sie gerade tun.""" new_point = arcpy.Point(old_point.X+X_distance, old_point.Y+ Y_distance) return new_point def offsetFirstPointInLine(line_geom,X_distance,Y_distance): """Nimmt ein Polyline-Geometrieobjekt und gibt eine neue Polyline zurück, wobei der erste Punkt des ersten Teils um die angegebene Distanz versetzt ist.""" array = line_geom.getPart( 0) first_point = array[0] new_point = offsetPoint(first_point,X_distance,Y_distance) # Erstellen Sie ein neues Array mit Ihrem neuen Punkt an der 0. Position und # den Rest der Punkte aus dem alten Array. new_array = arcpy.Array([new_point]+ [array.getObject(x) for x in range(1,array.count)]) # Dann erstellen Sie ein neues Polyline-Objekt mit diesem Array. new_line = arcpy.Polyline(new_array) return new_line fc = r"C:UsersstudentDocumentsArcGISDefault.gdbSomeStorms" cur = arcpy.UpdateCursor(fc) für r in cur: geom = r.getValue( "SHAPE") r.setValue("SHAPE",offsetFirstPointInLine(geom,-45000,-5000)) cur.updateRow(r) del r,cur

Hoffentlich hilft das zur Klärung.


Schau das Video: Create Point features along a line in ArcGIS (Oktober 2021).