Ich versuche, in Python mit ArcGIS 10 ein Tool zum Einrasten von Polylinienendpunkten zu erstellen. Mithilfe eines Suchcursors habe ich die Werte in ein Array von Linienobjekten eingelesen (die die Feature-ID der Linie und zwei "EndPoint" -Objekte enthalten - first und last - die jeweils die X- und Y-Koordinate enthalten), dann verarbeiten Sie eine Dateninterpolation der Punkte, um allen Punkten ihre korrekten Werte zu geben.
Bisher funktioniert dieser Teil perfekt. Wenn ich jedoch versuche, zurück zu gehen und das Shapefile zu bearbeiten, kann ich die Daten sehen, die ich ändere, aber ich kann sie scheinbar nicht bearbeiten.
Hier ist der Code zum Aktualisieren der Felder:
# --------------------------
#
# Update the file with the new EPs
#
# --------------------------
# Create update cursor
#
rows = arcpy.UpdateCursor(outputDirectory + "\\" + trails_fc + ".shp")
# Enter for loop for each feature/row
#
i = 0
for row in rows:
# Create the geometry object
#
feat = row.getValue(shapefieldname)
partnum = 0
if feat.getPart(partnum)[0].X != allLines[i].startEP.x:
arcpy.AddMessage("Change: " + str(feat.getPart(partnum)[0].X) + " to " + str(allLines[i].startEP.x) )
feat.getPart(partnum)[0].X = allLines[i].startEP.x
rows.updateRow(row)
arcpy.AddMessage("Now is: " + str(feat.getPart(partnum)[0].X))
i+=1
Meine Anzeige besteht aus Aussagen wie diesen:
Ändern Sie: -105.512166832 in -105.699533165 Jetzt lautet: -105.512166832
Aus irgendeinem Grund werden die Zeilen nicht aktualisiert. Und für mein Leben kann ich kein Tutorial oder Anweisungen zum Bearbeiten eines bestimmten Punkts in einer Polylinie finden. Ich kann nur herausfinden, wie ein Punkt als Feld in einem Punkt-Shapefile bearbeitet wird.
Hat jemand irgendwelche Ideen?
quelle
Antworten:
Leider können Sie der vorhandenen Geometrie eines Features keine neuen Werte direkt 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 eine
replace
Methode. Anstatt zu versuchen, die X-Koordinate des Punkts innerhalb des Arrays direkt zu ändern, müssen Sie:arcpy.Point
Objekt mit den richtigen Koordinaten (möglicherweise haben Sie dies bereits getan).replace
Methode, um den gewünschten Punkt in Ihrem Array mit Ihrem geänderten Punkt festzulegensetValue
Methode des Zeilenobjekts , um das Feld Form mit Ihrer neuen, korrekten Polylinie zu aktualisierenupdateRow
Methode des Cursorobjekts, um die geänderte Zeile in das Dataset einzufügen.Konkret:
Beachten Sie, dass die
replace
Methode einen Index und einen Wert verwendet. Leider akzeptiert es zB -1 nicht als Index für den letzten Punkt im Array. Sie können jedoch sagenmy_array[my_array.count]
.Es sieht so aus, als würden Sie die X-Koordinaten an einer anderen Stelle vorberechnen und später abrufen. Wenn dies der Fall ist, würde ich wahrscheinlich das ganze Schwein gehen und neue Polylinienobjekte mit den richtigen Punkten für jede Linie erstellen, während Sie die richtigen Koordinaten berechnen. Dies wird wahrscheinlich einfacher und sauberer sein. Auf diese Weise könnte Ihr Code eher so sein
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 basierend auf dem alten, anstatt die
replace
Methode zu verwenden, falls dies notwendig ist.Hoffentlich hilft das, es aufzuklären.
quelle