7575 CREATE TEMP TABLE initial_intersection AS
7676 SELECT e1 .id AS id1, e2 .id AS id2
7777 , e1 .osm_id AS osm_id1, e2 .osm_id AS osm_id2
78+ , e1 .layer AS layer1, e2 .layer AS layer2
7879 , e1 .geom AS geom1
7980 , e2 .geom AS geom2
8081 , e1 .geom_start AS geom_start1
8889 WHERE
8990 -- Find all combinations of mismatches.
9091 e1 .id != e2 .id
91- -- This tolerance should be same (??? should it???) as snap tolerance above
92+ -- This tolerance finds general proximity, later refined.
93+ -- Probably can speed up by switching to simple && bbox query.
9294 AND ST_DWithin(e1 .geom , e2 .geom , 0 .1 )
95+ -- Don't split line if not on same layer
96+ AND e1 .layer = e2 .layer
9397 -- They don't share start/end points. If they do, this step doesn't matter.
9498 AND NOT (
9599 e1 .geom_start = e2 .geom_start OR e1 .geom_start = e2 .geom_end
@@ -111,32 +115,34 @@ BEGIN
111115 SELECT id1 AS id, osm_id1 AS osm_id, geom1 AS geom
112116 , ST_UnaryUnion(ST_Collect(ST_PointOnSurface(blade))) AS blades
113117 FROM initial_intersection
118+ -- Exclude blades same as start/end points
114119 WHERE blade NOT IN (geom_start1, geom_end1)
115- -- AND 17077818 IN (osm_id1)
116120 GROUP BY id1, osm_id1, geom1
117121 UNION
118122 SELECT id2 AS id, osm_id2 AS osm_id, geom2 AS geom
119123 , ST_UnaryUnion(ST_Collect(ST_PointOnSurface(blade))) AS blades
120124 FROM initial_intersection
125+ -- Exclude blades same as start/end points
121126 WHERE blade NOT IN (geom_start2, geom_end2)
122- -- AND 17077818 IN (osm_id2)
123127 GROUP BY id2, osm_id2, geom2
124128 ;
125129
126130 -- Split lines using blades. Assign new `seq` ID (legacy reasons, try to improve this...)
131+ -- Splitting no longer uses snapping. OpenStreetMap edge data should be properly
132+ -- connected with shared nodes if there is a true path. Missing nodes in
133+ -- data should be fixed in OpenStreetMap data directly instead of trying
134+ -- to make that step happen here.
127135 DROP TABLE IF EXISTS split_edges;
128136 CREATE TEMP TABLE split_edges AS
129137 WITH splits AS (
130138 SELECT i .id , i .osm_id
131139 , split .path [1 ]::BIGINT AS sub_id
132140 , split .geom
133141 FROM geom_with_blade i
134- CROSS JOIN LATERAL st_dump(st_split(st_snap( i .geom , blades, 0 . 1 ) , blades)) split
135- WHERE NOT ST_Relate(st_snap( i .geom , blades, 0 . 1 ) , blades, ' 1********' )
142+ CROSS JOIN LATERAL st_dump(st_split(i .geom , blades)) split
143+ WHERE NOT ST_Relate(i .geom , blades, ' 1********' )
136144 AND split .geom <> i .geom -- Exclude any unchanged records
137145 AND NOT ST_IsEmpty(blades) -- Exclude any blades that ended up empty
138- -- AND osm_id1 IN (1171245820, 758283788)
139- -- AND osm_id2 IN (1171245820, 758283788)
140146 )
141147 SELECT row_number() over()::BIGINT AS seq
142148 , *
0 commit comments