使用PostGIS识别拓扑关系


16

我正在尝试使用PostGIS执行基本的类型分析。我的目标是找到所有与其他多边形接触的多边形。为此,我认为ST_GetFaceEdges可以工作(参考)。我想检查数据库中的每个多边形,并列出所有与之接触的其他多边形。在下面的图像中,我希望结果表示两个多边形(即建筑物)接触一栋建筑物,而其他四个的结果表明它们接触0个多边形。

在此处输入图片说明

但是,我在理解该怎么做方面有些困难。当我尝试复制示例时,其中有一些我不理解的部分。

-- Returns the sequence, edge id
-- , and geometry of the edges that bound face 1
-- If you just need geom and seq, can use ST_GetFaceGeometry
SELECT t.seq, t.edge, geom
FROM topology.ST_GetFaceEdges('tt',1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

我不确定topology是表,列还是函数的一部分的名称。我以为是桌子,但我不确定。

-- try out on sample of data
-- Table is called 'TestArea', column used is 'fid_1'
SELECT t.seq, t.edge, geom
FROM  TestArea.ST_GetFaceEdges('fid_1', 1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

我也不确定内部联接的功能是什么-将结果联接到原始对象吗?


4
我知道Underdark已用她的特征清晰的图表回答了这一问题,但我不确定的是,多边形是否在拓扑上首先相关。在这种情况下,拓扑意味着实体之间的逻辑关系与它们的视觉表示是分开的,并且(在PostGIS中)要求使用等来建立架构CreateTopologybit.ly/oLk8QY),但是您的建筑物数字化的方式对我而言就像它们的边缘在视觉上是紧密的一样,在拓扑上却截然不同。只是一些供将来的提问者注意的事情。
MerseyViking 2011年

这是否意味着我需要AddTopoGeometryColumn在运行查询之前向表中添加一个?基于ST_Touches这些值的结果,我进行了检查,但这都是偶然的。
djq 2011年

1
您不仅需要致电AddTopoGeometryColumn,而且您的数据还需要以拓扑一致的方式进行数字化。例如,传统上,您将两个半独立式房屋数字化为两个多边形,并在GIS中使用“捕捉顶点”来确保共享的墙碰触,但是它将存储为两条重合线,每条重合线的两端都有重合点。但是从拓扑上数字化它们意味着共享的墙实际上只是一条线和每个多边形共享的两个节点。ST_Touches只是对空间进行紧密性检查,而不是拓扑检查。
MerseyViking 2011年

Answers:


19

您可以改用ST_Touches

ST_Touches —如果几何至少有一个共同点,但它们的内部不相交,则返回TRUE。

ST_Touches为例如返回TRUE

在此处输入图片说明

得到计数应该是这样的:

SELECT a.id, count(*)
FROM polygon_table as a
JOIN polygon_table as b
  ON ST_Touches(a.the_geom,b.the_geom)
GROUP BY a.id

我想知道每个多边形有多少个多边形。否则,它是完美的,我可以运行它!
djq 2011年

1
我只是意识到它会为每种情况返回一个true / false值,因此我要做的就是计算有多少个true值。谢谢!
djq 2011年

5
添加了可能的计数查询。
昏暗
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.