使用PostGIS将许多小多边形连接起来以形成更大的多边形?


47

我在postgis中使用SRID 27700的以下层:

在此处输入图片说明

它是英国的每个行政区域,而且(从颜色分组中可以看到)每个区域都有一个文本字段,用于指定其所在的县。

我想做的是从给定县中的较小县制造较大的县多边形,因此图片中所有青绿色彩色多边形上方的EG将由包含所有多边形的单个外圈形成一个大多边形颜色,例如所有紫色,棕色,粉红色,灰色等,都应形成一个多边形。

我已经尝试了以下方法:

insert into parishesmerged (geometry)
select astext(multi(ST_Union(the_geom))) as the_geom from parishes
group by county_name

但是它会不断产生破碎的几何形状,因此我在进一步处理时遇到了很大的问题。

我正在尝试使用主要输出区域制作一个更简单的县级地图。

Postgis也不需要任何解决方案,我已经安装了完整的OS4Geo堆栈,最新版本的QGis和更多实用程序,而我对此一无所知。

我唯一没有的就是像ArcGis这样的大男孩(尽管我可能在某处有一个旧的Mapinfo)


作为记录,我要创建的数据集是与我正在写的一本针对希望使用.NET编写GIS应用程序的.NET程序员的GIS书一起提供的


在尝试了以下建议之后,效果最好的是“ Paul Ramseys”解决方案。

现在,我有一个很好的简化的县(市)档案,对于我的书来说足够简单,但又足够复杂,足以让我展示一些有趣的地理空间SQL。

尽管Paul的解决方案最终是对我有用的解决方案,但我还借鉴了其他答案,例如简化了多边形图并进一步降低了复杂性。

在执行此操作时,我确实观察到了一点,尽管ST_Collect确实比ST_Union快,但运行还是它是造成几何形状损坏的主要原因。我的猜测是,速度的提高是以牺牲核心功能的准确性为代价的。


此过程称为“溶解”。我对PostGIS没有经验,但是我相信您可以使用ST_Union命令来执行溶解。
dmahr

嗨,dmahr,感谢您的澄清,不知道叫什么名字,但是,如果您阅读我的问题,您会发现我已经尝试过了:-)
shawty 2012年

糟糕,抱歉...没有看到。您是否尝试了select语句而没有任何内容astext(multi())?我只是从其他PostGIS解散示例中看到的内容。
dmahr

尚未,请立即尝试。Tks。您是否有解散示例的链接?
shawty 2012年

如果您不想要“单个外圈”,请编辑以表示。(请参阅我的回答)
彼得·克劳斯

Answers:


43

ST_Union可以工作,但是几乎可以肯定您的线路工作不干净。因此,您的小物件的边界并非都完美无缺。您可以将它们轻轻地对齐到网格以尝试增加顶点排列的几率,但是我敢打赌,您仍然会遇到一些不起作用的情况。要么它们超出了公差范围,要么更有可能的是,顶点不成对存在,因此一侧有一条线,而另一侧有一个顶点。

 CREATE TABLE merged AS
 SELECT ST_Union(ST_SnapToGrid(the_geom,0.0001)) 
 FROM parishes
 GROUP BY county_name;

如果您拥有PostGIS 2.0,那么如果运气好的话,构建具有公差的拓扑结构可以使您找到想要的答案。


有很好的几何校正线索,但是关于“ ...单个外圈中的一个大多边形包含所有多边形...”?
彼得·克劳斯

我不知道'SnapTo',我会试试看:-) Tks。不幸的是,虽然目前还没有使用PG 2,但是升级仍在进行中。
shawty 2012年

不确定语法是否正确。根据postgis.net/docs/ST_Union.html,在第二个参数中没有可以接受数字的签名。
阿伦·坎布雷

您是对的,括号放在错误的位置。编辑。
保罗·拉姆齐

是否有一个MySQL等效于此?我不断得到Incorrect parameter count in the call to native function 'ST_Union',我不知道这是否是mysql的局限性。
Jayen

7

您说需要“从包含所有多边形的单个外圈形成一个大多边形”。ST_ExteriorRing执行此操作,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_Union(GEOM)))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

您可以按照建议使用ST_Union(),也可以对ST_Collection()进行测试。


注意:为避免出现小偏差或“几何形状破损”,您可以对每个几何图形使用st_convexhull和/或ST_Simplify,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_union(ST_Simplify(GEOM,0.5))))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

并检查您的几何形状,

SELECT * FROM (
   SELECT gid, ST_IsValid(geom) as valid, ST_IsSimple(geom) as simple 
   FROM GEOMTABLE) AS t  
WHERE NOT(valid AND simple); 

抱歉,我感到困惑的是:我的描述是从较小的多边形创建的一个较大的多边形,我意识到根据上下文,“外环”对不同的人可能意味着不同的东西,我的目的是描述一个由多边形创建的单个多边形每个多边形组周围存在边界。
shawty 2012年

7

ST_Collect函数是PostgreSQL术语中的“聚合”函数

SELECT ST_Collect(GEOM) FROM GEOMTABLE GROUP BY ATTRCOLUMN”将为ATTRCOLUM的每个不同值返回一个单独的GEOMETRYCOLLECTION

http://postgis.net/docs/ST_Collect.html

注意: ST_Collect比ST_Union快得多


3
我尝试了一下,但结果略有不同,但是我需要几何集合吗?我基本上是试图让一个大的多边形,任选与有孔(特别是在德比郡和诺丁汉其中两个德比&诺丁汉形成分开区在市中心我做虽然观察的速度差,因此多数民众赞成KEWL。
美女

2

根据您的问题,我假设您正在使用军械测量公司的边界线产品。如果是这种情况,那么它已经包含县级数据集,因此无需尝试自己从较低级别的教区生成该数据集。

如果您不使用边界线,那么我建议您这样做,因为在OS OpenData许可下它是免费的,并且具有County级作为形状文件,您可以直接将其加载到PostGIS中。


2
为不认识的人提供链接怎么样?谢谢。
jonatr 2012年

1
尊敬的CHEnderson,您实际上是正确的,是的,我使用的是OS Opendata的边界层数据集,不幸的是,县域边界不完整,实际的县域图形文件仅包含那些被命名为县的图形,伦敦自治市镇包含周围的区域伦敦和其他文件都包含一些部分,比其他文件更低或更低。唯一包含整个英国轮廓的文件,然后可能在一层中提取所有上层县和市政边界的任何机会是教区,因此,我尝试这样做。
shawty 2012年

对于那些有兴趣可以下载县界多了,就在这里:ordnancesurvey.co.uk/oswebsite/products/os-opendata.html
美女
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.