2 votos

¿Cómo se seleccionan los objetos mediante la unión N:M?

Tengo una capa con algunas geometrías y una capa de datos que define una relación M:N. ¿Existe alguna forma de seleccionar (en el mapa) los objetos que están en relación con un id específico? Básicamente me gustaría seleccionar por expresión como

object_id in (select object_id from relations where relative_id = 12345)

Puedo hacerlo desde el gestor de la base de datos select * from objects where object_id in ..., pero eso significa crear una nueva capa cada vez, lo cual es un trabajo extra y necesita ser eliminado o pronto habría cientos de ellas. Y las uniones de qgis no parecen soportar relaciones M:N. ¿Hay alguna forma de seleccionar (en el sentido de qgis, no de sql) mediante dicha consulta?

Las capas resultan estar en la base de datos spatialite. Son algo así como

create table objects (object_id integer primary key, geometry, attributes...);
create table relations (object_id integer references objects (object_id),
                        relative_id integer references something);

3voto

brad Puntos 812

¿Por qué no poner su consulta compleja en la base de datos como una vista?

Técnicamente tu pregunta es sobre las relaciones M:N en QGIS, y parece que entre tus comentarios y los de GrantD71 habéis llegado a la conclusión de que no es posible.

Así que para tu caso, y como respuesta a tu pregunta real, no estoy seguro de que esta sea una solución mejor, es sólo lo que yo haría.

Yo crearía una vista, o cargaría la siguiente consulta como una capa. Personalmente, me gustan más las vistas porque suelo estar en PostGIS y puedo reutilizar la misma vista que utilizo en QGIS en otros sistemas (como mapas web y GeoServer).

Suponiendo mesas:

objects
--------
object_id, geometry, attribute1, attribute2,...

relations
--------
object_from_id,object_to_id

Cree una vista que incluya TODAS las referencias (o utilice esta consulta para definir la capa en QGIS).

view
----
SELECT 
    from.*,
    to.object_id AS relative_id
FROM 
    relations,
    object from,
    object to
WHERE
    relations.object_from_id = from.object_id AND
    relations.object_to_id = to.object_id

Crear una capa a partir de la vista en QGIS (si está utilizando una vista)

Filtro basado en el campo relative_id en QGIS

Filtrar la consulta: relative_id = 12345

1voto

Es posible hacer un join y luego seleccionar por atributo puramente en QGIS (sin acceder al DB Manager).

Añade a QGIS las dos tablas que quieres unir. Haz clic con el botón derecho del ratón en la capa con geometría y luego ve a Propiedades -> Uniones -> haz clic en el signo más para que aparezca el diálogo "Añadir unión vectorial" -> selecciona la capa y el campo al que quieres unirte.

Add vector join dialog

Debería tener una opción para mantener la unión en caché en la memoria, para evitar el desorden.

Con la unión creada deberías poder abrir la capa con la tabla de atributos de la geometría y hacer selecciones basadas en la expresión.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X