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的“简化”几何版本。
返回的几何图形可能不简单或无效。
分割组件边缘有助于保持简单性/有效性