Перенос потоков (связей + значений) между полигонами

14

В QGIS есть два шейп-файла, представляющих движущиеся данные между ячейками и один дополнительный слой, см. Изображение ниже

Example_of_shapefiles


Перемещение данных определяется:

  • Многоугольник "LayerA"(прозрачные квадраты с красным контуром). Кроме того, оно также относится к кругам, представляющим движения внутри клеток, визуализируемые на позиции "LayerA"геоцентроидов.

    LayerA_AT

  • Слой полилинии "Flows"(желтые / серые стрелки), передает значения через связи между геоцентроидами "LayerA"объектов

    Flows_AT


Целевой слой:

  • Полигон "LayerB"(светло-сиреневый с темно-серым контуром).

    LayerB_AT

Кроме того, я уже передал "FLUX"и значение движения в клетках из "LayerA"в "LayerB"многоугольники, см моих предыдущих вопроса: унаследованные значений между полигонами в QGIS? , Это было сделано с помощью %из $areaрасчета.


Может существовать реальное решение / подход передачи / передачи / преобразования потоковых соединений, представленных как, "Flows"и его значений из отношений "LayerA"в отношения "LayerB".

Как я могу добиться этих связей в виде полилиний?

Кроме того, новые потоки будут наследовать аналогичный стиль "Flows".

По запросу могу предоставить образец данных.

Потоки будут существовать не между особенностями "LayerA", а между особенностями "LayerB" . Основная цель заключается в достижении атрибута "FLUX"(то есть от / до) для соединений между "LayerB"возможными в виде таблицы / Матрицы происхождения-назначения.


Есть некоторые требования / критерии, которые следует соблюдать:

1. Нет потоковых соединений между частями объектов (выделены желтым цветом) в одной ячейке

Condition_1

2. Нет связи между одной и той же функцией, даже если ее части находятся в разных ячейках

condition_2

3. Существуют связи между частями объектов "LayerB"(на основе "Union"выходных данных), если они полностью находятся в двух разных "LayerA"элементах ячейки.

condition_3

4. Новое "FLUX"значение, которое передается, будет рассчитано, как показано на рисунке ниже.

Например, существует связь между двумя ячейками Iи II, где "FLUX"есть 100. Предполагая другие значения, "NEW_FLUX"между A'и B''будет вокруг 1.5625. 100это только один пример.

condition_4


Ссылки:

Тарас
источник
1
Спасибо за редактирование, я начинаю понимать, но не очень уверен. Можете ли вы отредактировать исходное сообщение еще раз, чтобы добавить ожидаемый результат? (например: Линейный слой между центроидами polygon_b с полями ниже: - «field1»: объяснение, попытка данных и т. д.)
J. Monticolo
1
Для пояснения, можем ли мы более свободно обсуждать в этом чате GSE: chat.stackexchange.com/rooms/92038/… ?
J. Monticolo
1
С технической точки зрения все выполнимо, но чего вы на самом деле пытаетесь достичь? Мне кажется, что вы пытаетесь интерполировать данные из обобщенной сетки в более мелкозернистую географию. Если я не ошибаюсь, это может привести к очень обманчивым результатам. Если у вас нет данных о потоках на уровне «уровня B», никакой математический трюк не сможет их воссоздать. Это эквивалент масштабирования ниже уровня пикселей и выполнения трехмерного вращения с использованием изображения с низким разрешением в неточном фильме полицейских.
MarHoff

Ответы:

4

С виртуальными слоями, теоретически, это возможно (с шейп-файлами процесс будет очень длинным, но если слои находятся в пространственной базе данных, я думаю, что это намного быстрее).

Вот код:

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

Графический вывод будет выглядеть

Выход

Результат был проверен вручную. Разница в "FLUX"значениях пренебрежимо мала.

Окончательный результат будет наследовать стили от "Flow"и выглядеть как

Output_Final

Я рекомендую протестировать его с несколькими данными, и, если для больших наборов данных это займет слишком много времени, выполните пошаговые запросы ("inter_ab" , "new_flux"), сохраните результат и выполните следующий запрос.

Дж. Монтиколо
источник
1
Извините, я француз, и я использую открытую базу данных французского городка в качестве Polygon_bслоя, и это ключевое поле id_geofla. Я сделал исправление.
J. Monticolo
1
Я добавил объяснения, надеюсь, это поможет.
J. Monticolo
1
Да, правильно иметь полигоны. Я внес исправления для всех слоев polygon_b и значения polygon_a . ** **, если поток устанавливает соединение. Для меня результат - не линейный слой, а непосредственно слой polygon_b со значением polygon_a, импортированным слоем потока .
J. Monticolo
4

Вы можете сделать соединение между тремя слоями, а затем агрегировать по layerB. Виртуальные слои могут быть использованы. Я не уверен, что важные данные находятся в layerAили в flowслое. Вот (непроверенная) возможность:

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
источник
Я пробовал это решение, оно работает. Важные данные в "Flows".
Тарас
@ Тарас Отлично! Вы также можете использовать агрегаты, такие как sum(f.flow_var)или дажеsum(fl.flow_var * a.poly_var)
JGH