首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ST_Union()与ST_Node(ST_Collect())在许多相交的ST_ExteriorRing(圆)上

ST_Union()与ST_Node(ST_Collect())在许多相交的ST_ExteriorRing(圆)上
EN

Stack Overflow用户
提问于 2014-08-24 13:12:21
回答 2查看 2K关注 0票数 2

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

我有两个版本的步骤2正在运行。一个比另一个更有效率吗?有什么不同的方法我应该试试吗?

以下是我如何努力做到这一点:

  1. 得到圆圈的轮廓(跑得很快) 将表circle_outlines创建为SELECT distinct ST_ExteriorRing(the_circle)从circle_list创建the_geom;使用gist (The_geom)在circle_outlines上创建索引idx_geom_circle_outlines (the_geom);从circle_outlines中选择distinct几何类型(The_geom);- LINESTRING QGIS中本表的输出: 1:38,167,029 -oi60.tinypic.com/23uwytv.jopg 1:234,378 -oi59.tinic.com/96i4xt.jpg

  1. 合并这些行(参见文章末尾的2种被认为是的方法)
  2. 如果有兴趣,请查看创建的geom类型(应该是GEOMETRYCOLLECTION) b.合并边界的多边形化(ST_Dump(ST_Polygonize(The_geom)
  3. 使用ST_PointOnSurface(polygonized_geoms)在内部添加点
  4. 计算num_overlaps

我正在尝试的两个步骤2是

代码语言:javascript
复制
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

和:

代码语言:javascript
复制
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())的性能是否存在差异?有更好的办法吗?

-更新:由于内存不足,两个查询都被终止。

EN

回答 2

Stack Overflow用户

发布于 2014-08-31 14:16:27

我用下面的方法在一个点半径为500的10,000×10,000网格上随机创建了10,000点的随机集。

代码语言:javascript
复制
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分钟。我不确定是否值得深入讨论硬件细节,因为我怀疑计算的复杂性很大程度上取决于网格的密度、圆圈的半径等等,所以设置一个与您的环境完全相同的环境是有问题的。

代码语言:javascript
复制
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的速度要快一些,但我认为有太多的自由变量使得这不是一个非常科学的发现。

票数 0
EN

Stack Overflow用户

发布于 2014-09-29 02:54:15

我最后使用的方法是QGIS中的HeatMap插件。heatmaps.html --我使用了一个统一的内核,允许我根据光栅的值对重叠的#进行分类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25472066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档