从PostGIS中的线创建面


13

我正在尝试将一条线中的一个多边形划分为多个较小的多边形,但是我想我不能使用st_split函数。我需要的是使用线串网格在大的多边形内创建小多边形。

我尝试了一些方法,但无法获得结果。我尝试过的

使用st_split()从LineString中分割一个多边形

从边界多边形开始。

在此处输入图片说明

和线串表:

在此处输入图片说明

我需要以下多边形:

在此处输入图片说明

问题:我无法从多条线分割多边形,也无法从多线串分割多边形。

我正在尝试的另一种方法是使用st_polygonize()从线创建多边形,而我正在尝试的SQL是:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

使用PostgreSQL和PostGIS从线段创建多边形中提取

问题:我只能得到一个多边形(边界)。

有人可以告诉我从线串中获取多边形的最佳方法是什么,或者我是否缺少某些东西?

注意:表位于相同的SRID中,并且几何形状已捕捉到网格中。在QGIS中,我可以完美地执行从线条到多边形的多边形化过程。

根据John的要求,这是线串表。 https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing


1
您可以将线串的几何形状张贴在某个地方吗?ST_Polygonize和ST_Dump应该一起工作。
约翰·鲍威尔

当然。我已经编辑了带有表格链接的帖子。
Pablo Pardo 2015年

@JohnPowellakaBarça可以看看这个吗。这个问题很好。他的样本集上的ST_Polygonize返回单个多边形。我们本质上需要分解他打开的LINESTRINGS的混乱,并找到所有可以制造矩形的东西?
埃文·卡罗尔

1
@EvanCarroll。当然。我疯狂地忙着atm,所以大概没几天了。
约翰·鲍威尔

1
@ppardoz。Espero que esto te ayude。我注意到您的表定义全都是西班牙语:-)
约翰·鲍威尔

Answers:


4

我首先通过将ST_NodeST_Collect结合使用来将这些行转换为MultiLinestring中的一组结点线串,从而完成了这项工作。

就像在ST_Node的文档中说的那样

使用最少数量的节点将一组线串完全节点化,同时保留所有输入节点。

这就是说,所有线串都以所有可能的组合进行组合,以构成与多边形外环等效的线。而如果您尝试ST_Polygonize一组LineString,但它们本身都不描述多边形,则只需将LineString返回即可。因此,这可行:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

如果仅运行其中的第一部分,即CTE multi,则输出如下所示:

多线串((204.5 69.9000000000004,204.5 69.9000000000004),(204.5 68.9,205.4 68.9),(204.5 68.9,204.5 69,204.5 69.1,204.5 69.2,204.5 69.3,204.5 69.4,204.5 69.5,204.5 69.6,204.5 69.7,204.5 69.8,204.5 69.5,204.5 69.1 204.5 69.9000000000004),(209.5 68.9,209.5 68.8,209.5 68.7,209.5 68.6,209.5 68.5,209.5 68.4,209.5 68.3,209.5 68.2,209.5 68.1,209.5 68,209.5 67.9,209.5 67.8,209.5 67.7,209.5 67.6,209.5 67.5,209.5 67.4 ,209.5 .......

现在,当您现在将此MultiLinestring输入ST_Polygonize时,它可以按预期工作,例如,

聚(((205.4 68.9,204.5 68.9,204.5 69,204.5 69.1,204.5 69.2,204.5 69.3,204.5 69.4,204.5 69.5,204.5 69.6,204.5 69.7,204.5 69.8,204.5 69.9,204.5 69.9000000000004,205.4 69.9,205.4 69.3,205.4 68.9))

聚((204.5 69.9000000000004,204.5 70,204.5 70.1,204.5 70.2,204.5 70.3,204.5 70.4,206.8 70.4,209.5 70.4,209.5 70.3,209.5 70.2,209.5 70.1,209.5 70,209.5 69.9,205.4 69.9,204.5 69.9000000000004)

多边形((206.8 70.4,204.5 70.4,204.5 70.5,204.5 70.6,204.5 70.7,204.5 70.8,204.5 70.9,204.5 71,204.5 71.1,204.5 71.2,204.5 71.3,204.5 71.4,206.8 71.4,206.8 70.4)

显然,ST_AsText仅用于说明,如果您也需要路径ID,则必须进行调整。

关键要点在于,ST_Polygonize期望已描述多边形轮廓的线串,这就是ST_Node(ST_Collect(....


真的很酷,我可以确认此解决方案有效!在另一方面,我想知道为什么要说ST_Polygonize()它需要行字符串,或者用例在没有ST_Node()先调用的情况下是什么
Evan Carroll

1
@EvanCarroll。我认为答案是S​​T_Polygonize接受已经在表示多边形的集合中的线串,而此问题中的线串由多个可能的多边形组成。我的理解是这就是ST_Node所做的。我将尝试进一步调查并更新答案。
约翰·鲍威尔
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.