8. TopoGeometry构造函数
8.1. CreateTopoGeom
CreateTopoGeom -从拓扑元素数组tg_type: 1:[multi]point, 2:[multi]line,3:[multi]poly, 4:collection创建一个新的拓扑几何对象
8.1.1. 概要
topogeometry CreateTopoGeom(varchar toponame, integer tg_type, integer layer_id, topoelementarray tg_objs);
topogeometry CreateTopoGeom(varchar toponame, integer tg_type, integer layer_id);
8.1.2. 描述
为layer_id表示的层创建一个拓扑几何对象,并将其注册到toponame模式的关系表中。
Tg_type是一个整数:1:[多]点(点状),2:[多]线(直线型),3:[多]多(面积),4:集合。 Layer_id为拓扑中的层id。 层表。
点状层由一组节点组成,线状层由一组边组成,面状层由一组面组成,集合可以由节点、边和面的混合物组成。
省略组件数组将生成一个空的TopoGeometry对象。
8.1.3. 样例
- 从现有边缘形成
在ri_topo模式中为第2层(我们的ri_roads)创建一个拓扑图形,类型为(2)LINE,用于第一条边(我们加载在ST_CreateTopoGeo中)
INSERT INTO ri.ri_roads(road_name, topo) VALUES('Unknown', topology.CreateTopoGeom('ri_topo',2,2,'{{1,2}}'::topology.topoelementarray);
- 将一个面积几何转换为最佳猜测拓扑几何
假设我们有一个几何图形,它应该由一系列面组成。 例如,我们有blockgroups表,并希望知道每个块组的拓扑几何。 如果我们的数据完全一致,我们可以这样做:
-- 创建拓扑几何列
SELECT topology.AddTopoGeometryColumn('topo_boston','boston', 'blockgroups', 'topo', 'POLYGON');
| addtopgeometrycolumn |
|---|
| 1 |
-- 更新我们的列假设
-- 一切都与我们的边缘完美对齐
UPDATE boston.blockgroups AS bg
SET topo = topology.CreateTopoGeom('topo_boston',3,1, foo.bfaces)
FROM (SELECT b.gid, topology.TopoElementArray_Agg(ARRAY[f.face_id,3]) As bfaces
FROM boston.blockgroups As bINNER JOIN topo_boston.face As f ON b.geom && f.mbr
WHERE ST_Covers(b.geom, topology.ST_GetFaceGeometry('topo_boston', f.face_id))
GROUP BY b.gid) As foo
WHERE foo.gid = bg.gid;
-- 世界很少是完美的,允许有一些错误
-- 在我们所认为的区块组边界内
UPDATE boston.blockgroups AS bg
SET topo = topology.CreateTopoGeom('topo_boston',3,1, foo.bfaces)
FROM (SELECT b.gid, topology.TopoElementArray_Agg(ARRAY[f.face_id,3]) As bfaces
FROM boston.blockgroups As b INNER JOIN topo_boston.face As f ON b.geom && f.mbr
WHERE ST_Covers(b.geom, topology.ST_GetFaceGeometry('topo_boston', f.face_id))
OR (ST_Intersects(b.geom, topology.ST_GetFaceGeometry('topo_boston', f.face_id))
AND ST_Area(ST_Intersection(b.geom, topology.ST_GetFaceGeometry('topo_boston', f.face_id) ) ) >ST_Area(topology.ST_GetFaceGeometry('topo_boston', f.face_id))*0.5)
GROUP BY b.gid) As foo
WHERE foo.gid = bg.gid;
-- 如果我们想把我们的拓扑结构转换回来
-- 到一个与我们的面和边对齐的命名几何
-- 将拓扑图转换成几何图形
-- 真正酷的是我的新几何图形
UPDATE boston.blockgroups SET new_geom = topo::geometry;
8.2. toTopoGeom
toTopoGeom -将简单的几何图形转换为拓扑几何图形
8.2.1. 概要
topogeometry toTopoGeom(geometry geom, varchar toponame, integer layer_id, float8 tolerance);
topogeometry toTopoGeom(geometry geom, topogeometry topogeom, float8 tolerance);
8.2.2. 描述
将简单的几何体转换为拓扑几何体。
表示输入几何图形所需的拓扑原语将被添加到底层拓扑中,可能会分裂
它们将与关系表中的输出TopoGeometry相关联。
现有的TopoGeometry对象(如果给出topogeom,可能除外)将保留其形状。
当给定公差时,它将被用来将输入几何图形捕捉到现有的原语。
在第一种形式中,将为给定拓扑(toponame)的给定层(layer_id)创建一个新的TopoGeometry。
在第二种形式中,转换产生的原语将被添加到已存在的TopoGeometry (topogeom)中,
可能会给它的最终形状增加空间。 要想让新形状完全取代旧的形状,请参见clearTopoGeom。
8.2.3. 样例
- 这是一个完整的自包含工作流
-- 如果你还没有拓扑设置,可以这样做
-- 创建不允许任何公差的拓扑
SELECT topology.CreateTopology('topo_boston_test', 2249);
--创建一个新表
CREATE TABLE nei_topo(gid serial primary key, nei varchar(30));
--向其添加一个拓扑几何列
SELECT topology.AddTopoGeometryColumn('topo_boston_test', 'public', 'nei_topo', 'topo', 'MULTIPOLYGON') As new_layer_id;
--new_layer_id
-----------
--1
-- 在填充新的拓扑几何列时使用新的图层id
-- 我们以0容差将拓扑图添加到新层
INSERT INTO nei_topo(nei, topo)
SELECT nei, topology.toTopoGeom(geom, 'topo_boston_test', 1) FROM neighborhoods WHERE gid BETWEEN 1 and 15;
-- 用来验证
SELECT * FROM topology.TopologySummary('topo_boston_test');
| summary |
|---|
| Topology topo_boston_test (5), SRID 2249, precision 0 61 nodes, 87 edges, 35 faces, 15 topogeoms in 1 layers Layer 1, type Polygonal (3), 15 topogeoms Deploy: public.nei_topo.topo |
-- 将所有拓扑几何体的多边形缩小10米
UPDATE nei_topo SET topo = ST_Buffer(clearTopoGeom(topo), -10);
-- 获得上述操作所留下的零区
-- 我想GRASS把这个叫做polygon0层
SELECT ST_GetFaceGeometry('topo_boston_test', f.face_id)
FROM topo_boston_test.face f
WHERE f.face_id > 0
AND NOT EXISTS (
-- 检查没有TopoGeometry引用该面
SELECT * FROM topo_boston_test.relation
WHERE layer_id = 1 AND element_id = f.face_id);
8.3. TopoElementArray_Agg
TopoElementArray_Agg - 返回一组element_id的topoelementarray,类型数组(topoelements)
8.3.1. 概要
topoelementarray TopoElementArray_Agg(topoelement set tefield);
8.3.2. 样例
SELECT topology.TopoElementArray_Agg(ARRAY[e,t]) As tea FROM generate_series(1,3) As e CROSS JOIN generate_series(1,4) As t;
| tea |
|---|
| {{1,1},{1,2},{1,3},{1,4},{2,1},{2,2},{2,3},{2,4},{3,1},{3,2},{3,3},{3,4}} |
