除st_union之外,PostGIS中是否还有溶解功能?


22

我正在寻找一个函数来分解表中多边形要素之间的共享边界。ST_UNION()几乎可以满足我的要求,但是它会根据图层中的所有多边形创建一个多面体,无论它们是否共享公共边界。我宁愿只溶解彼此接触的多边形之间的边界。我认为,应该有某种使用ST_TOUCHES()的方法,但是对于溶解函数的需求似乎太普遍了,如果没有内置函数可以实现这一点,我会感到惊讶。

用例如下所示:我下载了一个欧洲大国的Corine Landcover数据,我想消除不同森林类型之间的界限(一张桌子中约有75,000个多边形)。我尝试了ST_UNION,但由于出现“内存不足”错误而失败了(不过30,000个多边形确实起作用了):

create table corine00 as 
  select st_union(the_geom) as the_geom, 
         sum(area_ha) as area_ha,
         substr(code_00,1,2) as code_00
  from clc00_c31_forests
  group by substr(code_00,1,2)

注意:所有森林代码均以“ 31”开头,而我使用的是PostGIS 1.4,GEOS版本:3.2.0-CAPI-1.6.0

Answers:


21

ST_MemUnion()将运行一个幼稚且缓慢的内存友好进程。如果问题很小,您可以尝试这样做,它可能会在合理的时间内完成。您也可以将问题分解成两半,然后一起进行。由于结果的点数比输入的点数少得多,因此您可以通过这种方式将整个问题拟合到内存中。或者在两半上使用快速的内存饥饿例程,在最终合并时使用较慢的例程。


4
Paul,谢谢您带给您无与伦比的专业知识,真是太好了。
fmark

1
谢谢,看来我的问题还不够小。ST_MemUnion()现在已经运行了24小时。我将尝试解决问题。
昏暗

5

我相信ST_Dump是您想要的:

ST_Dump

返回一组geometry_dump(geom,path)行,这些​​行构成一个几何g1 ...

因此,对于您的情况:

 SELECT (ST_Dump( ST_Union( the_geom ) )).geom
 FROM clc00_c31_forests
 GROUP BY substr(code_00,1,2)

我不确定它如何与您尝试做的表创建交互,但是它应该为您提供几何形状作为单独的条目。然后,您将能够在两个表之间进行空间连接(使用&&和ST_Contains),以将数据收集到几何图形上。


2
注意:仅当您处理了ST_Union的内存问题时,这才有用!:)
yhw42

4

您的PostGIS是否针对GEOS 3.1.0+编译?对于该版本,实现了更快的级联,但如果找不到,将使用速度较慢的数量级的旧代码。

更新:看起来您的PostGIS使用的是级联联合方法,但是内存匮乏是真实的。我会尝试增加Postgres实例的可用内存,这是Paul Ramsey在2007年FOSS4G PostGIS演讲中的一些建议:

  • 磁盘访问速度很慢,因此可以通过使用更多内存来缓存数据来获得更高的性能!
    • 增加 shared_buffers
    • 物理RAM-操作系统需求* 75%
  • 排序在内存中更快
    • 增加 work_mem
  • 磁盘清理更快,内存更多
    • 增加 maintenance_work_mem
  • 按连接分配
    • 增加 wal_buffers
    • 增加 checkpoint_segments
    • 减少 random_page_cost

在您的情况下,我尝试增加shared_buffers,一般建议是数据库服务器可用内存的25%,但尝试将其增加到当前值的3-4倍,看看是否完成。


postgis_geos_version()返回:3.2.0-CAPI-1.6.0 ...我想很好。会尝试ST_Collect,谢谢。
昏暗

好吧,ST_Collect似乎并没有消除任何边界,它还创建了一个巨大的Multipolygon。
昏暗

是的,我误读了ST_Collect的页面。我已经更新了答案,为调整Postgres的内存使用情况提供了更具体的建议。
scw 2010年
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.