你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Topology拓扑_7:拓扑处理

2021/12/14 0:16:01

7. 拓扑处理

7.1. Polygonize

Polygonize - 查找并注册拓扑边定义的所有面

7.1.1. 概要

text Polygonize(varchar toponame);

7.1.2. 描述

注册所有的面,可以建立一个拓扑边缘原语。

假设目标拓扑不包含自相交的边。

  • 已知的面可以被识别,所以在同一个拓扑上多次调用Polygonize是安全的
  • 这个函数不使用也不设置边缘表的next_left_edge和next_right_edge字段。

7.2. AddNode

AddNode — 将一个点节点添加到指定拓扑模式中的节点表中,并返回新节点的nodeid。 如果point已经作为node存在,则返回现有的nodeid。

7.2.1. 概要

integer AddNode(varchar toponame, geometry apoint, boolean allowEdgeSplitting=false, boolean computeContainingFace=false);

7.2.2. 描述

将点节点添加到指定拓扑模式中的节点表中。 adddge函数在调用时自动添加一条边的开始点和结束点,因此不需要显式添加一条边的节点。

如果发现任何穿过节点的边,要么引发异常,要么分裂该边,具体取决于allowEdgeSplitting参数值。

如果computeContainingFace为真,新添加的节点将得到正确的包含面。

  • 如果apoint几何图形已经作为节点存在,则不添加该节点,而是返回现有的nodeid。

7.2.3. 样例

SELECT topology.AddNode('ma_topo', ST_GeomFromText('POINT(227641.6 893816.5)', 26986) ) As nodeid;
nodeid
4

7.3. AddEdge

AddEdge -使用指定的linestring几何图形将linestring边添加到edge表中,并将相关的开始点和结束点添加到指定拓扑模式的点节点表中,并返回新(或现有)边的edgeid。

7.3.1. 概要

integer AddEdge(varchar toponame, geometry aline);

7.3.2. 描述

使用指定的linestring几何形状将边添加到边表中,并将关联的节点添加到指定toponame模式的nodes表中,并返回新记录或现有记录的边id。 新增加的边缘两面都有“宇宙”面,并与自身相连。

  • 如果aline几何交叉,重叠,包含或包含现有的linestring边缘,那么抛出一个错误,边缘不添加。
  • aline的几何形状必须具有与拓扑定义相同的srid,否则将抛出无效的空间参考系统错误。

7.3.3. 样例

SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227575.8 893917.2,227591.9 893900.4)', 26986) ) As edgeid;
edgeid
1
SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227591.9 893900.4,227622.6 893844.2,227641.6 893816.5,227704.5 893778.5)', 26986) ) As edgeid;
edgeid
2
SELECT topology.AddEdge('ma_topo', ST_GeomFromText('LINESTRING(227591.2 893900, 227591.9 893900.4,227704.5 893778.5)', 26986) ) As edgeid;

-- gives error --
ERROR: Edge intersects (not on endpoints) with existing edge 1

7.4. AddFace

AddFace - 向拓扑注册面并获取其标识符

7.4.1. 概要

integer AddFace(varchar toponame, geometry apolygon, boolean force_new=false);

7.4.2. 描述

将面注册到拓扑并获取其标识符。

对于新添加的面,构成其边界的边和包含在面中的边将被更新为在left_face和right_face字段中具有正确的值。 包含在face中的孤立节点也将被更新为具有正确的containing_face字段值。

  • 这个函数不使用也不设置边缘表的next_left_edge和next_right_edge字段

假设目标拓扑是有效的(不包含自相交的边)。 如果:多边形边界没有完全由现有边定义或多边形与现有面重叠,则会引发异常。

如果多边形几何体已经作为一个面存在,那么:如果force_new为false(默认),则返回现有面的面id; 如果force_new为true,一个新的id将被分配给新注册的人脸。

  • 当一个新的注册现有的脸执行(force_new=true),不采取任何行动来解决悬空引用现有的脸在边缘,节点一个关系表,也不会更新现有的脸记录的MBR字段。 这要由调用者来处理。
  • 多边形几何形状必须具有与拓扑定义相同的srid,否则将抛出无效的空间参考系统错误。

7.4.3. 样例

-- 首先添加边,我们使用generate_series作为迭代器(如下所示)  
-- 只适用于小于10000点的多边形,因为我们的最大gs)  

SELECT topology.AddEdge('ma_topo', ST_MakeLine(ST_PointN(geom,i), ST_PointN(geom, i + 1) )) As edgeid
    FROM (SELECT ST_NPoints(geom) AS npt, geom
        FROM
            (SELECT ST_Boundary(ST_GeomFromText('POLYGON((234896.5 899456.7,234914 899436.4,234946.6 899356.9,234872.5 899328.7,234891 899285.4,234992.5 899145, 234890.6 899069,234755.2 899255.4,234612.7 899379.4,234776.9 899563.7,234896.5 899456.7))', 26986)) As geom
        ) As geoms) As facen CROSS JOIN generate_series(1,10000) As i
        WHERE i < npt;

edgeid
3
4
5
6
7
8
9
10
11
12
SELECT topology.AddFace('ma_topo',ST_GeomFromText('POLYGON((234896.5 899456.7,234914 899436.4,234946.6 899356.9,234872.5 899328.7,234891 899285.4,234992.5 899145, 234890.6 899069,234755.2 899255.4,234612.7 899379.4,234776.9 899563.7,234896.5 899456.7))', 26986) ) As faceid;
faceid
1

7.1. ST_Simplify

ST_Simplify -使用Douglas-Peucker算法返回给定TopoGeometry的“简化”几何版本。

7.1.1. 概要

geometry ST_Simplify(TopoGeometry geomA, float tolerance);

7.1.2. 描述

在每个组件边缘上使用Douglas-Peucker算法返回给定TopoGeometry的“简化”几何版本。

  • 返回的几何图形可能不简单或无效。
  • 分割组件边缘有助于保持简单性/有效性