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

Topology拓扑_8:TopoGeometry构造函数

2021/12/15 0:17:13

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}}