4 votos

Unir atributos en 100s SHPs de vuelta al lote principal de archivos SHP en QGIS

Tengo ~200 shapefiles con datos en barrios por bloques censales en toda la ciudad. Quiero unir cada uno de estos shapefiles al archivo principal de bloques censales para que una columna de recuento en cada uno de los shapefiles de barrios se una al shapefile original de bloques censales de la ciudad. Pensé que podría hacerlo en un proceso por lotes utilizando la función "unir tabla de atributos", pero parece que este proceso por lotes creará 200 archivos unidos, en lugar de simplemente añadir cada una de las uniones a la tabla del archivo shape de la ciudad. ¿Alguien sabe cómo puedo hacer esto en QGIS? Estoy utilizando QGIS 2.14.3

1 votos

Si este fuera mi trabajo, cargaría todos estos shapefiles en PostGIS, por muy engorroso que parezca, en 1 tabla de 'barrios', con la atribución adecuada... luego simplemente utilizaría SQL spatial para hacer la intersección y el resumen. Entonces tienes 1 tabla con toda la información que necesitas... ¿cómo acabaste con 200 shapefiles? Tal vez eso requiere más explicación? Pero creo que de cualquier manera vas a tener que fusionarlos en 1 antes de hacer el trabajo.

0 votos

Gracias, es una buena idea. Lo probaré en PostGIS.

4voto

Mue Puntos 2469

También recomendaría el uso de PostGIS como lo menciona DPSSpatial pero en QGIS, podría utilizar un poco de python para recorrer todas sus capas y realizar una operación de unión.

Utiliza un campo común para unir la capa principal con cada capa individual del grupo. Se sólo une un campo llamado "Count" de cada capa individual. Edite el código para que se ajuste a sus nombres de capa/grupo/campo y péguelo en el Consola Python :

# Define layer tree root and group
root = QgsProject.instance().layerTreeRoot()
layer_group = root.findGroup('Layer group')

# Define main layer and common fields from main layer and layers stored in group
main_layer = QgsMapLayerRegistry.instance().mapLayersByName('main_layer_name')[0]
main_layer_field = 'Field'
childField = 'Field'

# Iterate through each layer in group and join to main layer using defined fields
for layer in layer_group.children():
    joinObject = QgsVectorJoinInfo()
    joinObject.joinLayerId = layer.layerId()
    joinObject.joinFieldName = childField
    joinObject.targetFieldName = main_layer_field
    joinObject.setJoinFieldNamesSubset(['Count'])
    joinObject.memoryCache = True
    main_layer.addJoin(joinObject)

Su capa principal debe contener el campo "Count" de las capas individuales.

1 votos

Gracias @Joseph - esto funcionó. He hecho un cambio en la línea 13 para que la asignación sea para la capa sobre la que se está iterando. Todavía tengo que probar esto sobre los 200 shps y todavía puede configurar esto en PostGIS como DPSSpatial sugirió.

0 votos

@LeeR. - De nada, me alegro de que haya sido útil y gracias por la edición :)

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