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
):
Click en el botón Add new join. El diálogo Add vector join aparece.
Seleccione la Join layer que quiera conectar con la capa vectorial de destino
Specify the Join field (from the
join layer
) and the Target field (from thetarget layer
). These are the fields that are used to find matching feature in both layers hence they should have values in common.Presione OK y se agrega un resumen de los parámetros seleccionados al panel Join.
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:
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.
Create attribute index on the join field to speed up lookups
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:
: 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 Editable join layer.
: la capa de unión está bien configurada para ser editable, pero su estado actual es de solo lectura.
: 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 Upsert on edit. Symmetrically, the option Delete cascade may be activated if you want to automatically delete join features.
Joined fields: en lugar de agregar todos los campos de la capa unida, puede especificar un subconjunto.
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 Relations tab. From there, you can:
Add relation whose type can be:
polymorphic relation that you can add or edit with the dedicated tools in the action drop-down menu.
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.
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.
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.
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 Relaciones y haz click en Agregar Relación.
. Abre la pestañaName 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 esID
.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 esfk_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 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).
En la pestaña Relaciones, puede también presionar el botón 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.
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 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 es para guardar todas las ediciones en la capa secundaria (aeropuerto).
El botón 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 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 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 elimina los aeropuerto(s) seleccionados de forma permanente
El símbolo 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 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 puede acercar el mapa a las entidades secundarias seleccionadas.
Los dos botones y 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.
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:
Selecciona el registro que se ha agregado previamente dentro de la forma de entidad de la capa referenciada.
Usa la herramienta de digitalización 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 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.
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ú 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.
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 si elegiste la opción Permitir agregar nuevas entidades
en la 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.
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 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
. 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 airports_airlines
debe crearse en dos pasos:
Configura la tabla solo con el campo
id
usandoUsando
, 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 . 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.
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
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 airports
y airlines
. Para el primero debemos elegir la opción aerolíneas (id) y para el segundo la opción aeropuertos (id).
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
.
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 ( ) 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 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.
. Abra la pestañaId 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 esreferenced_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 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 capadecode_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
yanimales
. Debe definir la clave principal de las capas a las que se hace referencia desde el menú desplegable, por lo que esfid
. 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.
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)
);