4 votos

¿Filtrando el conjunto de datos usando SQL o Python en ArcGIS Desktop?

El uso de ArcGIS Desktop 10.0 SP4.

Tengo un gran conjunto de datos de los sitios que necesita ser filtrado a un tamaño utilizable. Hay un atributo para la site_ID y otro para el site_type. Hay duplicado site_ID en el conjunto de datos y sólo hay un registro para cada sitio. La preferencia de lo que se elimina depende del tipo. Si hay un registro con un tipo "a", a continuación, todos los demás registros para que el sitio puede ser eliminado. Si un sitio no tiene un tipo "a", entonces no importa que los registros eliminados.

En pocas palabras, quiero pasar esta...

Site_ID-----Site_Type
123--------------Un
123--------------B
123--------------C
555--------------B
555--------------B
555--------------C

En este...

Site_ID-----Site_Type
123--------------Un
555--------------no importa

He estado jugando con las instrucciones SQL sin suerte. Alguna sugerencia?

2voto

Free Wildebeest Puntos 1548

Basado en el pseudocódigo de @MichaelTodd, y lo que aparece arriba, he improvisado un poco de código que creo que va a funcionar.

En esencia, se trata con el ID que contienen un tipo de "A" en primer lugar.
1. Seleccione los ID
2. Seleccione las características que coincidan con los documentos de identidad.
3. Eliminar características en la que el Tipo <>

Siguiente, de acuerdo con las características que no contienen un Tipo A. Esta ahora solo debería incluir características que no estaban en el primer set, ya que los que se han eliminado.
1. Seleccione el ID del Tipo <>
2. El paso a través de la IDENTIFICACIÓN, la selección de características con la coincidencia de atributo
3. Recuento de las características de coincidencia de cada ID, a continuación, recorrer la eliminación de las características de hasta sólo 1 está a la izquierda.

import arcpy
arcpy.env.workspace = r"c:\Temp"
fc = "newshape.shp"

field1 = "Site_ID"
field2 = "Site_Type"
field3 = "OID"

#Setting delimiters should allow you to change source without causing problem in query strings
delimfield1 = arcpy.AddFieldDelimiters(fc,field1)
delimfield2 = arcpy.AddFieldDelimiters(fc,field2)
delimfield3 = arcpy.AddFieldDelimiters(fc,field3)

srchstring = delimfield2 + "= 'A'"

#Returns features with Site_Type = A
rowswitha = arcpy.SearchCursor(fc,srchstring,"",field1, "Site_ID A")

#Makes list of Site_ID's that have one or more feature where Site_Type = A
idswitha = []
for itemwitha in rowswitha:
    idswitha.append(itemwitha.getValue(field1))

#Step through list of Features, delete features in ID list where Site_ID <> A
for idwitha in idswitha:
    idstring = delimfield1 + " = " + idwitha
    rowswithid = arcpy.UpdateCursor(fc,idstring)

    for rowwithid in rowswithid:
        if rowwithid.getValue(field2)!='A':
            rowswithid.deleteRow(rowwithid)

    del rowswithid, rowwithid


#Create list of features where Site_Type not equal to A
srchstring2 = delimfield2 + " <> 'A'"
fields = field3 + "; " + field1
rowsnoa = arcpy.SearchCursor(fc,srchstring2,"",fields, "Site_ID A")

#Create list of ID's where Wite_Type <>A
idsnoa = []
for itemnoa in rowsnoa:
    idsnoa.append(itemnoa.getValue(field1))

#Create Unique value list of IDs
setidsnoa = set(idsnoa)

#For each ID, return features, count features, then delete until deleted count leaves 1
for idnoa in idsnoa:
    idnoastring = delimfield1 + " = " + idnoa
    rowsnoaid = arcpy.UpdateCursor(fc, idnoastring)

    #Create list to return count of items in cursor
    rowcountlist = []
    for rownoaid in rowsnoaid:
        rowcountlist.append(rownoaid.getValue(field3))
    #Get count of items in list
    rowcount = len(rowcountlist)
    count = 0
    rowdel = rowsnoaid.next()
    while count < rowcount:
        rowsnoaid.deleteRow(rowdel)
        rowdel = rownoaid.next()
        count +=1

    del rowsnoaid

He editado para añadir el elemento de la lista para devolver la cuenta para la segunda sección de la consulta. No es el código más eficiente, por lo que cualquier mejora es bienvenida.

He quitado el índice de llamada de UpdateCursor como esto no es posible. Cambiado a next() método.

1voto

Nate Puntos 220

Esto se puede hacer con la herramienta Disolver:

  • Site_ID como campo de disolución
  • Site_type como un campo de estadísticas con tipo de estadística MIN

arcpy.Dissolve_management ("in.shp", "out.shp", "Site_ID", "Site_type MIN", "MULTI_PART", "DISSOLVE_LINES")

0voto

Jonathan Puntos 197

Si esto fuera SQL, haría algo como lo siguiente:

 select distinct site_id, 'A'
from table 
where site_type='A' 
union all
select distinct site_id, 'B' 
from table 
where site_type!='A' and 
site_id not in (select site_id from table where site_type='A')
 

La consulta anterior selecciona identificadores de sitio únicos que tienen un tipo A y los agrega al conjunto de identificadores de sitio únicos para identificadores de sitio que no tienen un tipo A.

Veré cómo se podría hacer eso en Python y actualizar si puedo resolverlo.

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