Skip to content

Commit 6728c4e

Browse files
Merge pull request #415 from rustprooflabs/improve-routing-edge-prep
Fix invalid splits in routing edge network
2 parents 179a348 + d61b455 commit 6728c4e

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

db/deploy/routing_functions.sql

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ BEGIN
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
@@ -88,8 +89,11 @@ BEGIN
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

Comments
 (0)