Importante

La traducción es un esfuerzo comunitario al que puedes unirte. Esta página está actualmente traducida en 69.28%.

16.4. Connecting and Editing Data Across Layers

Ability to connect data from different layers is one of the duties of a GIS software. Such a connection can be based on the spatial relationship between the features, or on their shared attributes. QGIS provides tools to handle any of these associations, such as:

  • Processing algorithms that can create a new layer as a result of the connection, namely Unir atributos por localización, Unir atributos por proximidad, Unir atributos por valor de campo, …

  • SQL queries to create a new layer from the DB Manager or as a virtual layer

  • Joins properties or relations settings that temporarily extend attributes of features in a given layer, with those of features in another layer based on some matching attribute(s).

    Joins and relations are technical concepts borrowed from databases to get the most out of data stored in tables by combining their contents. The idea is that features (rows) of different layers (tables) can be associated to each other. The number of rows which are matching each other can be of any value (zero, one, many).

16.4.1. Joining features between two layers

Joins in QGIS allow you to associate features of the current layer to features from another loaded vector layer. Whether they are spatially enabled and the type of geometry do not matter. The join is based on an attribute that is shared by the layers, in a one-to-one relationship.

To create a join on a layer (identified below as target layer):

  1. Go to the layer Properties ► join Joins tab

  2. Click en el botón symbologyAdd Add new join. El diálogo Add vector join aparece.

  3. Seleccione la Join layer que quiera conectar con la capa vectorial de destino

  4. Specify the Join field (from the join layer) and the Target field (from the target layer). These are the fields that are used to find matching feature in both layers hence they should have values in common.

  5. Presione OK y se agrega un resumen de los parámetros seleccionados al panel Join.

../../../_images/join_attributes.png

Figura 16.101 Unir una tabla de atributos a una capa vectorial existente

The steps above will create a join, where ALL the attributes of the first matching feature in the join layer is added to the target layer’s feature. The following logic is used to pair features during a join process:

  • All the features in the target layer are returned, regardless they have a match

  • If the target field contains duplicate values, these features are assigned the same feature from the join layer.

  • If the join field contains duplicate matching values, only the first fetched feature is picked.

Nota

Joins in QGIS are based on a single field matching so most of the times, you would want to make sure that values in the matchable fields are unique.

QGIS provides some more options to tweak the join:

  • checkbox Cache join layer in virtual memory: le permite almacenar valores en la memoria caché (sin geometrías) de la capa unida para acelerar las búsquedas.

  • unchecked Create attribute index on the join field to speed up lookups

  • unchecked Dynamic form: ayuda a sincronizar campos de unión sobre la marcha, de acuerdo con el Target field. De esta forma, las restricciones para los campos de unión también se actualizan correctamente. Tenga en cuenta que está desactivado de forma predeterminada porque puede llevar mucho tiempo si tiene muchas funciones o una gran cantidad de combinaciones.

  • Si la capa de destino es editable, se mostrarán algunos iconos en la tabla de atributos al lado de los campos, para informar sobre su estado:

    • joinNotEditable: la capa de unión no está configurada para ser editable. Si desea poder editar características de unión desde la tabla de atributos de destino, debe marcar la opción checkbox Editable join layer.

    • joinedLayerNotEditable: la capa de unión está bien configurada para ser editable, pero su estado actual es de solo lectura.

    • joinHasNotUpsertOnEdit: the join layer is editable, but synchronization mechanisms are not activated. If you want to automatically add a feature in the join layer when a feature is created in the target layer, then you have to check the option checkbox Upsert on edit. Symmetrically, the option checkbox Delete cascade may be activated if you want to automatically delete join features.

  • unchecked Joined fields: en lugar de agregar todos los campos de la capa unida, puede especificar un subconjunto.

  • unchecked Custom field name prefix para campos unidos, para evitar la colisión de nombres

16.4.2. Setting relations between multiple layers

