Name

CreateTopoGeom — Erzeugt ein neues topologisch geometrisches Objekt aus einem Feld mit topologischen Elementen - tg_type: 1:[multi]point, 2:[multi]line, 3:[multi]poly, 4:collection

Übersicht

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);

Description

Erstellt ein TopoGeometry Objekt für den Layer, der über die layer_id angegeben wird, und registriert es in der Tabelle "relation" in dem Schema toponame.

tg_type ist eine Ganzzahl: 1:[multi]point (punktförmig), 2:[multi]line (geradlinig), 3:[multi]poly (flächenhaft), 4:collection. layer_id ist der Identifikator des Layers in der Tabelle "topology.layer".

Punktförmige Layer werden aus Knoten gebildet, linienförmige Layer aus Kanten, flächige Layer aus Maschen und Kollektionen können aus einer Mischung von Knoten, Kanten und Maschen gebildet werden.

Wird das Feld mit den Komponenten weggelassen, wird ein leeres TopoGeometrie Objekt erstellt.

Verfügbarkeit: 1.1

Beispiele

Form from existing edges.

Erstellt eine TopoGeometry im Schema "ri_topo" für den Layer 2 (ri_roads), vom Datentyp (2) LINE, für die erste Kante (die wir unter ST_CreateTopoGeo geladen haben).

Code
INSERT INTO ri.ri_roads(road_name, topo)
VALUES (
    'Unknown',
    topology.CreateTopoGeom(
        'ri_topo',
        2,
        2,
        '{{1,2}}'::topology.topoelementarray
    )
);

Convert an areal geometry to best guess topogeometry.

Angenommen wir wollen eine Geometrie aus einer Kollektion von Maschen bilden. Wir haben zum Beispiel die Tabelle "blockgroups" und wollen die TopoGeometry von jeder "blockgroup" wissen. Falls unsere Daten perfekt ausgerichtet sind, können wir folgendes ausführen:

Create the topogeometry column.

Code
SELECT topology.AddTopoGeometryColumn(
'topo_boston',
'boston', 'blockgroups', 'topo', 'POLYGON');

Ausgabe von Rastern
1

Update the column assuming everything is perfectly aligned with the edges.

Code
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, so this version allows some error. It counts a face if 50 percent of it falls within the expected block group boundary.

Code
WITH candidate_faces AS (
    SELECT
        b.gid,
        b.geom AS block_geom,
        f.face_id,
        topology.ST_GetFaceGeometry('topo_boston', f.face_id) AS face_geom
    FROM boston.blockgroups AS b
    INNER JOIN topo_boston.face AS f
        ON b.geom && f.mbr
),
block_faces AS (
    SELECT
        gid,
        topology.TopoElementArray_Agg(ARRAY[face_id, 3]) AS bfaces
    FROM candidate_faces
    WHERE ST_Covers(block_geom, face_geom)
        OR (
            ST_Intersects(block_geom, face_geom)
            AND ST_Area(ST_Intersection(block_geom, face_geom))
                
> ST_Area(face_geom) * 0.5
        )
    GROUP BY gid
)
UPDATE boston.blockgroups AS bg
SET topo = topology.CreateTopoGeom(
    'topo_boston',
    3,
    1,
    block_faces.bfaces
)
FROM block_faces
WHERE block_faces.gid = bg.gid;

To convert the topogeometry back to a denormalized geometry aligned with faces and edges, cast the topogeometry to a geometry. The resulting geometries are aligned with the TIGER street centerlines.

Code
UPDATE boston.blockgroups SET new_geom = topo::geometry;