ฉันกำลังตรวจสอบวิธีที่ดีที่สุดในการตัดการเชื่อมต่อตามจุด
สถานการณ์คือ: ถนนจำนวนมากต้องแบ่งส่วนตามจุดตัดกันแบบนี้:
ฉันได้
ตารางการเคลื่อนไหว (เต็มจุดโดยไม่ได้คะแนน)
ตารางคะแนน st_intersection
ฉันต้องได้รับการตัดส่วนที่เป็นอิสระโดยตารางจุดตัด
ฉันใช้ฟังก์ชั่น PostGIS และพบวิธีการต่าง ๆ แต่ทุกคนมีปัญหาบางอย่างให้ฉัน
นี่คือสิ่งที่ฉันทดสอบแล้ว:
1
ตารางเส้น: 1 แถว, st_memunion ของ 1200 บรรทัดตารางจุด: 1,700 แถว (คะแนน)
มีอะไรที่ไม่ดี: ใช้เวลาและหน่วยความจำอย่างมาก ไม่สามารถสร้างหลายตารางพร้อมกันทำให้หน่วยความจำไม่สามารถจัดการได้ และผลลัพธ์ก็สกปรกและยุ่งเหยิง แทนที่จะให้หมายเลขแถวที่ถูกต้องกับฉันและฉันจำเป็นต้องทำความสะอาดในภายหลัง (อธิบายอย่างดีที่นี่แยกบรรทัดที่จุดตัดกัน )
CREATE TABLE lines_with_messy_result AS (
SELECT
((ST_DUMP(ST_SPLIT(a.geom,b.ix))).geom) as geom
FROM st_union_lines a
INNER JOIN lots_of_points b
ON ST_INTERSECTS(a.geom, b.ix)
);
--then need to clean this up
create table lines_segments_cleaned as (
SELECT DISTINCT ON (ST_AsBinary(geom))
geom
FROM
lines_with_messy_result
);
แหล่งที่มาของวิธีนี้ / แนวทาง: /programming/25753348/how-do-i-divide-city-streets-by-intersection-using-postgis
2
ตารางเส้น / คะแนนเดียวกัน ยังคงมีผลยุ่งและจำเป็นต้องทำความสะอาด ยังมีเวลาอีกมากในการค้นหาให้เสร็จ
--messy table
Create table messy_lines_segments as
Select
row_number() over() as id,
(st_dump(st_split(input.geom, blade.ix))).geom as geom
from st_union_lines input
inner join lots_of_points blade on st_intersects(input.geom, blade.ix);
--then cleaning the messy table
delete from messy_lines_segments a
where exists
(
select 1 from messy_lines_segments b where a.id != b.id and st_coveredby(b.geom,a.geom)
);
แหล่งที่มาของวิธีนี้ / วิธีการ: แยกบรรทัดที่จุดตัดกัน
3
ฉันยังพบฟังก์ชันนี้: https://github.com/Remi-C/PPPP_utilities/blob/master/postgis/rc_Split_Line_By_Points.sql
ซึ่งมีสิ่งที่ดีที่ไม่ทิ้ง messy_result ที่ฉันต้องทำความสะอาด แต่คุณต้องการ st_memunion จากทั้งสองข้าง (ตารางเส้นและตารางคะแนน)
มันเป็นประเภท:
create table osm.calles_cortadas_03segmentos_sanluis as (
SELECT result.geom
FROM
osm.calles_cortadas_01uniones_sanluis AS line,
osm.calles_cortadas_00intersecciones_sanluis AS point,
rc_split_line_by_points(
input_line:=line.geom
,input_points:=point.ix
,tolerance:=4
) AS result
);
แต่ก็เป็นชั่วโมงที่ยาวเป็นพิเศษในการรับผลลัพธ์ และฉันก็ลองกับตารางที่ยาวขึ้น (เส้น 10k, 14k คะแนน) และฉันเพิ่งได้รับปัญหาหน่วยความจำ
ฉันยังลอง ArcGIS ของ Esri ด้วยเช่นกัน ...
ดังนั้นวิธีที่ดีที่สุดในการทำให้สิ่งนี้สำเร็จด้วยฟังก์ชั่น Geom ของ PostGIS คืออะไร
ฉันหมายถึงโดยไม่ต้องก้าวเข้าสู่โทโพโลยี
หรือคำแนะนำที่ดีที่สุดของคุณคืออะไร