Ist es möglich, einen arcpy.da.UpdateCursor () zu sortieren?

8

Ich habe einen ArcPy Data Access-Aktualisierungscursor, den ich sortieren möchte, bevor ich Aktualisierungen daran vornehme.

Der Cursor wird aktualisiert, wenn ich nicht sortiere. Wenn ich dem Cursor jedoch eine Sortierung hinzufüge, wird die Fehlermeldung "Iteration nicht gestartet" angezeigt.

Die Sortierung funktioniert korrekt, muss aber aus irgendeinem Grund den Cursor sprengen.

Ist es nicht möglich, einen Aktualisierungscursor wie einen Suchcursor zu sortieren? Ändert es den Typ oder so?

    idList = ['100100', '100200', '100300', '200100']
    count = 0
    with arcpy.da.UpdateCursor(newFC, ("SHAPE@X", "SHAPE@Y", "Label")) as addLabelCursor:            
        for row in sorted(addLabelCursor, key=itemgetter(0), reverse = True): 
            print idList[count]
            row[2] = str(idList[count])
            addLabelCursor.updateRow(row)
            count += 1
TurboGus
quelle
Wenn ich die Einheimischen in einer Debug-Sitzung beobachte, bleibt der "addLabelCursor" bis zum Ende ein da.UpdateCursor-Objekt. Es ist nicht so, als würde es beim Sortieren in eine Liste konvertiert.
TurboGus
Es schlägt fehl bei: addLabelCursor.updateRow (Zeile)
TurboGus
Sie müssen innerhalb des Cursoraufrufs mit einer SQL-Klausel (ORDER BY)
sortieren

Antworten:

11

Die Sortierung erschöpft den Cursor vollständig, bevor Sie darauf zugreifen updateRow. Die Art und Weise, wie Cursor funktionieren, besteht darin, dass der updateRowAufruf nicht für beliebige Zeilen außerhalb der Sequenz funktioniert, sondern für die aktuelle, über die iteriert wird. Das heißt, Sie können jeweils nur eine Zeile bearbeiten.

Möglicherweise möchten Sie dies stattdessen auf der Geodatabase-Seite untersuchen. Sie können eine ORDER BYKlausel angeben und sortieren, bevor Sie stattdessen darauf zugreifen.

Jason Scheirer
quelle
Es sieht so aus, als könnten Sie die Geometrie-Token nicht in der SQL-Klausel eines Cursors verwenden. Ich muss eine Problemumgehung verwenden, indem ich sie vorab einem realen Feld hinzufüge, oder ich speichere diese Cursoreingabe einfach im Speicher und verwende einen Suchcursor zum Sortieren und Einfügen des Cursors zum Erstellen. Vielen Dank für die Bestätigung, dass ich einen Aktualisierungscursor nicht sortieren und trotzdem aktualisieren kann.
TurboGus
7
@TurboGus, aber Sie können die Zeilen in einem Cursor sortieren. Die Hilfe zeigt an, dass Sie den sql_clauseParameter (Tupel) angeben können : sql_clause=(None, 'ORDER BY SORT_FIELD ASC')- oder DESCfür absteigend.
nmpeterson
2

Wie @nmpeterson betonte, können Sie eine SQL-Klausel in den Cursoraufruf eingeben, um nach einem Feld zu sortieren:

UpdateCursor (in_table, field_names, {where_clause}, {räumliche_Referenz}, {explode_to_points}, {sql_clause} )

Das SQL-Präfix unterstützt None, DISTINCT und TOP. SQL-Postfix unterstützt None, ORDER BY und GROUP BY.

sql_clause = (Keine, 'ORDER BY SORT_FIELD ASC') - oder DESC

Informationen stammen aus der ESRI-Hilfe: http://resources.arcgis.com/de/help/main/10.2/index.html#//018w00000014000000

jbalk
quelle
0

Dies ist möglicherweise nur für zukünftige Referenzzwecke relevant. Laut ArcGis-Onlinehilfe steht jedoch bei Verwendung von arcpy.UpdateCursor anstelle von arcpy.da.UpdateCursor eine Sortieroption zur Verfügung.

cursor = arcpy.UpdateCursor (fc, sort_fields = " YOURFIELDNAME ")

Daniel
quelle