Unlike joins that define a one-to-one link between features across two layers, relations help you build interconnections between multiple features across two or more layers. As such, relations are project level settings and are set in Project ► Properties ► relations Relations tab. From there, you can:

  • symbologyAdd Add relation whose type can be:

    Nota

    There is no simple way yet to edit a non-polymorphic relation once it has been created. Only the name can be edited with a double-click. For any other parameters of such a relation you will have to remove and recreate it.

  • symbologyAdd Discover relations: QGIS is able to discover existing relations from supported database formats (PostgreSQL, GeoPackage, ESRI File Geodatabase, …). This can be a good way to ease the relations definition.

  • symbologyRemove Remove relation

../../../_images/project_relations.png

Figura 16.102 Pestaña Relaciones

16.4.2.1. One to many (1-N) relations

As an example you have a layer with all regions of Alaska (polygon) which provides some attributes about its name and region type and a unique id (which acts as primary key).

Luego, obtiene otra capa de puntos o tabla con información sobre los aeropuertos que se encuentran en las regiones y también desea realizar un seguimiento de estos. Si desea agregarlos a la capa de regiones, debe crear una relación de uno a muchos utilizando claves externas, porque hay varios aeropuertos en la mayoría de las regiones.

../../../_images/regions_with_airports.png

Figura 16.103 Región de Alaska con aeropuertos

Layers and keys

QGIS makes no difference between a table and a vector layer. Basically, a vector layer is a table with a geometry. So you can add your table as a vector layer. To demonstrate the 1-n relation, you can load the regions and airports layers in the sample dataset. In practice, each airport belongs to exactly one region while each region can have any number of airports (a typical one to many relation).

which has a foreign key field (fk_region) to the layer regions.

In addition to the attributes describing the airports, the aiports layer has another field fk_region which acts as a foreign key (if you have a database, you will probably want to define a constraint on it). This fk_region field will always contain an id of a region. It can be seen like a pointer to the region it belongs to.

All you have to do is to tell QGIS the relation between the layers so that you can design a custom edit form for editing and QGIS takes care of the setup. It works with different providers (so you can also use it with shape and csv files).

Definir relaciones 1-N

La primera cosa que vamos a hacer es informar a QGIS de las relaciones entre las capas. Esto se hace en Proyecto ► Propiedades…. Abre la pestaña Relaciones y haz click en symbologyAdd Agregar Relación.

  • Name is going to be used as a title. It should be a human readable string describing what the relation is used for. We will just call say airport_relation in this case.

  • Capa de Referencia (Parental) también considerada como capa padre, es la única con la clave primaria, a la que se señala, así que aquí la capa es regions. Debe definir la clave primaria de la capa a la que se hace referencia, así que es ID.

  • Capa Referenciada (Hija) también considerada como capa hija, es la única con la clave externa en ella. En nuestro caso, es la capa airports. Para esta capa, debe agregar un campo de referencia que apunte a la otra capa, por lo que es fk_region.

    Nota

    Sometimes, you need more than a single field to uniquely identify features in a layer. Creating a relation with such a layer requires a composite key, i.e. more than a single pair of matching fields. Use the symbologyAdd Add new field pair as part of a composite foreign key button to add as many pairs as necessary.

  • Id se utilizará para fines internos y debe ser único. Puede que lo necesite para construir formularios personalizados. Si lo deja vacío, se generará uno para usted, pero puede asignar uno usted mismo para obtener uno que sea más fácil de manejar.

  • Intensidad de la relación establece la intensidad de la relación entre la capa principal y la secundaria. El tipo Association por defecto significa que la capa principal está simplemente vinculada a la secundaria, mientras que el tipo Composition le permite duplicar también las funciones secundarias al duplicar las principales y al eliminar una función los hijos también se eliminan, lo que da como resultado una cascada en todos los niveles (significa que los hijos de los hijos de… también se eliminan).

../../../_images/regions_airports_mapping.png

Figura 16.104 Agregar una relación entre las capas regions y airports

En la pestaña Relaciones, puede también presionar el botón symbologyAdd Descubrir relación para obtener las relaciones disponibles de los proveedores de las capas cargadas. Esto es posible para capas almacenadas en proveedores de datos como PostgreSQL o SpatiaLite.

Formularios para relaciones 1-N

