Esta pregunta está relacionada con Uso correcto de un contador usando arcpy.da.UpdateCursor . Lo que quiero hacer es utilizar un cursor con una cláusula where para seleccionar un número de registros. Para cada fila, los valores en dos campos, TYPE_A
y TYPE_B
debe ser comparado. Si esos dos valores no son iguales, el campo NUM_ID
debe actualizarse con el valor actual del contador.
Una vez hecho esto, todos menos uno del resto de los registros de la selección debe actualizarse con el valor del contador incrementado.
Algunos datos de ejemplo:
FEATURE 1 :NUM_ID = 4 TYPE_A = NEW TYPE_B = NEW
FEATURE 2 :NUM_ID = 4 TYPE_A = NEW TYPE_B = EXISTING
FEATURE 3 :NUM_ID = 4 TYPE_A = NEW TYPE_B= NEW
FEATURE 4 :NUM_ID = 4 TYPE_A = NEW TYPE_B= NEW
FEATURE 5 :NUM_ID = 11 TYPE_A = NEW TYPE_B = EXISTING
FEATURE 6 :NUM_ID = 14 TYPE_A = NEW TYPE_B = NEW
FEATURE 7 :NUM_ID = 11 TYPE_A = NEW TYPE_B = EXISTING
Las 4 características con NUM_ID = 4
se seleccionaría y la característica 2 recibiría el NUM_ID 21, ya que sus valores para TYPE_A y TYPE_B son diferentes. El siguiente paso sería actualizar todos menos uno de los otros 3 registros incrementando el contador. La siguiente selección serían las 2 características con NUM_ID = 11
. Como los dos registros tienen valores diferentes para ambos campos, ambos se actualizarán. La última selección será para NUM_ID = 4. Como sus dos valores para los campos son los mismos, y es el único registro en su conjunto de selección, no es necesario actualizarlo.
El resultado:
FEATURE 1 :NUM_ID = 23 TYPE_A = NEW TYPE_B = NEW
FEATURE 2 :NUM_ID = 21 TYPE_A = NEW TYPE_B = EXISTING
FEATURE 3 :NUM_ID = 22 TYPE_A = NEW TYPE_B= NEW
FEATURE 4 :NUM_ID = 4 TYPE_A = NEW TYPE_B= NEW
FEATURE 5 :NUM_ID = 11 TYPE_A = NEW TYPE_B = EXISTING
FEATURE 6 :NUM_ID = 14 TYPE_A = NEW TYPE_B = NEW
FEATURE 7 :NUM_ID = 25 TYPE_A = NEW TYPE_B = EXISTING
El código que tengo:
getNum("%Selected Features%")
def getNum(ftr):
lst = [4, 11, 14, 15] #values for SQL expression
x = 20
fields = ('TYPE_A', 'TYPE_B', 'NUM_ID')
assert "NUM_ID" in [f.name for f in arcpy.ListFields(ftr)], "NUM_ID field no in feature class"
for l in lst:
y = x + 1
whereclause = "%(sql_name)s = '%(l)s' """ {"sql_name":arcpy.AddFieldDelimiters(ftr, "NUM_ID"), "l":l}
with arcpy.da.UpdateCursor(ftr, fields, whereclause) as cursor:
for row in cursor:
if row[0] ! = row[1]:
row[2] = y
#some condition here
cursor.updateRow(row)
y += 1
TYPE_A
sólo tiene un valor para todas las características, es decir NEW
. TYPE_B
puede tener cualquier valor. No importa qué característica se actualiza entre las que tienen los mismos valores para ambos campos ( NEW
), siempre que uno de ellos mantenga el valor original de NUM_ID. Aunque este código actualiza correctamente la fila en la que los dos campos no coinciden, no sé cómo dejar que uno de los registros mantenga el valor original, mientras que el resto debería actualizarse.