¿Unir datos de Excel a la tabla de atributos en QGIS sin crear duplicados?

15

Tengo una tabla de atributos con dos campos vacíos en QGIS.

Ejemplo 1

Quiero importar una base de datos de Excel para llenar mis campos vacíos en QGIS. Mi archivo de Excel coincide con las columnas de mi tabla de atributos QGIS.

Ejemplo_2

Puedo unir correctamente mi Excel (.CSV) a mi shapefile. Sin embargo, el proceso, en lugar de llenar los campos en blanco como deseo, creó duplicados. Con la ayuda de «Table Manager» puedo corregir la situación, pero requiere mucho tiempo. Estoy buscando una forma más eficiente de unir mis datos de Excel.

Ejemplo_3

¿Cómo puedo unir mi archivo de Excel a mi tabla de atributos sin crear duplicados?

Laurent Robitaille-Lainesse
fuente
33
Eche un vistazo a este tutorial: Realizar
uniones de

Respuestas:

13

Haría las siguientes cosas para hacer la vida más fácil:

Antes de hacer esto, haga una copia de seguridad de su shapefile.

  1. En su archivo de forma, vaya a las propiedades / campos de la capa y active el modo de edición.
  2. seleccione todos los campos excepto el campo ID
  3. Eliminar todos los campos excepto el campo ID
  4. agregue su archivo csv como una capa en QGIS (Menú principal / Capa / Agregar capa / Agregar capa de texto delimitado) ingrese la descripción de la imagen aquí(no elija geometría)
  5. en su archivo de forma, seleccione propiedades / combinaciones y elija ambos campos ID para origen y destino. Como se describe en la otra respuesta a esta pregunta.
  6. Guarde su Shapefile modificado.

ingrese la descripción de la imagen aquí

esta es la pestaña Campo a la que me refiero

ingrese la descripción de la imagen aquí

No olvide alternar la edición antes y después de eliminar campos innecesarios.

RutgerH
fuente
13

Deberá unir el archivo de Excel al archivo de forma. Los unirá en un atributo común y el resultado será una capa unida donde cada registro contiene los atributos tanto del archivo de forma como del archivo de Excel.

Ok, primero carga su archivo de Excel y su vector más tarde en las capas. Utilicé algunos datos de prueba que hice, pero su configuración debería ser similar a la siguiente. ingrese la descripción de la imagen aquí

Ahora haga clic derecho en la capa (en el panel de capas) y elija propiedades, luego elija unir. Primero presione el signo verde + en la esquina inferior izquierda (Flecha roja grande en la imagen a continuación) y aparecerá un nuevo menú Agregar unión de vectores (como a continuación) Aquí su capa de unión será el archivo de Excel (así que elija el archivo de Excel adecuado & hoja) el campo de unión es el campo en el archivo de Excel que contiene el atributo común para el archivo de forma. El campo de destino es el campo coincidente en el archivo de forma. (en mi caso, ambos campos comunes se denominaron unidad, pero si el campo se llamara UNIT_ en el archivo de forma, lo habría usado en lugar de UNIT para mi campo objetivo)
ingrese la descripción de la imagen aquí Hay algunas otras opciones con las que puede meterse en la unión, como si solo desea ver ciertos campos, etc. de todos modos, así que ahora están unidos y si regresa y mira los atributos del shapefile verá ahora tiene los atributos correspondientes del archivo de Excel como a continuación.

ingrese la descripción de la imagen aquí

Aquí hay algunos tutoriales útiles para mostrarle paso a paso cómo hacerlo:

https://www.mapbox.com/tilemill/docs/guides/joining-data/

http://maps.cga.harvard.edu/qgis/wkshop/join_csv.php

http://qgis.spatialthoughts.com/2012/03/using-tabular-data-in-qgis.html

¿Cómo unir tablas externas con la tabla de atributos de un shapefile en QGIS?

http://www.digital-geography.com/qgis-tutorial-ii-how-to-join-data-with-shapefiles/#.Vs9vpmHXKUk

y el tutorial ArMoraer mencionado en los comentarios.

ed.hank
fuente
Miré el tutorial mapbox.com/tilemill/docs/guides/joining-data que, por cierto, fue muy útil. Sin embargo, todavía no puedo unir mi archivo DBF a mi shapefile. Me sorprende porque ambas estructuras de mi mesa coinciden perfectamente. Parece que no entiendo el «campo de unión» y el «campo de destino». ¿Podría agregar más detalles por favor?
Laurent Robitaille-Lainesse
1
@Laurent Robitaille-Lainesse Actualicé mi publicación con una guía más paso a paso. Uní un archivo de Excel de prueba a un archivo de forma de polígono solo para asegurarme de que mis pasos eran correctos.
ed.gracias
Tuve éxito en unir correctamente mi archivo de Excel a QGIS. Observo que la opción «unirse» agrega un nuevo campo en la tabla de atributos. Corrígeme si estoy equivocado, pero parece imposible agregar los datos de mi archivo de Excel al campo vacío en mi tabla de atributos.
Laurent Robitaille-Lainesse
1
Si tiene un campo en blanco, entonces usa la calculadora de campo para completar desde el campo recién unido al campo que tiene en su tabla.
ed.gracias
10