Now that QGIS knows about the relation, it will be used to improve the forms it generates. As we did not change the default form method (autogenerated), it will just add a new widget in our form. So let’s select the layer region in the legend and use the identify tool. Depending on your settings, the form might open directly or you will have to choose to open it in the identification dialog under actions.

../../../_images/airport_relation_dataview.png

Figura 16.105 Regiones de diálogo de identificación con relación a aeropuertos

Como puede ver, los aeropuertos asignados a esta región en particular se muestran en una tabla. Y también hay algunos botones disponibles. Repasemos en breve:

  • El botón toggleEditing es para alternar el modo de edición. Tenga en cuenta que cambia el modo de edición de la capa de aeropuerto, aunque estamos en la forma de entidad de una entidad de la capa de región. Pero la tabla representa entidades de la capa del aeropuerto.

  • El botón saveEdits es para guardar todas las ediciones en la capa secundaria (aeropuerto).

  • El botón capturePoint permite digitalizar la geometría del aeropuerto en el lienzo del mapa y asigna el nuevo objeto espacial a la región actual predeterminada. Tenga en cuenta que el icono cambiará según el tipo de geometría.

  • El botón newTableRow agrega un nuevo registro a la tabla de atributos de la capa del aeropuerto y asigna la nueva entidad a la región actual de forma predeterminada. La geometría se puede dibujar posteriormente con la herramienta de digitalización Añadir pieza.

  • El botón duplicateFeature permite copiar y pegar una o más entidades secundarias dentro de la capa secundaria. Posteriormente, se pueden asignar a una función principal diferente o se pueden modificar sus atributos.

  • El botón deleteSelectedFeatures elimina los aeropuerto(s) seleccionados de forma permanente

  • El símbolo link abre un nuevo cuadro de diálogo donde puede seleccionar cualquier aeropuerto existente que luego se asignará a la región actual. Esto puede ser útil si creó el aeropuerto en la región equivocada por accidente.

  • El símbolo unlink desvincula los aeropuerto(s) seleccionados de la región actual, dejándolos sin asignar (la clave externa se establece en NULL) de manera efectiva.

  • Con el botón zoomToSelected puede acercar el mapa a las entidades secundarias seleccionadas.

  • Los dos botones formView y openTable a la derecha cambia entre la table view and form view de las funciones secundarias relacionadas.

Si utiliza el Diseñador de arrastrar y soltar para el objeto espacial de las regiones, puede seleccionar qué herramientas están disponibles. Incluso puede decidir si se abre un nuevo formulario cuando se añade un nuevo objeto espacial utilizando la opción Forzar la ocultación del formulario en la función de añadir. Tenga en cuenta que esta opción implica que los atributos no nulos deben tomar un valor válido por defecto para funcionar correctamente.

../../../_images/airport_relation_formproperties.png

Figura 16.106 Diseñador de arrastrar y soltar para configurar las herramientas de relación entre regiones y aeropuertos

En el ejemplo anterior, la capa de referencia tiene geometrías (por lo que no es solo una tabla alfanumérica), por lo que los pasos anteriores crearán una entrada en la tabla de atributos de capa que no tiene una característica geométrica correspondiente. Para agregar la geometría:

  1. Elige openTable Abrir Tabla de Atributos para la capa de referencia.

  2. Selecciona el registro que se ha agregado previamente dentro de la forma de entidad de la capa referenciada.

  3. Usa la herramienta de digitalización addPart Añadir parte para adjuntar una geometría al registro de la tabla de atributos seleccionado.

Si trabajas en la tabla del aeropuerto, el widget Relation Reference se configura automáticamente para el campo fk_region (el que se usa para crear la relación), consulta Relation Reference widget.

En el formulario del aeropuerto verás el formView en el lado derecho del campo fk_region: si haces click en el botón, se abrirá el formulario de la capa de la región. Este widget te permite abrir fácil y rápidamente los formularios de las funciones principales vinculadas.

../../../_images/airport_attributes.png

Figura 16.107 Diálogo de identificación de aeropuerto con relación a las regiones

El widget Relation Reference también tiene una opción para incrustar la forma de la capa principal dentro de la secundaria. Está disponible en el menú Propiedades ► Formulario de atributos de la capa del aeropuerto: seleccione el campo fk_region y marca la opción Mostrar formulario incrustado.

