CreateTopoGeom — Skapar ett nytt topogeometriobjekt från en array av topoelement - tg_type: 1:[multi]punkt, 2:[multi]linje, 3:[multi]poly, 4:samling
topogeometry CreateTopoGeom(
varchar toponame, integer tg_type, integer layer_id, topoelementarray tg_objs, bigint tg_id)
;
topogeometry CreateTopoGeom(
varchar toponame, integer tg_type, integer layer_id)
;
Skapar ett topogeometriobjekt för det lager som betecknas med layer_id
och registrerar det i relationstabellen i toponame-schemat
.
tg_type
är ett heltal: 1:[multi]punkt (punctal), 2:[multi]linje (lineal), 3:[multi]poly (areal), 4:samling. layer_id
är lagrets id i tabellen topology.layer.
punktlager bildas av en uppsättning noder, linjelager bildas av en uppsättning kanter, areallager bildas av en uppsättning ytor och samlingar kan bildas av en blandning av noder, kanter och ytor.
Om du utelämnar komponentuppsättningen genereras ett tomt TopoGeometry-objekt.
Tillgänglighet: 1.1
Skapa en topogeom i ri_topo-schema för lager 2 (våra ri_roads), av typ (2) LINE, för den första kanten (vi laddade i ST_CreateTopoGeo
).
INSERT INTO ri.ri_roads(road_name, topo) VALUES('Unknown', topology.CreateTopoGeom('ri_topo',2,2,'{{1,2}}'::topology.topoelementarray);
Låt oss säga att vi har geometrier som ska bildas från en samling ytor. Vi har t.ex. tabellen blockgroups och vill veta topogeometrin för varje blockgrupp. Om våra data var perfekt inriktade skulle vi kunna göra detta:
-- create our topo geometry column -- SELECT topology.AddTopoGeometryColumn( 'topo_boston', 'boston', 'blockgroups', 'topo', 'POLYGON'); -- addtopgeometrycolumn -- 1 -- update our column assuming -- everything is perfectly aligned with our edges 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)) GROUP BY b.gid) As foo WHERE foo.gid = bg.gid;
--the world is rarely perfect allow for some error --count the face if 50% of it falls -- within what we think is our blockgroup boundary 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; -- and if we wanted to convert our topogeometry back -- to a denormalized geometry aligned with our faces and edges -- cast the topo to a geometry -- The really cool thing is my new geometries -- are now aligned with my tiger street centerlines UPDATE boston.blockgroups SET new_geom = topo::geometry;