如何加快Postgis中的空间划分?


9

我有一堆重叠的多边形,并且我试图对空间进行分区以避免重叠的多边形。我认为我的问题很简单。我的同事使用一些ESRI产品和http://arcscripts.esri.com/details.asp?dbid=16700进行了48秒钟的计算。

我正在尝试使用http://s3.opengeo.org/postgis-power.pdf#page=24(使用http://trac.osgeo.org/postgis/wiki/UsersWikiSimplifyPreserveTopology来猜测详细信息)作为灵感),但它是如此之慢,以至于我无法使用10个以上的多边形(我已经分解了800个)。最慢的部分是ST_Union,我尝试了各种方法,但是没有成功的地方,这是当前的状态:

select geom from
(select st_linemerge(st_union(geom)) as geom from
    (select st_exteriorring((st_dumprings((st_dump(t.geom)).geom)).geom) as geom from
        (SELECT geometry AS geom, id
               FROM tt
              WHERE campaign_id = 204
              ORDER BY id limit 200) t) t2) t3

这已经计算了26分钟(linemerge()实际上不是)。如果st_dump困扰您,则多边形是MultiPolygons。

你有小费吗?线条的st_union()是非常慢的部分。

谢谢,

尼科

PS:这是一些数字:852个多边形,导致14880个多边形,导致21467个线串,总计315513个顶点。


如果没有人回答,您可能希望尝试postGIS邮件列表。
GIS乔纳森(Jonathan)

我不是很喜欢邮件列表,而且,这可能也是GEOS问题,他们可能会抱怨JTS,好吧,我宁愿保持问题开放。
nraynaud 2012年

通过收集线条并使用空的几何体进行并集,我可以在800 s内完成:st_union(st_collect(geom),st_setsrid(geomfromtext('POINT EMPTY'),900913))几乎比ESRI东西慢20倍。
nraynaud 2012年

1
从内存中,如果有帮助,请尝试从st_linemerge(st_union ...)删除st_union
simplexio 2012年

Answers:


3

这个答案可能无法直接帮助@nraynaud,但希望可以对这个问题有所启发。

由于GEOS的问题,spatiaLite <4.0中存在类似的问题。有关问题的讨论,请参见此链接

解决方法是用ST_UnaryUnion(ST_Collect())替换ST_Union()函数。不幸的是,ST_UnaryUnion直到postGIS 2.0才可用(据我所知。)


1

您正在使用哪个版本的PostGIS?如果您使用的是PostGIS <1.4或GEOS <3.2,则合并的速度要慢得多。在1.4中引入了更快的联合,但是还需要GEOS 3.2+。因此,首先,如果您使用的版本低于1.4,我将至少升级到1.5。

SELECT postgis_full_version();

去检查。

您也打算保留多边形的原始边缘。如果您只想溶解重叠的区域,

SELECT ST_Union(geom) FROM tt WHERE campaign_id = 204;

会做到的。


您好,结果如下:“ POSTGIS =” 1.5.3“ GEOS =” 3.3.2-CAPI-1.7.2“ PROJ =” Rel。4.8.0,2012年3月6日“ LIBXML =” 2.7.3“ USE_STATS”。我最近在GEOS中找不到与工会相关的任何内容。我在多边形联合中发现了一种加速,但是我没有合并多边形,这种加速似乎是有争议的。我绝对不希望合并多边形,因为我必须为重叠的多边形添加值。
nraynaud 2012年
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.