If you look at the feature dialog now, you will see that the form of the region is embedded inside the airports form and will even have a combobox, which allows you to assign the current airport to another region.

../../../_images/airport_attributes_expanded.png

Además, si cambias el modo de edición de la capa del aeropuerto, el campo fk_region también tiene una función de autocompletar: mientras escribes, verás todos los valores del campo `` id “” de la capa de la región. Aquí es posible digitalizar un polígono para la capa de región usando el botón symbologyAdd si elegiste la opción Permitir agregar nuevas entidades en la Propiedades -> Formulario de atributos de la capa del aeropuerto.

La capa secundaria también se puede utilizar en la herramienta Seleccionar objetos por valor para seleccionar entidades de la capa principal según los atributos de sus hijos.

En Figura 16.108, se seleccionan todas las regiones donde la altitud media de los aeropuertos es superior a 500 metros sobre el nivel del mar.

Encontrarás que hay muchas funciones de agregación diferentes disponibles en el formulario.

../../../_images/relation_select_by_value.png

Figura 16.108 Seleccionar entidades principales con valores secundarios

16.4.2.2. Many-to-many (N-M) relations

Las relaciones N-M son relaciones de muchos a muchos entre dos tablas. Por ejemplo, las capas de airports y airlines: un aeropuerto recibe varias compañías aéreas y una compañía aérea vuela a varios aeropuertos.

This SQL code creates the three tables we need for an N-M relationship in a PostgreSQL/PostGIS schema named locations. You can run the code using the Database ► DB Manager… for PostGIS or external tools such as pgAdmin. The airports table stores the airports layer and the airline table stores the airlines layer. In both tables few fields are used for clarity. The tricky part is the airports_airlines table. We need it to list all airlines for all airports (or vice versa). This kind of table is known as a pivot table. The constraints in this table force that an airport can be associated with an airline only if both already exist in their layers.

CREATE SCHEMA locations;

CREATE TABLE locations.airports
(
   id serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   airport_name text NOT NULL,
   CONSTRAINT airports_pkey PRIMARY KEY (id)
);

CREATE INDEX airports_geom_idx ON locations.airports USING gist (geom);

CREATE TABLE locations.airlines
(
   id serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   airline_name text NOT NULL,
   CONSTRAINT airlines_pkey PRIMARY KEY (id)
);

CREATE INDEX airlines_geom_idx ON locations.airlines USING gist (geom);

