Transferencia de flujos (conexiones + valores) entre polígonos

14

En QGIS hay dos archivos de forma que representan los datos en movimiento entre las celdas y una capa adicional, vea la imagen a continuación

Example_of_shapefiles


Datos móviles definidos por:

  • Polígono "LayerA"(cuadrados transparentes con contorno rojo). Además, también se relaciona con círculos que representan los movimientos dentro de las células, visualizados en la posición de los "LayerA"geocentroides.

    LayerA_AT

  • Capa de polilínea "Flows"(flechas amarillas / grises), transmite valores a través de conexiones entre geocentroides de "LayerA"entidades

    Flows_AT


Capa de destino:

  • Polígono "LayerB"(características de color lila claro con contorno gris oscuro).

    LayerB_AT

Además, ya he transferido "FLUX"y valores de movimiento dentro de las células de "LayerA"en "LayerB"polígonos, véase mi anterior pregunta: heredada valores entre polígonos en QGIS? . Se realiza mediante el %de $areacálculo.


Puede haber una solución / enfoque significativo para transferir / transmitir / transformar conexiones de flujo representadas por "Flows"y sus valores de relaciones de "LayerA"a relaciones de "LayerB".

¿Cómo puedo lograr esas conexiones como polilíneas?

Además, los nuevos flujos heredarán un estilo similar a "Flows".

Por solicitud, puedo proporcionar una muestra de los datos.

Los flujos no existirán entre las características de "LayerA", sino entre las características de "LayerB" . El objetivo principal es lograr el atributo "FLUX"(es decir, de / a) para conexiones entre "LayerB"posibles como tabla / matriz de origen-destino.


Hay algunos requisitos / criterios que deben cumplirse:

1. No hay conexiones de flujo entre las partes de las características (seleccionadas en amarillo) en la misma celda

condición_1

2. No hay conexiones entre la misma característica, incluso sus partes están en celdas diferentes

condición_2

3. Existen conexiones entre partes de características "LayerB"(basadas en la "Union"salida) si están completamente dentro de dos características de "LayerA"celda distintas

condición_3

4. El nuevo "FLUX"valor que se transmite se calculará como se muestra en la imagen a continuación.

Por ejemplo, hay una conexión entre dos celdas Iy II, donde "FLUX"está 100. Asumiendo otros valores, el "NEW_FLUX"intermedio A'y B''estará alrededor 1.5625. 100Es solo un ejemplo.

condición_4


Referencias

Taras
fuente
1
Gracias por la edición, empiezo a entender pero no estoy muy seguro. ¿Puedes editar tu publicación original una vez más para agregar el resultado esperado? (por ejemplo: capa de línea entre los centroides polygon_b con estos campos a continuación: - "campo1": explicación, intento de datos, etc.)
J. Monticolo
1
Para aclarar, ¿podemos discutir más libremente en esta sala de chat de GSE: chat.stackexchange.com/rooms/92038/… ?
J. Monticolo
1
Desde un punto de vista técnico, todo es factible, pero ¿qué estás tratando de lograr realmente? Me parece que está intentando interpolar datos de una cuadrícula generalizada a una geografía más fina. A menos que te haya entendido mal, esto puede conducir a resultados muy engañosos. Si no tiene datos sobre flujos en el nivel de "capa B", ningún truco matemático puede recrearlos. Es el equivalente a hacer zoom bajo el nivel de píxel y hacer una rotación 3D usando una imagen de baja resolución en una película de policías inexacta.
MarHoff

Respuestas:

4

Con las capas virtuales, en teoría, es posible (con archivos de forma, el proceso será más largo, pero si las capas están en una base de datos espacial, creo que es mucho más rápido).

Aquí el código:

WITH inter_ab AS ( 
--create intersection between LayerA and LayerB 
SELECT LayerA.id || '_' || LayerB.FLAECHEID AS id, 
LayerA.id AS id_a, 
ST_AREA(LayerA.geometry) AS area_a, 
LayerB.FLAECHEID AS id_b, 
ST_INTERSECTION(LayerB.geometry, LayerA.geometry) AS geom 
FROM LayerA, LayerB 
WHERE ST_INTERSECTION(layerB.geometry, layerA.geometry) IS NOT NULL 
),

--calculation of the new flux value 
new_flux AS (SELECT t1.id_b AS origine, 
t2.id_b AS dest, 
SUM(Flows.flux * ST_AREA(t1.geom) / t1.area_a * ST_AREA(t2.geom) / t2.area_a) AS value  
FROM inter_ab t1, inter_ab t2, flows 
-- no connection between the same feature 
WHERE t1.id <> t2.id 
-- rule 1 
AND t1.id_a <> t2.id_a 
-- rule 2 
AND t1.id_b <> t2.id_b 
-- get flow data 
AND flows.origine = t1.id_a 
AND flows.dest = t2.id_a 
GROUP BY t1.id_b, t2.id_b
)

--create flows between original layerB features
SELECT new_flux.origine,
new_flux.dest,
new_flux.value AS flux,
make_line(ST_CENTROID(t3.geometry), ST_CENTROID(t4.geometry)) AS geom --ST_MakeLine under postGIS
FROM LayerB t3,
LayerB t4,
new_flux
WHERE t3.FLAECHEID = new_flux.origine
AND t4.FLAECHEID = new_flux.dest

La salida gráfica se verá así

Salida

El resultado fue probado manualmente. La diferencia de "FLUX"valores es despreciable.

El resultado final heredará estilos de "Flow"y se verá como

Salida_Final

Recomiendo probarlo con unos pocos datos, y si toma demasiado tiempo para grandes conjuntos de datos, ejecute las consultas paso a paso ( "inter_ab", "new_flux") y guarde el resultado y ejecute la siguiente consulta.

J. Monticolo
fuente
1
Lo siento, soy francés y utilizo una base de datos abierta del municipio francés como Polygon_bcapa, y su campo clave es id_geofla. Hice la corrección.
J. Monticolo
1
He agregado explicaciones, espero que ayude.
J. Monticolo
1
Sí, es correcto tener polígonos. He realizado correcciones para tener todas las capas polygon_b y polygon_a . ** valor ** si un flujo realiza una conexión. Para mí, el resultado no es una capa de línea, sino directamente una capa polygon_b con el valor polygon_a importado por la capa de flujo .
J. Monticolo
4

Puede hacer una unión entre las tres capas, luego agregar por layerB. Es probable que se puedan usar capas virtuales. No estoy seguro de si los datos importantes están en layerAo en la flowcapa. Aquí hay una posibilidad (no probada):

SELECT b.id, b.geometry, sum(a.myVar)
FROM layerB b
LEFT JOIN flow f
   ON ST_Intersects(ST_EndPoint(f.geometry),b.geometry)
 JOIN layerA a
   ON ST_Intersects(ST_StartPoint(f.geometry),a.geometry)
GROUP BY b.id
JGH
fuente
He probado esta solución, funciona. Los datos importantes están en "Flows".
Taras
@Taras ¡Genial! También puede usar agregados como sum(f.flow_var)o inclusosum(fl.flow_var * a.poly_var)
JGH