Importante
La traducción es un esfuerzo comunitario puede unirse. Esta página está actualmente traducida en |progreso de traducción|.
16.4. Conexión y edición de datos entre capas
Una de las funciones de los programas informáticos de SIG es conectar datos de distintas capas. Dicha conexión puede basarse en la relación espacial entre los objetos espaciales o en sus atributos compartidos. QGIS proporciona herramientas para manejar cualquiera de estas asociaciones, tales como:
Algoritmos de procesamiento que pueden crear una nueva capa como resultado de la conexión, a saber Unir atributos por localización, Unir atributos por proximidad, Unir atributos por valor de campo, …
Consultas SQL para crear una nueva capa a partir del Gestor BD o como capa virtual
Propiedades de las uniones o configuración de las relaciones que amplían temporalmente los atributos de los objetos espaciales de una capa determinada, con los de objetos espaciales de otra capa en función de algún atributo o atributos coincidentes.
Las uniones y relaciones son conceptos técnicos tomados de las bases de datos para sacar el máximo partido de los datos almacenados en tablas combinando sus contenidos. La idea es que objetos espaciales (filas) de distintas capas (tablas) puedan asociarse entre sí. El número de filas que coinciden entre sí puede ser de cualquier valor (cero, uno, muchos).
16.4.1. Unir objetos espaciales entre dos capas
La uniones en QGIS permiten asociar objetos espaciales de la capa actual a objetos espaciales de otra capa vectorial cargada. No importa si están habilitadas espacialmente ni el tipo de geometría. La unión se basa en un atributo compartido por las capas, en una relación de uno a uno.
Para crear una unión en una capa (identificada a continuación como capa destino
):
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
Especifique el campo Unir (de la
capa unir
) y el campo Destino (de lacapa destino
). Estos son los campos que se utilizan para encontrar objetos espaciales coincidentes en ambas capas, por lo que deben tener valores comunes.Presione OK y se agrega un resumen de los parámetros seleccionados al panel Join.
Los pasos anteriores crearán una unión en la que TODOS los atributos de la primer objeto espacial coincidente de la capa de unión se añadirán a la característica de la capa de destino. La siguiente lógica se utiliza para emparejar objetos espaciales durante un proceso de unión:
Se devuelven todas los objetos espaciales de la capa de destino, independientemente de que coincidan
Si el campo de destino contiene valores duplicados, a estos objetos espaciales se les asigna el mismo objeto espacial de la capa de unión.
Si el campo de unión contiene valores coincidentes duplicados, sólo se selecciona el primero objeto espacial obtenido.
Nota
Las uniones en QGIS se basan en la coincidencia de un solo campo, por lo que la mayoría de las veces, usted querrá asegurarse de que los valores en los campos coincidentes son únicos.
QGIS ofrece algunas opciones más para ajustar la unión:
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.
Crear índice de atributos en el campo join para acelerar las búsquedas
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.
: la capa de unión es editable, pero los mecanismos de sincronización no están activados. Si desea añadir automáticamente una prestación en la capa de unión cuando se cree una prestación en la capa de destino, deberá activar la opción Agregar al editar. Simétricamente, la opción Eliminar en cascada puede activarse si desea eliminar automáticamente los objetos espaciales de unión.
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. Establecer relaciones entre varias capas
A diferencia de las uniones, que definen un vínculo de uno a uno entre objetos espaciales de dos capas, las relaciones le ayudan a crear interconexiones entre múltiples prestaciones de dos o más capas. Como tales, las relaciones son ajustes a nivel de proyecto y se establecen en la pestaña |relaciones| Relaciones. Desde ahí, puede:
Añadir relación cuyo tipo puede ser:
relación polimórfica que puede añadir o editar con las herramientas específicas del menú desplegable de acciones.
Nota
Todavía no existe una forma sencilla de editar una relación no polimórfica una vez creada. Sólo se puede editar el nombre con un doble clic. Para cualquier otro parámetro de dicha relación tendrás que eliminarla y volver a crearla.
Descubrir relaciones: QGIS es capaz de descubrir relaciones existentes desde los formatos de base de datos soportados (PostgreSQL, GeoPackage, ESRI File Geodatabase, …). Esta puede ser una buena forma de facilitar la definición de relaciones.
16.4.2.1. Relaciones uno a muchos (1-N)
Por ejemplo, se tiene una capa con todas las regiones de Alaska (polígono) que proporciona algunos atributos sobre su nombre y tipo de región y un identificador único (que actúa como clave primaria).
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.
Capas y llaves
QGIS no diferencia entre una tabla y una capa vectorial. Básicamente, una capa vectorial es una tabla con una geometría. Así que puede añadir su tabla como una capa vectorial. Para demostrar la relación 1-n, puede cargar las capas regions
y airports
en el conjunto de datos de ejemplo. En la práctica, cada aeropuerto pertenece exactamente a una región, mientras que cada región puede tener cualquier número de aeropuertos (una relación típica de uno a muchos).
que tiene un campo de llave foránea (fk_region
) para las regiones de capa.
Además de los atributos que describen los aeropuertos, la capa airports tiene otro campo fk_region
que actúa como clave externa (si tienes una base de datos, probablemente querrás definir una restricción sobre él). Este campo fk_region
siempre contendrá el id de una región. Puede verse como un puntero a la región a la que pertenece.
Todo lo que tienes que hacer es decirle a QGIS la relación entre las capas para que puedas diseñar un formulario de edición personalizado para la edición y QGIS se encarga de la configuración. Funciona con diferentes proveedores (por lo que también puedes usarlo con archivos shape y csv).
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 se utilizará como título. Debe ser una cadena legible que describa para qué se utiliza la relación. En este caso, diremos airport_relation.
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
A veces se necesita más de un campo para identificar de forma exclusiva los objetos espaciales de una capa. La creación de una relación con una capa de este tipo requiere una clave compuesta, es decir, más de un único par de campos coincidentes. Utilice el botón Añadir un nuevo par de campos como parte de una clave externa compuesta para añadir tantos pares como sean necesarios.
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
Ahora que QGIS conoce la relación, la utilizará para mejorar los formularios que genera. Como no hemos cambiado el método de formulario predeterminado (autogenerado), simplemente añadirá un nuevo widget en nuestro formulario. Así que seleccionemos la región de la capa en la leyenda y utilicemos la herramienta identificar. Dependiendo de su configuración, el formulario podría abrirse directamente o tendrá que elegir abrirlo en el diálogo de identificación bajo acciones.
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
.
Si mira ahora el cuadro de diálogo del objeto espacial, verá que el formulario de la región está incrustado dentro del formulario de los aeropuertos e incluso tendrá un combobox, que le permitirá asignar el aeropuerto actual a otra región.
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. Relaciones de muchos a muchos (N-M)
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.
Este código SQL crea las tres tablas que necesitamos para una relación N-M en un esquema PostgreSQL/PostGIS llamado locations. Puedes ejecutar el código usando la pgAdmin. La tabla airports almacena la capa airports
y la tabla airline almacena la capa airlines
. En ambas tablas se utilizan pocos campos para mayor claridad. La parte tricky es la tabla airports_airlines
. La necesitamos para listar todas las aerolíneas para todos los aeropuertos (o viceversa). Este tipo de tabla se conoce como tabla dinámica. Las restricciones de esta tabla obligan a asociar un aeropuerto con una línea aérea sólo si ambos existen ya en sus capas.
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 **
A veces, ocultar la tabla dinámica en una relación N-M no es deseable. Principalmente porque hay atributos en la relación que sólo pueden tener valores cuando se establece una relación. Si sus tablas tienen un campo de geometría, podría ser interesante activar la opción Identificación en mapa ( ) para los campos de clave externa en la tabla pivote.
Nota
** Clave principal de la tabla dinámica **
Evite utilizar múltiples campos en la clave primaria de una tabla pivotante. QGIS asume una única clave primaria por lo que una restricción como constraint airports_airlines_pkey primary key (airport_fk, airline_fk)
no funcionará.
16.4.2.3. Relaciones polimórficas
El propósito
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
A veces se necesita más de un campo para identificar de forma exclusiva los objetos espaciales de una capa. La creación de una relación con una capa de este tipo requiere una clave compuesta, es decir, más de un único par de campos coincidentes. Utilice el botón Añadir un nuevo par de campos como parte de una clave externa compuesta para añadir tantos pares como sean necesarios.
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)
);