Cómo eliminar registros repetidos en una lista de atributos obtenidas con PyQGIS

Cuando se tienen muchos rasgos (features) que representan una misma delineación es posible que la tabla atributiva de un shapefile contenga valores repetidos; especialmente si la proyección está en coordenadas geográficas. Es lo que sucede en el shapefile world_borders que se puede obtener en Internet donde todos los polígonos pertenecientes a un mismo país tienen repetidos todos sus atributos. Sin embargo, la potencia de Python en PyQGIS es tal que probablemente permite resolver este problema de una manera más eficiente que cualquier otro lenguaje de programación.

Carguemos directamente world_borders en QGIS; tal como se evidencia en la imagen siguiente:

loadvectors3

y abramos la Python Console (Plugins -> Python Console). Digitemos lo siguiente:

>>>wb=iface.activeLayer()
>>>iter = wb.getFeatures()
>>>attr=[]
>>>for feature in iter:
...    attr.append(feature.attributes())
>>>len(attr)
3784
>>>attr[0:5]
[[1.0, u'AA', u'Aruba', 193.0, 71218.0], 
[2.0, u'AC', u'Antigua and Barbuda', 443.0, 68320.0], 
[2.0, u'AC', u'Antigua and Barbuda', 443.0, 68320.0], 
[4.0, u'AG', u'Algeria', 2381740.0, 32129324.0], 
[5.0, u'AJ', u'Azerbaijan', 86600.0, 7868385.0]]

La lista de atributos tiene 3784 registros; cada uno con 5 campos. De ellos, sólo se imprimen 5 como muestra. Para eliminar los registros repetidos se va a crear una lista vacía, attr2, donde se van a almacenar los valores únicos mediante el siguiente procedimiento:

>>>attr2=[]
>>>for attribute in attr:
...	if attribute not in attr2:
...		attr2.append(attribute)
>>>len(attr2)
251
>>>attr2[0:10]
[[1.0, u'AA', u'Aruba', 193.0, 71218.0], 
[2.0, u'AC', u'Antigua and Barbuda', 443.0, 68320.0], 
[4.0, u'AG', u'Algeria', 2381740.0, 32129324.0], 
[5.0, u'AJ', u'Azerbaijan', 86600.0, 7868385.0], 
[6.0, u'AL', u'Albania', 28748.0, 3544808.0], 
[7.0, u'AM', u'Armenia', 29800.0, 2991360.0], 
[9.0, u'AO', u'Angola', 1246700.0, 10978552.0], 
[10.0, u'AQ', u'American Samoa', 199.0, 57902.0], 
[11.0, u'AR', u'Argentina', 2766890.0, 39144753.0], 
[12.0, u'AS', u'Australia', 7686850.0, 19913144.0]]

Hay registrados 251 países en world_borders. Se observa ahora que los países no están ordenados alfabéticamente. Esto tampoco es problema en Python. Se puede ordenar por la tercera columna (index 2) usando una función anónima con lambda en ‘sort’. Este es el procedimiento:

>>>attr2.sort(key=lambda x: x[2])
>>>attr2[0:10]
[[3.0, u'AF', u'Afghanistan', 647500.0, 28513677.0], 
[6.0, u'AL', u'Albania', 28748.0, 3544808.0], 
[4.0, u'AG', u'Algeria', 2381740.0, 32129324.0], 
[10.0, u'AQ', u'American Samoa', 199.0, 57902.0], 
[8.0, u'AN', u'Andorra', 468.0, 69865.0], 
[9.0, u'AO', u'Angola', 1246700.0, 10978552.0], 
[14.0, u'AV', u'Anguilla', 102.0, 13008.0], 
[15.0, u'AY', u'Antarctica', 1.0, 1.0], 
[2.0, u'AC', u'Antigua and Barbuda', 443.0, 68320.0], 
[11.0, u'AR', u'Argentina', 2766890.0, 39144753.0]]

Observen que ahora está ordenada alfabéticamente por países.

Esta entrada fue publicada en Código Python, PyQGIS, SIG, Software Libre. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s