Solo para agregar otro método, puede configurar una macro de proyecto que cuando se carga:

  1. Automáticamente une su shapefile a su csv
  2. Actualiza los campos IP1yIP2
  3. Elimina los campos unidos dejando solo los campos del archivo de forma (es decir, sin duplicados)

Primero, cree un proyecto si aún no lo ha hecho y luego vaya a la barra de herramientas:

Proyecto> Propiedades del proyecto ...> Macros

Luego use el siguiente código en la def openProject():función e ingrese los nombres de sus capas y los campos que desea unir. Usé "Ejemplo" y "hoja de cálculo" para mi archivo de forma y archivo csv respectivamente con el campo ID:

from PyQt4.QtCore import *
import qgis
from qgis.core import QgsMapLayerRegistry, QgsVectorJoinInfo

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your shapefile name
    if layer.name() == "Example":
        qgis.utils.iface.setActiveLayer(layer)
        shp = qgis.utils.iface.activeLayer()

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your csv name
    if layer.name() == "spreadsheet":
        qgis.utils.iface.setActiveLayer(layer)
        csv = qgis.utils.iface.activeLayer()

# Set up join parameters
shpField='ID'
csvField='ID'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = csv.id()
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField
shp.addJoin(joinObject)

# Define fields to update and joined fields to copy values from
ip1 = shp.fieldNameIndex('IP1') 
ip1_join = shp.fieldNameIndex('spreadsheet_IP1')
ip2 = shp.fieldNameIndex('IP2') 
ip2_join = shp.fieldNameIndex('spreadsheet_IP2')

shp.startEditing()
for feat in shp.getFeatures():
    shp.changeAttributeValue(feat.id(), ip1, feat.attributes()[ip1_join])
    shp.changeAttributeValue(feat.id(), ip2, feat.attributes()[ip2_join])
shp.commitChanges()

# Remove join 
shp.removeJoin(csv.id())

Proyecto macro

Asegúrese de que las capas no estén unidas, guarde el proyecto y habilite las macros yendo a la barra de herramientas:

Configuración> General> Habilitar macros


Ahora, cuando cierre el proyecto y edite el archivo csv, la próxima vez que cargue el proyecto, los campos deberían actualizarse automáticamente:

Edición de archivo csv

Resultados

José
fuente
7

Mi sugerencia es utilizar LibreOffice / Open Office de código abierto para editar su archivo de Excel y crear un archivo .dbf. Preparé el libro de prueba para ti. Libro de prueba - enlace

  1. Abrir archivo en Libre Office / Open Office.
  2. Pegue los datos de la hoja "Excel" de su archivo de Excel.
  3. Pegue los datos de la hoja "DBF" desde su archivo .dbf (pegue solo ID, X, Y) (los valores de IP1, IP2 se agregarán automáticamente).
  4. Guardar como archivo name.dbf (donde el nombre es el mismo que el nombre del archivo de forma).

Tabla de resultados sin duplicados en QGIS: ingrese la descripción de la imagen aquí

Artec
fuente
5

¿Por qué están los campos vacíos allí para empezar? ¿Puede comenzar sin los campos vacíos y simplemente usar las dos columnas producidas en la unión? Creo que este es el enfoque más simple. O eso o encontrar una herramienta similar a la herramienta "Cargar" en ArcGIS.

https://desktop.arcgis.com/en/arcmap/latest/extensions/production-mapping/loading-data-into-a-geodatabase.htm

Si no está utilizando una geodatabase, le recomiendo esto.

Stella
fuente
No estoy usando una geodatabase. De hecho, no estoy familiarizado con eso.
Laurent Robitaille-Lainesse
1
@ LaurentRobitaille-Lainesse Le recomiendo crear una nueva geodatabase de archivos, luego una nueva clase de entidad dentro de eso, y usar esto para almacenar sus datos. También recomiendo hacer una breve investigación sobre geodatabases y clases de entidad y por qué las usamos, lo que ofrecen más allá de los shapefiles.
Stella
4

No sé si hay una forma directa de unirse sin duplicado ya que ese archivo .shp es compatible con attribut en .DBF (archivo de base de datos). Este DBF tiene una declaración de tipo de columna como entero, real, cadena, etc. con detalles de su longitud y precisión. El archivo CSV solo tiene una columna normal sin ningún tipo declarado. No sé qué tan grande es su archivo. Para mí, mantendré los campos duplicados y luego usaré el indicador de campo con fórmula general:

Original Field_x = Duplicar Field_x

Luego elimine todos esos campos duplicados (a través de QGIS o programa de base de datos)

Uje Indo
fuente
3

Creo que la forma más fácil de solucionar esto sería simplemente eliminar las dos columnas en cuestión en la tabla QGIS antes de la unión. Luego, cuando se une al archivo de forma, las dos columnas que desea no se duplicarán y mantendrán sus nombres de columna originales.

RHB
fuente