在多边形之间传输流(连接+值)


14

在QGIS中,有两个shapefile表示单元之间和另一层之间的移动数据,请参见下图。

Example_of_shapefiles


移动数据的定义:

  • 多边形"LayerA"(带有红色轮廓的透明正方形)。此外,它还涉及代表细胞内部运动的圆圈,这些圆圈在质心的位置上可视化"LayerA"

    LayerA_AT

  • 折线层"Flows"(黄色/灰色箭头),经由连接传达的geocentroids之间的值"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"如下图所示,将计算正在传送的新值。

举例来说,有两个单元之间的连接III,其中"FLUX"100。假设其他值,"NEW_FLUX"介于A'和之间B''将是1.5625100仅是一个例子。

condition_4


参考文献:


1
感谢您的修改,我开始理解但不太确定。您可以再编辑一次原始帖子以添加预期结果吗?(例如:polygon_b重心之间的线层,其中以下字段如下:-“ field1”:说明,尝试的数据等)
J. Monticolo

1
为了澄清起见,我们是否可以在此GSE聊天室中进行更多自由讨论:chat.stackexchange.com/rooms/92038/…
J. Monticolo,

1
从技术角度来看,一切都是可行的,但是您实际上想实现什么?在我看来,您正在尝试将数据从广义网格插值到更细粒度的地理区域。除非我弄错了,否则可能导致非常误导的结果。如果您没有“ B层”级别上有关流的数据,则没有任何数学技巧可以重新创建它们。这等效于在不精确的警察电影中使用低分辨率图片在像素级别下缩放并进行3D旋转。
MarHoff

Answers:


4

从理论上讲,使用虚拟层是可行的(使用shapefile,过程会很长,但是如果这些层位于空间数据库中,我认为它会快得多)。

这里的代码:

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",看起来像

输出_最终

我建议用几个数据来测试它,如果它的时间太长,对于大数据集,执行一步一步的查询("inter_ab""new_flux"),并保存结果并执行一个查询。


1
抱歉,我是法国人,我使用开放式法国乡镇数据库作为Polygon_b图层,其关键字段是id_geofla。我做了更正。
J. Monticolo

1
我添加了解释,希望能对您有所帮助。
J. Monticolo

1
是的,拥有多边形是正确的。如果流建立了连接,我已经对整个polygon_b图层和polygon_a。** value ** 进行了更正。对我来说,结果不是线层,而是直接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

我已经尝试过这种解决方案。重要数据在中"Flows"
Taras

@Taras太好了!你也可以用骨料,比如sum(f.flow_var)甚至sum(fl.flow_var * a.poly_var)
JGH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.