GISarabia.org
PostGIS › الدليل الرسمي › 9. الطوبولوجيا › 9.9. دوال إنشاء TopoGeometry
PostGIS 3.6 · Official Manual · ترجمة عربية

CreateTopoGeom

الصفحة الأصلية بالإنجليزية postgis.net ↗

الاسم

CreateTopoGeom — تُنشئ كائن TopoGeometry جديدًا من مصفوفة عناصر طوبولوجية - tg_type: ‏1:‏ نقطة [متعددة]، 2: خط [متعدد]، 3: مضلع [متعدد]، 4: مجموعة أشكال

المختصر

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

الوصف

تُنشئ كائن TopoGeometry للطبقة المحددة بواسطة layer_id وتسجّله في جدول العلاقات في المخطط (schema) toponame.

tg_type عدد صحيح: 1: نقطة [متعددة] (نقطي)، 2: خط [متعدد] (خطي)، 3: مضلع [متعدد] (مساحي)، 4: مجموعة أشكال. وlayer_id هو معرّف الطبقة في الجدول topology.layer.

تتكوّن الطبقات النقطية من مجموعة عقد، والطبقات الخطية من مجموعة حواف، والطبقات المساحية من مجموعة وجوه، ويمكن أن تتكوّن المجموعات من مزيج من العقد والحواف والوجوه.

يؤدي إغفال مصفوفة المكوّنات إلى إنشاء كائن TopoGeometry فارغ.

متاحة منذ: 1.1

أمثلة: الإنشاء من حواف موجودة

أنشئ TopoGeometry في المخطط ri_topo للطبقة 2 (ri_roads الخاصة بنا)، من النوع (2) خط، لأول حافة (التي حمّلناها في ST_CreateTopoGeo).

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

أمثلة: تحويل شكل هندسي مساحي إلى أفضل TopoGeometry تقديري

لنفترض أن لدينا أشكالًا هندسية يجب أن تتكوّن من مجموعة وجوه. لدينا مثلًا جدول blockgroups ونريد معرفة TopoGeometry لكل مجموعة كتل. لو كانت بياناتنا متطابقة المحاذاة تمامًا، لأمكننا فعل ما يلي:

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