CREATE TABLE locations.airports_airlines
(
   id serial NOT NULL,
   airport_fk integer NOT NULL,
   airline_fk integer NOT NULL,
   CONSTRAINT airports_airlines_pkey PRIMARY KEY (id),
   CONSTRAINT airports_airlines_airport_fk_fkey FOREIGN KEY (airport_fk)
      REFERENCES locations.airports (id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
      DEFERRABLE INITIALLY DEFERRED,
   CONSTRAINT airports_airlines_airline_fk_fkey FOREIGN KEY (airline_fk)
      REFERENCES locations.airlines (id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
      DEFERRABLE INITIALLY DEFERRED
 );

En lugar de PostgreSQL, también puedes utilizar GeoPackage. En este caso, las tres tablas se pueden crear manualmente usando Base de datos ► Administrador de Bases de datos…. En GeoPackage no hay esquemas, por lo que el prefijo locations no es necesario.

Las restricciones de clave externa en la tabla `` Airports_airlines`` no se pueden crear usando Tabla ► Crear Tabla… o Tabla ► Editar Tabla… por lo que deben crearse usando Base de datos ► Ventana SQL…. GeoPackage no admite declaraciones ADD CONSTRAINT, por lo que la tabla airports_airlines debe crearse en dos pasos:

  1. Configura la tabla solo con el campo id usando Tabla ► Crear tabla …

  2. Usando Base de Datos ► Ventana SQL…, escribe y ejecuta este código SQL:

    ALTER TABLE airports_airlines
       ADD COLUMN airport_fk INTEGER
       REFERENCES airports (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
       DEFERRABLE INITIALLY DEFERRED;
    
    ALTER TABLE airports_airlines
       ADD COLUMN airline_fk INTEGER
       REFERENCES airlines (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
       DEFERRABLE INITIALLY DEFERRED;
    

Luego, en QGIS, debe configurar dos una-a-muchas relaciones como se explicó anteriormente:

  • una relación entre la tabla de airlines y la tabla dinámica;

  • y una segunda entre la tabla airports y la tabla dinámica.

Una forma más fácil de hacerlo (solo para PostgreSQL) es usando Descubrir Relaciones en Proyecto ► Propiedades ► Relacione. QGIS leerá automáticamente todas las relaciones en su base de datos y solo tiene que seleccionar las dos que necesita. Recuerde cargar primero las tres tablas en el proyecto QGIS.

../../../_images/airports_airlines_relation.png

Figura 16.109 Relaciones y descubrimiento automático

En caso de que desee eliminar un `` airport`` o una airline, QGIS no eliminará los registros asociados en la tabla Airports_airlines. Esta tarea la realizará la base de datos si especificamos las * restricciones * correctas en la creación de la tabla dinámica como en el ejemplo actual.

Nota

** Combinando relación N-M con grupo de transacciones automáticas **

Debes habilitar el modo de transacción en Propiedades del proyecto ► Fuentes de datos ► cuando trabajes en dicho contexto. QGIS debería poder agregar o actualizar fila(s) en todas las tablas (airlines, airports y las tablas dinámicas).

Finalmente tenemos que seleccionar la cardinalidad correcta en Layer Properties ► Attributes Form para las capas airports y airlines. Para el primero debemos elegir la opción aerolíneas (id) y para el segundo la opción aeropuertos (id).

../../../_images/airports_airlines_relation_formproperties.png

Figura 16.110 Establecer cardinalidad de relación

Ahora puede asociar un airport con una airline (o una airline con un airport ) usando Agregar función secundaria o Vincular función secundaria existente en los subformularios. Se insertará automáticamente un registro en la tabla Airports_airlines.

../../../_images/add_airport_airline.png

Figura 16.111 Relación N-M entre aeropuertos y aerolíneas

Nota

Uso de cardinalidad ** relación muchos a uno **

Sometimes hiding the pivot table in an N-M relationship is not desirable. Mainly because there are attributes in the relationship that can only have values when a relationship is established. If your tables have a geometry field, it could be interesting to activate the On map identification option (Layer Properties ► Attributes Form ► Available widgets ► Fields) for the foreign key fields in the pivot table.

Nota

** Clave principal de la tabla dinámica **

Avoid using multiple fields in the primary key in a pivot table. QGIS assumes a single primary key so a constraint like constraint airports_airlines_pkey primary key (airport_fk, airline_fk) will not work.

16.4.2.3. Polymorphic relations

The purpose

Las relaciones polimórficas son un caso especial de las relaciones 1-N, donde una única capa de referencia (documento) contiene las características de varias capas de referencia. Esto difiere de las relaciones normales que requieren una capa de referencia diferente para cada capa referenciada. Se logra una sola capa de referencia (documento) agregando una columna layer_field adicional en la capa de referencia (documento) que almacena información para identificar la capa referenciada. En su forma más simple, la capa de referencia (documento) simplemente insertará el nombre de la capa a la que se hace referencia en este campo.

Para ser más precisos, una relación polimórfica es un conjunto de relaciones normales que tienen la misma capa de referencia pero que tienen la capa de referencia definida dinámicamente. La configuración polimórfica de la capa se resuelve mediante el uso de una expresión que debe coincidir con algunas propiedades de la capa a la que se hace referencia, como el nombre de la tabla, la identificación de la capa, el nombre de la capa.

Imagina que vamos al parque y queremos hacer fotos de diferentes especies de plantas y animales que vemos allí. Cada planta o animal tiene varias imágenes asociadas, por lo que si usamos las relaciones 1:N normales para almacenar imágenes, necesitaríamos dos tablas separadas, animal_images y plant_images. Esto podría no ser un problema para 2 mesas, pero imagina si queremos tomar fotos separadas para hongos, pájaros, etc.

Las relaciones polimórficas resuelven este problema ya que todos los objetos espaciales referenciados se almacenan en la misma tabla documentos. Para cada objeto espacia, la capa referenciada se almacena en el campo referenced_layer y el id del objeto espacial referenciado en el campo referenced_fk.

Definición de relaciones polimórficas

Primero, informe a QGIS sobre las relaciones polimórficas entre las capas. Esto se hace en Proyecto ► Propiedades…. Abra la pestaña Relaciones y haga clic en la pequeña flecha hacia abajo junto a symbologyAdd| Agregar relación, para que pueda seleccionar la opción Agregar relación polimórfica del menú desplegable recién aparecido.

../../../_images/polymorphic_relation_properties.png

Figura 16.112 Agregar una relación polimórfica usando la capa documents como referencia y animals y plantas como capas referenciadas.

  • Id se utilizará para fines internos y debe ser único. Puede que lo necesite para construir formularios personalizados. Si lo deja vacío, se generará uno para usted, pero puede asignar uno usted mismo para obtener uno que sea más fácil de manejar.

  • Capa de Referencia (Niño) también considerada como capa secundaria, es aquella que tiene el campo de clave foránea. En nuestro caso, esta es la capa documentos. Para esta capa, debe agregar un campo de referencia que apunte a la otra capa, por lo que es referenced_fk.

    Nota

    Sometimes, you need more than a single field to uniquely identify features in a layer. Creating a relation with such a layer requires a composite key, i.e. more than a single pair of matching fields. Use the symbologyAdd Add new field pair as part of a composite foreign key button to add as many pairs as necessary.

  • Campo de capa es el campo de la tabla de referencia que almacena el resultado de la expresión de capa evaluada, que es la tabla de referencia a la que pertenece esta entidad. En nuestro ejemplo, este sería el campo referenced_layer.

  • Expresión de capa se evalúa como un identificador único de la capa. Este puede ser el nombre de la capa @layer_name, la identificación de la capa @layer_id, el nombre de la tabla de la capa decode_uri(@layer, 'table') o cualquier cosa que pueda identificar de manera única una capa.

  • Intensidad de la relación establece la intensidad de las relaciones generadas entre la capa principal y la secundaria. El tipo Asociación por defecto significa que la capa principal está simplemente vinculada a la secundaria, mientras que el tipo Composición le permite duplicar también las funciones secundarias al duplicar las principales y al eliminar una función los hijos también se eliminan, lo que da como resultado una cascada en todos los niveles (significa que los hijos de los hijos de… también se eliminan).

  • Capas referenciadas también consideradas como capas padre, son aquellas que tienen la clave primaria apuntada, por lo que aquí serían capas plantas y animales. Debe definir la clave principal de las capas a las que se hace referencia desde el menú desplegable, por lo que es fid. Tenga en cuenta que la definición de una clave primaria válida requiere que todas las capas referenciadas tengan un campo con ese nombre. Si no existe tal campo, no puede guardar una relación polimórfica.

Una vez añadida, la relación polimórfica se puede editar a través de la entrada de menú Editar relación polimórfica.

../../../_images/polymorphic_relations.png

Figura 16.113 Preview of the newly created polymorphic relation and its child relations for animals and plants.

El ejemplo anterior utiliza el siguiente esquema de base de datos:

CREATE SCHEMA park;

CREATE TABLE park.animals
(
   fid serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   animal_species text NOT NULL,
   CONSTRAINT animals_pkey PRIMARY KEY (fid)
);

CREATE INDEX animals_geom_idx ON park.animals USING gist (geom);

CREATE TABLE park.plants
(
   fid serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   plant_species text NOT NULL,
   CONSTRAINT plants_pkey PRIMARY KEY (fid)
);

CREATE INDEX plants_geom_idx ON park.plants USING gist (geom);

CREATE TABLE park.documents
(
   fid serial NOT NULL,
   referenced_layer text NOT NULL,
   referenced_fk integer NOT NULL,
   image_filename text NOT NULL,
   CONSTRAINT documents_pkey PRIMARY KEY (fid)
);