1 votos

¿Comparación de múltiples valores de campo de dos clases de características mediante ArcPy?

He incorporado el siguiente código a mi script de ¿Comparación de los valores de campo de dos clases de características mediante ArcPy? y funciona muy bien, pero también necesito comparar los valores de otros dos campos (es decir, AÑO y MES) de los mismos dos FC.

No hay ningún problema con el código tal y como está, sólo necesito ayuda para modificar el código para comprobar los atributos de 3 campos de 2 FC para ver si cada fila de los tres campos contiene los mismos atributos y si es así no copiar la fila a la clase de característica de destino. Los campos de cada FC coinciden exactamente.

import arcpy

#input feature class
fc2 = r"C:\temp\temp.gdb\fc2"
#target feature class
fc3 = r"C:\temp\temp.gdb\fc3"

#check field
checkField = "SRNumber"

#Get list of values in field from target feature class
checkValues = [r[0] for r in arcpy.da.SearchCursor (fc3, checkField)]

#Get list of fields
fields = [f.name for f in arcpy.ListFields (fc2)]

#Get index of check field
index = fields.index (checkField)

#Create insert cursor for fc3 to allow appending of rows
inCursor = arcpy.da.InsertCursor (fc3, fields)

#Create search cursor to iterate input feature class
cursor = arcpy.da.SearchCursor (fc2, fields)
#iterate
for row in cursor:
    #Get value to check
    checkValue = row[index]

    #Check if value is in target fc
    if checkValue in checkValues:
        #skip if value is in target fc
        continue

    #Insert row otherwise
    inCursor.insertRow(row)

#Clean up
del cursor
del inCursor

0voto

Anton8000 Puntos 165

Para comprobar los tres atributos (o cualquier número de campos de la lista) e insertar la fila completa, incluida la geometría:

import arcpy
from operator import itemgetter

fc2 = r"C:\temp\temp.gdb\fc2" #input feature class
fc3 = r"C:\temp\temp.gdb\fc3" #target feature class
checkfields = ["SRNumber","YEAR","MONTH"] #fields to compare

fieldlist = [f.name for f in arcpy.ListFields(fc2) if not f.name.upper().startswith(('OBJ','SHA'))] #list all fields but objectid and shapefield(s)
fieldlist.append('SHAPE@')
checkindexes = [fieldlist.index(i) for i in checkfields]

all_values = [i for i in arcpy.da.SearchCursor(fc3, checkfields)]

icur = arcpy.da.InsertCursor(fc3,fieldlist)
with arcpy.da.SearchCursor(fc2,fieldlist) as cursor:
    for row in cursor:
        if itemgetter(*checkindexes)(row) not in all_values:
            icur.insertRow(row)
del icur

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X