Saltar al contenido

Consiga todo relacionado attribute valores de las características en la lista (QGIS)

Hola usuario de nuestro sitio web, hallamos la solución a tu interrogante, continúa leyendo y la obtendrás más abajo.

Solución:

Vamos a crear una nueva tabla que represente la relación de muchos a muchos, entre las señales de paso y los destinos, en la que el usuario puede crear las combinaciones entre ambos.

Luego, en una capa virtual, reproduciremos dinámicamente todas las señales con un campo adicional que contiene una concatenación de cada destino elegido y el costo total.

Las restricciones que definen la nueva relación y la capa virtual se guardarán dentro del proyecto y serán administradas por QGIS.

Tanto el etiquetado normal como el elemento de diseño se realizarán desde esta capa virtual.


Cree una nueva capa temporal y guárdela. Lo nombraré wayigns_destinations.

En la nueva capa, cree dos columnas de tipo entero para el exterior keys. Los nombraré: wayigns_fk y destinos_fk.

Luego, cree dos relaciones en el Propiedades del proyecto ventana, Relaciones pestaña.
Para cada relación: la capa principal es Señales de camino o Destino; el campo padre es defensor; la capa secundaria es wayigns_destinations; y el campo hijo es wayigns_fk o destinos_fk.

1


Ahora, defina la relación en el widget de capa del padre. La cardinalidad no es Muchos a uno. Para el widget Way Signs, es Destinos (fid).

2

Haga lo mismo con la capa Destinos.

En el wayigns_destinations widgets de capa Solo voy a pedir que se respete una restricción NOT NULL.

3

Tenga en cuenta que la expresión que se mostrará en el widget será la nombre, no la defensor. Sin embargo, recuerde que el campo está vinculado al defensor, de modo que ese es el valor real guardado en el attribute.


Ahora, podemos empezar a crear algunas funciones.

4

Guarda los cambios y prepárate para que llegue la magia.


Las relaciones son solo un conjunto de restricciones y desencadenantes que se aplican a los campos de las tablas, de modo que conservan la integridad referencial. Es decir, no se puede almacenar un valor que no cumpla con la referencia indicada.

Esta integridad referencial es necesaria para que las consultas que combinen varias tablas tengan el resultado deseado.

Crearemos, a través de una capa virtual, una consulta que involucre a las cuatro tablas y, con suerte, todo funcionará bien.

WITH magic AS (
  SELECT
    a.waysigns_fk,
    group_concat(d.destination_id || ': ' || round(d.total_cost,1) || ' Km', '  ') label
  FROM waysigns_destinations a
  INNER JOIN "Way Signs" b
    ON a.waysigns_fk = b.fid
  INNER JOIN Destinations c
    ON a.destinations_fk = c.fid
  INNER JOIN "OD-Matrix" d
    ON (b.name = d.origin_id AND c.Name = d.destination_id)
  GROUP BY a.waysigns_fk
)
SELECT
  a.fid,
  a.name,
  b.label,
  a.geometry geom
FROM "Way Signs" a
LEFT JOIN magic b
ON a.fid = b.waysigns_fk;

Primero, tomamos todos los wayigns_destinations filas y uniéndolas con las Señales de camino, Destinos y Matriz OD filas coincidentes.
Para esa tabla, estamos agregando una concatenación del nombre del destino y el costo total, con algunos caracteres, agrupados por signways_fk. Entonces nos llevan todos los Señales de camino filas y combinándolas con estas magia filas.
Para esa tabla, tomamos el signo de camino fid, el nombre del signo de camino, la concatenación y la geometría del signo de camino.

5


Creo que no tendrá problemas para etiquetar o crear el elemento de mapa que desea de esta nueva tabla.

6


Notas:

La relación no es lo más importante: la tabla que relaciona la forma de señalización con los destinos se podría completar a mano, simplemente tomando la precaución de colocar valores válidos (las listas desplegables o expresiones en el widget podrían ayudar).
GeoPackage tiene algunas limitaciones en la implementación de keys. QGIS parece obstinado en traer el PRAGMA Foreign_keys valor para Falso para la base de datos contenida en el archivo GeoPackage.
Así que no incluí el establecimiento de extranjeros keys. La implementación de disparadores en su reemplazo excede mi conocimiento, aun así no me parece necesario en este momento (dejo pendiente esa investigación).
Si la relación proporcionada en esta respuesta le trae problemas, puede deshacerse de ella.


Una lectura descubierta:

  • https://sqlite.org/foreignkeys.html

El camino de la expresión

No veo forma de consultar las características del Matriz OD capa haciendo coincidir dos attributes al mismo tiempo. Por eso propongo la creación de una nueva combinación key campo con los orígenes y destinos en esa tabla.

Tener cada característica del Matriz OD capa inequívocamente identificada, podemos acceder a esas filas con la combinación de Señales de camino y Destinos buscados, desde el Señales de camino capa.

No sé si es más sencillo hacerlo mediante una expresión que creando una capa virtual basada en una consulta SQL, pero es otra opción.

Tan pronto como quise agregar un campo virtual en el Matriz OD capa, una sucesión de “Relación no válida” los mensajes se emitieron desde el panel, así que me atreví a exportar todas las capas a un nuevo GeoPackage y crear un nuevo proyecto QGIS sin la adición de relaciones.
En este proceso cambié el nombre de las capas, considere ese cambio al importar la expresión a su proyecto.


Cree un nuevo campo en el od_matrix capa, con la siguiente expresión:

"origin_id" || '-' || "destination_id"

Lo nombré sobredosis. La expresión concatena el contenido de esos campos con un guión en el medio. Este nuevo campo se utilizará como un key para buscar características.

1


Ahora, cree un nuevo campo en el way_signs capa, con la siguiente expresión:

array_to_string(
  array_foreach(
    array_foreach(
      array_filter(
        string_to_array(
          replace(
            "wanted_dest",
            array( '', '"', ', ', ''),
            array( '', '' , ',' ,''))),
        @element <> ''),
      "name" || '-' || @element),
    concat(
      attribute(
        get_feature(
          'od_matrix',
          'od',
          @element),
        'destination_id'),
      ': ',
      round(
        attribute(
          get_feature(
            'od_matrix',
            'od',
            @element),
          'total_cost')/1000,
        1),
      ' km')),
  'n')

No es fácil de explicar, pero sabrás qué estamos haciendo allí:

Estamos tomando el valor de la querido_destino campo y reemplazando algunos caracteres restantes, de modo que queden de una manera que pueda traducirse en un array. Seguido inmediatamente lo convertimos en un array.

Filtramos eso array para que no tenganull pero elementos vacíos.

Creamos un nuevo array con un elemento para cada concatenación de la nombre attribute de la misma fila, un guión y cada uno de los querido_destino elementos.

Usamos eso array para buscar funciones en el od_matrix.

Para cada elemento devolvemos el destination_id valor y el coste total valor.

Transformamos costos de metros a kilómetros, y concatenamos con más personajes para crear una multilínea string.


Llamé a ese campo: etiqueta

2

Finalizando este artículo puedes encontrar los comentarios de otros administradores, tú además tienes el poder mostrar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *