我有一个地址点的国家数据集(3700万个)和一个洪水泛滥的多边形数据集(200万个),类型为MultiPolygonZ,某些多边形非常复杂,最大ST_NPoints约为200,000。我正在尝试使用PostGIS(2.18)识别洪泛多边形中的地址点,并将其写入具有地址ID和洪灾风险详细信息的新表中。我从地址角度(ST_Within)进行了尝试,但是从洪水区域角度(ST_Contains)开始进行了交换,其理由是存在大面积区域而根本没有洪水风险。两个数据集都已重新投影到4326,并且两个表都具有空间索引。我下面的查询已经运行了3天,并且没有任何迹象表明很快会完成!
select a.id, f.risk_factor_1, f.risk_factor_2, f.risk_factor_3
into gb.addresses_with_flood_risk
from gb.flood_risk_areas f, gb.addresses a
where ST_Contains(f.the_geom, a.the_geom);
有没有更好的方法来运行此?另外,对于这种类型的长时间运行的查询,除了查看资源利用率和pg_stat_activity之外,监视进度的最佳方法是什么?
我的原始查询完成了3天,虽然还可以,但是我在其他工作上步履蹒跚,所以我从来没有花时间尝试解决方案。但是,到目前为止,我刚刚重新访问了该文档并完成了建议。我使用了以下内容:
- 使用此处建议的ST_FishNet解决方案在英国建立了50公里的网格
- 将生成的网格的SRID设置为British National Grid并在其上建立空间索引
- 使用ST_Intersection和ST_Intersects裁剪了我的洪水数据(MultiPolygon)(这里唯一需要注意的是,我必须在geom上使用ST_Force_2D,因为shape2pgsql添加了Z索引
- 使用相同的网格裁剪我的点数据
- 在行上创建索引,在每个表上创建col和空间索引
我现在准备运行我的脚本,将遍历行和列的结果填充到一个新表中,直到覆盖全国为止。但是只是检查了我的洪水数据,一些最大的多边形似乎在翻译中丢失了!这是我的查询:
SELECT g.row, g.col, f.gid, f.objectid, f.prob_4band, ST_Intersection(ST_Force_2D(f.geom), g.geom) AS geom
INTO rofrse.tmp_flood_risk_grid
FROM rofrse.raw_flood_risk f, rofrse.gb_grid g
WHERE (ST_Intersects(ST_Force_2D(f.geom), g.geom));
我的原始数据如下所示:
但是剪辑后看起来像这样:
这是一个“缺失”多边形的示例: