ฉันต้องการสร้างเครือข่ายถนนสำหรับใช้กับ pgRouting โดยใช้ข้อมูล OpenStreetMap ฉันโหลด shapefile จาก GeoFabrik ลงในตาราง Postgres (โดยเปิดใช้งาน PostGIS) อย่างไรก็ตามปัญหาหนึ่งที่ฉันมีคือถนนมักจะไม่จบที่สี่แยกดังนั้นฉันจึงตัดสินใจแยกพวกเขาทุกครั้งที่สี่แยกหรือข้าม
ในการระบุการแยกทั้งหมดที่ข้ามถนนหรือทางแยกฉันใช้สิ่งต่อไปนี้SQL
(คล้ายกับคำถามก่อนหน้า ):
CREATE TABLE split_points as
SELECT DISTINCT
ST_GeometryN(ST_Intersection(a.geom, b.geom),1) as geom
FROM
roads as a,
roads as b
WHERE
ST_Touches(a.geom, b.geom)
OR
ST_Crosses(a.geom, b.geom)
AND a.gid != b.gid
GROUP BY
ST_Intersection(a.geom, b.geom);
ตอนนี้ฉันต้องการแยกถนนโดยใช้จุดเหล่านี้ ฉันใช้วิธีการต่อไปนี้:
CREATE TABLE split_roads as
SELECT
ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))).geom) As geom,
generate_series(1,ST_NumGeometries((ST_Split(g.geom, blade.geom)))) as gid
FROM
split_points as blade,
roads as g
WHERE
ST_Intersects(g.geom, blade.geom);
ปัญหาเกี่ยวกับวิธีการแยกนี้คือความยาวถนนเต็มยังคงอยู่นอกเหนือจากการแยกทั้งหมด หากต้องการลบรูปทรงเรขาคณิตของถนนที่ยังไม่ได้แยกซึ่งรวมอยู่ฉันได้ใช้ST_Equals()
ฟังก์ชั่นเพื่อระบุรูปทรงเหล่านั้นและลบออก:
DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)
อย่างไรก็ตามวิธีการนี้ไม่ได้ลบรูปทรงเรขาคณิตที่ไม่ได้แยกแบบดั้งเดิมทั้งหมด (แม้ว่าจะเป็นการลบรูปแบบบางส่วนออก) มีวิธีที่ดีกว่าสำหรับการลบ (หรือโดยรวม) เพื่อให้ฉันมีรูปทรงเรขาคณิตแยกในตารางหรือไม่?
.geom
คุณหมายถึงอะไร มองไม่เห็น!
ERROR: function st_geomfromewkb(geometry_dump) does not exist LINE 4: ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))))... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.