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:
- Erstellen Sie ein neues
arcpy.Point
Objekt mit den richtigen Koordinaten (möglicherweise haben Sie dies bereits getan).
- Ruft eine Kopie des Array-Objekts ab, das im Feld Form der Zeile gespeichert ist
- Verwenden Sie die
replace
Methode, um den gewünschten Punkt in Ihrem Array mit Ihrem geänderten Punkt festzulegen
- Erstellen Sie mit diesem Array ein neues Polylinienobjekt
- Verwenden Sie die
setValue
Methode des Zeilenobjekts , um das Feld Form mit Ihrer neuen, korrekten Polylinie zu aktualisieren
- Verwenden Sie die
updateRow
Methode des Cursorobjekts, um die geänderte Zeile in das Dataset einzufügen.
Konkret:
for r in cur:
ary = r.getValue("SHAPE").getPart(0)
ary.replace(0,correct_point_object) # first arg 0 replaces the first point in the line
newLine = arcpy.Polyline(ary)
r.setValue("SHAPE",newLine)
cur.updateRow(r)
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 sagen my_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
row_num = 0
for 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 basierend auf dem alten, anstatt die replace
Methode zu verwenden, falls dies notwendig ist.
import arcpy
def offsetPoint(old_point,X_distance,Y_distance):
"""Trivial function to offset a point - replace with what you're
actually doing."""
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):
"""Takes a Polyline geometry object and returns a new Polyline with
the first point of the first part offset by the distance given."""
array = line_geom.getPart(0)
first_point = array[0]
new_point = offsetPoint(first_point,X_distance,Y_distance)
# Build a new array with your new point in the 0th position, and
# the rest of the points from the old array.
new_array = arcpy.Array([new_point]+
[array.getObject(x) for x in range(1,array.count)])
# Then make a new Polyline object with that array.
new_line = arcpy.Polyline(new_array)
return new_line
fc = r"C:\Users\student\Documents\ArcGIS\Default.gdb\SomeStorms"
cur = arcpy.UpdateCursor(fc)
for r in cur:
geom = r.getValue("SHAPE")
r.setValue("SHAPE",offsetFirstPointInLine(geom,-45000,-5000))
cur.updateRow(r)
del r,cur
Hoffentlich hilft das, es aufzuklären.