我有将近10,000个相同大小的圆圈,我用它来创建一个基于重叠圆圈数量的热图。

我有两个版本的步骤2正在运行。一个比另一个更有效率吗?有什么不同的方法我应该试试吗?
以下是我如何努力做到这一点:
我正在尝试的两个步骤2是
create table noded_circles as
SELECT ST_Node(ST_Collect(the_geom)) AS the_geom FROM circle_outlines;
-- been running 7 hours - 100% cpu - 2199 MB (24%) memory和:
create table noded_circles as
SELECT ST_Union(the_geom) AS the_geom FROM circle_outlines;
-- been running 43 hours - 100% cpu - 4086 MB (48%) memory因此,对于相同大小的相交圆的“扁平”行字符串,st_union()和st_node(st_collect())的性能是否存在差异?有更好的办法吗?
-更新:由于内存不足,两个查询都被终止。
发布于 2014-08-31 14:16:27
我用下面的方法在一个点半径为500的10,000×10,000网格上随机创建了10,000点的随机集。
drop table circles;
create table circles as select g as id,
st_buffer(st_makepoint(random()*10000, random()*10000), 500) as geom
from generate_series(1, 10000) g;
create index ix_spatial_circles on circles using gist(geom);使用它,我得到了下面的查询,它生成一个原始多边形I的列表,与此相交的其他多边形的数量,交集和区域。对于在10,000个网格上具有500半径的10,000个圆圈的网格,这个查询在我们的一台服务器上运行大约20分钟。我不确定是否值得深入讨论硬件细节,因为我怀疑计算的复杂性很大程度上取决于网格的密度、圆圈的半径等等,所以设置一个与您的环境完全相同的环境是有问题的。
select id, max(total_intersected) as "total intersected", st_area(st_union(geom)) as area
from
(select a.id as id, array_agg(b.id) as b_int,
sum(case when st_intersects(a.geom, b.geom)='t' then 1 else 0 end) as total_intersected,
array_agg(b.geom) as geom
from
circles a, circles b
where st_intersects(a.geom, b.geom) group by a.id) agg
where id=any(b_int) group by id, geom order by max(total_intersected) desc;子查询的主要思想是查找所有与每个其他多边形(使用空间自连接)相交的多边形(通过ID),并构建这些ID的数组(array_agg(b.id),用于查找两个多边形是否相交,比找到它们的实际相交更快;然后,在外部查询中,查找实际的交叉点,但只考虑已知每个输入多边形(即where id=any(b_int)部分)相交的多边形。我怀疑这可能比使用ST_Collect或ST_Union一次将所有圆(多边形)合并起来要快,因为您操作的是已知的相交多边形,而不是一个巨大的交叉口中的所有多边形。
就其价值而言,我对比较ST_Union(geom)和ST_Node(ST_Collect(geom))的随机点集做了一些测试,总的来说ST_Union的速度要快一些,但我认为有太多的自由变量使得这不是一个非常科学的发现。
发布于 2014-09-29 02:54:15
我最后使用的方法是QGIS中的HeatMap插件。heatmaps.html --我使用了一个统一的内核,允许我根据光栅的值对重叠的#进行分类。
https://stackoverflow.com/questions/25472066
复制相似问题