จะแบ่งถนน OSM ออกเป็นส่วน ๆ ได้ที่ทางแยกได้อย่างไร


10

ฉันต้องการสร้างเครือข่ายถนนสำหรับใช้กับ 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)

อย่างไรก็ตามวิธีการนี้ไม่ได้ลบรูปทรงเรขาคณิตที่ไม่ได้แยกแบบดั้งเดิมทั้งหมด (แม้ว่าจะเป็นการลบรูปแบบบางส่วนออก) มีวิธีที่ดีกว่าสำหรับการลบ (หรือโดยรวม) เพื่อให้ฉันมีรูปทรงเรขาคณิตแยกในตารางหรือไม่?


ตามเอกสารอธิบาย ST_Split จะไม่ส่งคืนเรขาคณิตที่ไม่ได้รับเครื่องหมาย '.geom' พิเศษนั้นคืออะไรที่แขวนอยู่ในวงเล็บปิดสุดท้ายในบรรทัดแรกของคำสั่ง SELECT ของคุณ? อาจจะง่ายเหมือนการถอดออก
Scro

@Scro .geomคุณหมายถึงอะไร มองไม่เห็น!
djq

ฉันเดาทางเทคนิคว่าจะเป็นบรรทัดที่สองของคำสั่ง SELECT นอกจากนี้ฉันหมายถึงการสร้างตาราง "split_roads" มันคือบรรทัดที่ลงท้ายด้วย '))). geom) เป็น geom'
Scro

อืมฉันได้รับข้อผิดพลาดเมื่อฉันทำเช่นนั้น 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.
djq

ทำทั้งบรรทัดมีลักษณะเช่นนี้: ST_GeomFromEWKB ((ST_Dump (ST_Split (g.geom, blade.geom)))) ในฐานะ geom
Scro

คำตอบ:


6

ไม่ใช่วิธีการแก้ปัญหาของคุณจริง แต่ลอง osm2po ... มันสร้างรหัส SQL ที่สมบูรณ์แบบสำหรับการกำหนดเส้นทางใน pgrouting: http://osm2po.de/


ขอบคุณสำหรับคำแนะนำ ฉันลองแล้วosm2pgroutingแต่มันต้องการหน่วยความจำมากกว่าเซิร์ฟเวอร์ของฉันและมันก็จบลงโดยไม่จบ
djq

2
@djq osm2po สามารถจัดการไฟล์ขนาดใหญ่กว่า osm2pgrouting มันสามารถโหลดดาวเคราะห์ได้ osm
underdark

อาฉันคิดว่าosm2poเป็นตัวพิมพ์ผิด มีการติดตั้งใน Ubuntu โดยตรงหรือไม่
djq

มันเป็นไฟล์ JAR ที่คอมไพล์แล้ว (java) เพียงแค่เรียกใช้ตามที่อธิบายไว้บนเว็บไซต์
นักเรียน GIS

11

คำตอบง่ายๆ: อย่า คุณไม่ควรทำอย่างนั้น

จาก Shapefiles ของถนน OSM เป็นไปไม่ได้ที่จะแยกแยะความแตกต่างระหว่างทางแยกกับ / ล่าง คุณจะสร้างทางแยกที่ไม่มีอยู่จริงถ้าคุณแยกถนนที่ดูเหมือนข้ามทั้งหมด

คุณจะต้องทำให้มือสกปรกด้วยไฟล์ OSM ดั้งเดิมหากคุณไม่ต้องการใช้เครื่องมือที่มีอยู่เช่น osm2pgrouting (ที่เครือข่ายมีขนาดเล็กพอ) หรือ osm2po


1
เผง นี่เป็นอีกความผิดพลาดที่บางคนทำเมื่อประมวลผลข้อมูล navteq และ teleatlas Underpass / Overpasses เป็นความเจ็บปวด แต่เป็นความจริง
Ragi Yaser Burhum

1
ตกลง. ยินดีต้อนรับสู่ GIS ที่มีข้อมูลเลวร้ายลงเรื่อย ๆ
simplexio

3

เกี่ยวกับปัญหาทั่วไปของคุณโดยใช้ pgRouting: ฉันคิดว่า @Uffer, @GisStudent และคนอื่น ๆ ที่แสดงวิธีใช้ "OSC และอื่น ๆ " พวกเขาพูดถูก ไปตามเคล็ดลับของ "แนวปฏิบัติที่ดีที่สุด" และ "มาตรฐาน" ...

เกี่ยวกับคำถามของคุณ: "แบ่งถนนออกเป็นส่วนต่างๆที่ทางแยก" หรือ "วิธีลบรูปทรงเรขาคณิตที่ไม่ได้แยกแบบดั้งเดิมทั้งหมด" ฉันสามารถช่วยถ้าคุณแสดงผลลัพธ์ของคุณที่นี่ทีละขั้นตอน ...

ขั้นตอนแรก: การวิเคราะห์โครงสร้าง

 CREATE TABLE split_points_topo as
  SELECT     
    a.gid as gid_a, b.gid  as gid_b, ST_Relation(a.geom, b.geom) as DE9IM_code
  FROM
    roads as a,
    roads as b
  WHERE a.gid != b.gid AND a.geom && b.geom;

 SELECT DISTINCT st_geometryType(geom) FROM roads;
 SELECT DISTINCT DE9IM_code FROM split_points_topo;
 -- list here the results o these two queries!  ... after we can continue.

2

"ไม่ใช่ทางออกที่แท้จริงสำหรับปัญหาของคุณ" แต่ตัวแปลง OSMของเราแยกที่ทางแยกในขณะที่แปลงจาก OSM เป็น SHP วิธีนี้มีประสิทธิภาพมากกว่าเนื่องจากสามารถเปรียบเทียบ ID ของโหนดได้แทนที่จะทำการคำนวณทางเรขาคณิต


1

วิธีหนึ่งในการแก้ไขอัลกอริทึมคือการเพิ่มจุดเริ่มต้นและจุดสิ้นสุดของถนนทั้งเส้นในชุดของ "ทางแยก" เพื่อให้คุณมั่นใจได้ว่าทุกส่วนอยู่ระหว่างสี่แยก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.