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

12

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

QuieroimportarunabasededatosdeExcelparallenarmiscamposvacíosenQGIS.MiarchivodeExcelcoincideconlascolumnasenmitabladeatributosdeQGIS.

Puedounircorrectamentemiexcel(.CSV)amishapefile.Sinembargo,elproceso,enlugarderellenarloscamposenblancocomodeseo,creóduplicados.Conlaayudade«TableManager»soycapazdecorregirlasituación,perorequieremuchotiempo.EstoybuscandounaformamáseficientedeunirmisdatosdeExcel.

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

    
pregunta Laurent Robitaille-Lainesse 25.02.2016 - 21:06

7 respuestas

11

Haría lo siguiente para facilitar la vida:

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

  1. En su shapefile, vaya a las propiedades / campos de la capa y gire en el modo de edición.
  2. selecciona todos los campos excepto el campo de ID
  3. Eliminar todos los campos excepto el campo de ID
  4. agrega tu archivo csv como capa en QGIS (Menú principal / Capa / Agregar capa / Agregar capa de texto delimitado) (no elija geometría)
  5. en tu shapefile, seleccione propiedades / uniones y elija ambos campos de ID para origen y destino. Como se describe en la otra respuesta a esta pregunta.
  6. guarda tu Shapefile modificado.

estaeslapestañaCampoalaquemerefiero

No te olvides de alternar la edición antes y después de eliminar un campo innecesario

    
respondido por el RutgerH 25.03.2016 - 03:06
12

Querrá unir el archivo de excel al shapefile. Los unirá en un atributo común y el resultado será una capa unida donde cada registro contiene los atributos del archivo shape y el archivo excel.

Bien, primero cargue 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.

Ahorahagaclicderechoenlacapa(enelpaneldecapas)yelijalaspropiedades,luegoelijaunirse.Primero,hagaclicenelsignoverde+enlaparteinferiorizquierda(GranFlechaRojaenlaimagendeabajo)yapareceráunnuevomenúAgregarVectorUnirse(comoabajo)AquísucapadeuniónseráelarchivodeExcel(asíqueelijaelarchivodeExceladecuado)&hoja)elcampodeunióneselcampoenelarchivodeexcelquecontieneelatributocomúnalshapefile.Elcampodedestinoeselcampocoincidenteenelshapefile.(enmicaso,amboscamposcomunespasaronallamarseunidad,perosielcamposellamaraUNIT_enelarchivodeforma,lohabríausadoenlugardeUNITparamicampodedestino)
Hayalgunasotrasopcionesconlasquepuedesmeterteenlaunión,comosisoloquisierasverciertoscampos,etc.Detodosmodos,ahoraestánunidosysiregresasymiraslosatributosdelshapefile,verásahoratienelosatributoscorrespondientesdelarchivoexcelcomosemuestraacontinuación.

Aquíhayalgunostutorialesprácticosparamostrartepasoapasocómohacerlo:

enlace

enlace

enlace

Cómo unirse ¿Tablas externas con la tabla de atributos de un shapefile en QGIS?

enlace

y el tutorial ArMoraer mencionado en los comentarios.

    
respondido por el ed.hank 25.02.2016 - 22:25
8

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

  1. Une automáticamente su shapefile a su csv
  2. Actualiza los campos IP1 y IP2
  3. Elimina los campos unidos dejando solo los campos del shapefile (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 función def openProject(): e ingrese los nombres de sus capas y los campos que desea unir. Usé "Ejemplo" y "hoja de cálculo" para mi archivo shapefile y 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())

Asegúresedequelascapasesténnounidas,guardeelproyectoyhabilitemacrosyendoalabarradeherramientas:

Configuración>General>Habilitarmacros

Ahora,cuandocierreelproyectoyediteelarchivocsv,lapróximavezquecargueelproyecto,loscamposseactualizaránautomáticamente:

    
respondido por el Joseph 29.03.2016 - 12:40
5

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

  1. Abrir archivo en Libre Office / Open Office.
  2. Pegue en la hoja de datos "Excel" de su archivo de Excel.
  3. Pegue en la hoja de datos "DBF" de 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:

    
respondido por el Artec 25.03.2016 - 22:23
4

No sé si hay una forma directa de unirse sin duplicar, ya que el soporte de archivos .shp se atribuye 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 columna normal sin ningún tipo declarado. No sé qué tan grande es tu archivo. Para mí, mantendré los campos duplicados y luego usaré caluclator de campo con una fórmula general:

  

Original Field_x = Duplicate Field_x

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

    
respondido por el Uje Indo 27.03.2016 - 09:32
4

¿Por qué los campos vacíos están ahí 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 encuentra una herramienta similar a la herramienta "Cargar" en ArcGIS.

enlace

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

    
respondido por el Stella 28.03.2016 - 07:38
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 shapefile, las dos columnas que desea no serán duplicadas y mantendrán sus nombres de columna originales.

    
respondido por el RHB 29.03.2016 - 13:49

Lea otras preguntas en las etiquetas