From f1f829c2c6dd640fa5755ae8e664c719d303addb Mon Sep 17 00:00:00 2001 From: que01 Date: Mon, 24 Aug 2026 13:51:21 +0800 Subject: [PATCH] fix: stabilize fengshu native road compilation --- config/areas/fengshu-er-road.json | 7 +- inputs/osm/枫树二路.osm | 13362 +++++++++------------------- scripts/compile-native-roads.js | 16 +- scripts/lib/complex-junction.js | 8 +- scripts/lib/native-road.js | 31 +- scripts/test-native-road.js | 14 + 6 files changed, 4501 insertions(+), 8937 deletions(-) diff --git a/config/areas/fengshu-er-road.json b/config/areas/fengshu-er-road.json index 266a514..a9defe8 100644 --- a/config/areas/fengshu-er-road.json +++ b/config/areas/fengshu-er-road.json @@ -39,7 +39,12 @@ "coreRadiusMeters": 28, "cornerRadiusMeters": 25, "outerRadiusExtraMeters": 24, - "nodeIds": ["8005332807", "8024512135", "8024512145", "8024512147"] + "nodeIds": [ + "8005332807", + "8024512135", + "8024512145", + "8024512147" + ] } ] } diff --git a/inputs/osm/枫树二路.osm b/inputs/osm/枫树二路.osm index 45660d2..300a4af 100644 --- a/inputs/osm/枫树二路.osm +++ b/inputs/osm/枫树二路.osm @@ -1,12 +1,18 @@ - - + + + + + + + + - + - + @@ -21,62 +27,62 @@ - - + + - - + + - + - - - + + + - - + + - - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - + + + + + - - + + @@ -87,118 +93,118 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - + + + + + + - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - + + + - + - + @@ -208,19 +214,19 @@ - - + + - - - - - - + + + + + + @@ -229,71 +235,71 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - + @@ -314,100 +320,100 @@ - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -449,19 +455,19 @@ - - + + - - - - - + + + + + @@ -498,236 +504,236 @@ - - + + - + - - + + - + - - + + - + - + - - - + + + - - - - + + + + - - + + - - - + + + - - - + + + - + - - + + - + - - - - + + + + - + - + - + - - - - - - - - + + + + + + + + - + - + - - - - + + + + - - - - - - - - + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - + + - + - - - - + + + + - - - + + + - + - + - - - - - + + + + + - - - + + + - - - + + + - - + + - - - - - + + + + + - - - - - - + + + + + + - - + + - + - - + + - + - + - + - - - - - - - + + + + + + + @@ -755,26 +761,26 @@ - - - + + + - - - + + + - - + + @@ -803,661 +809,661 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - + + + + + + @@ -1530,10 +1536,10 @@ - - - - + + + + @@ -1554,16 +1560,16 @@ - - - - - - - - - - + + + + + + + + + + @@ -1708,1926 +1714,1926 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + @@ -3649,28 +3655,28 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -3679,201 +3685,201 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - + + + + + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -4171,126 +4177,126 @@ - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4362,16 +4368,16 @@ - + - - - + + + @@ -4416,20 +4422,20 @@ - - - + + + - - + + - + - - + + @@ -4456,17 +4462,17 @@ - + - - - - - + + + + + @@ -4474,10 +4480,10 @@ - - - - + + + + @@ -4496,7 +4502,7 @@ - + @@ -4523,7 +4529,7 @@ - + @@ -4570,100 +4576,100 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - + + + + - - + + - + @@ -4671,7 +4677,7 @@ - + @@ -4680,46 +4686,46 @@ - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - + + @@ -4729,7 +4735,7 @@ - + @@ -4754,50 +4760,50 @@ - - - + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + @@ -4836,131 +4842,131 @@ - - + + - + - + - + - + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - - - - - - - - + + + + + + + + - - + + - + - + - - - - - - - + + + + + + + @@ -4996,8 +5002,8 @@ - - + + @@ -5020,14 +5026,14 @@ - + - - - - - + + + + + @@ -5038,54 +5044,54 @@ - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -5176,46 +5182,46 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5269,7 +5275,7 @@ - + @@ -5287,153 +5293,153 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5454,25 +5460,25 @@ - + - + - + - + - + - + - + @@ -5508,40 +5514,40 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -5586,78 +5592,78 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - + - + - + - + - + - + - + - + - + - + - + @@ -5676,72 +5682,72 @@ - - - - - - - - - + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + @@ -5755,57 +5761,72 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + - - - + + + - - - - - - - - + + + + + + + + - + - + - + - + - + + + + + + + + + + + + + + + + @@ -5814,9 +5835,7 @@ - - - + @@ -5827,28 +5846,7 @@ - - - - - - - - - - - - - - - - - - - - - - + @@ -5857,15 +5855,7 @@ - - - - - - - - - + @@ -5874,11 +5864,7 @@ - - - - - + @@ -5887,52 +5873,14 @@ - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + @@ -5947,19 +5895,7 @@ - - - - - - - - - - - - - + @@ -5968,404 +5904,164 @@ - - - - - - + - - - - - + - - - + - - - + - - - + - - - - - - - - - - - + - - - - + - - - - + - - - - + - - - - - - - - - + - - - - - + - - - - + - - - - + - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + - - - + - - - - + - - - - + - - - + - - - - - - - - - - - + - + - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - + - - - - - + - - - - - + - - - - + - - - + - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - + - - - - + - - - + - - - - - - - - - - - - - - - - - - - + @@ -6374,31 +6070,16 @@ - - - - + - - - - + - - - - + - - - - - - - + @@ -6407,96 +6088,45 @@ - - - - - - + - - - - - - - - - + - - - - - - - - - - - + - - - + - - - + - - - - - - - - + - - - - - + - - - - - - - - + - - - - - - - + @@ -6512,28 +6142,11 @@ - - - - - - - - - - + - - - - - - - - - + @@ -6547,82 +6160,37 @@ - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - - - - - - + - - - - - - - + @@ -6636,12 +6204,7 @@ - - - - - - + @@ -6650,14 +6213,7 @@ - - - - - - - - + @@ -6666,22 +6222,7 @@ - - - - - - - - - - - - - - - - + @@ -6695,9 +6236,7 @@ - - - + @@ -6708,11 +6247,7 @@ - - - - - + @@ -6721,31 +6256,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -6754,102 +6265,31 @@ - - - - - - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - + - - - - - - - - - - + @@ -6863,32 +6303,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -6902,14 +6317,7 @@ - - - - - - - - + @@ -6922,1058 +6330,370 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - + - - - - - - - - - - + - - - - - - - + - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + @@ -7986,21 +6706,11 @@ - - - - - - + - - - - - - + @@ -8013,21 +6723,11 @@ - - - - - - + - - - - - - + @@ -8040,21 +6740,11 @@ - - - - - - + - - - - - - + @@ -8067,30 +6757,15 @@ - - - - - - + - - - - - - + - - - - - - + @@ -8103,14 +6778,7 @@ - - - - - - - - + @@ -8246,12 +6914,7 @@ - - - - - - + @@ -8302,23 +6965,11 @@ - - - - - - - - + - - - - - - + @@ -8591,3824 +7242,1535 @@ - - - - - - + - - - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - + - - - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - + - - - - - - - - + - - - - - - - - + - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - + - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + @@ -12421,23 +8783,11 @@ - - - - - - - - + - - - - - - + @@ -12487,50 +8837,23 @@ - - - - - - + - - - - - - + - - - - - - - - + - - - - - - + - - - - - - + @@ -12552,366 +8875,149 @@ - - - - - - + - - - - - - + - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - + - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - - - - + - - - - - - - - - + @@ -12924,156 +9030,50 @@ - - - - - - - - - - + - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - + - - - - + - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - + - - - - - - + - - - - + - - - - - - + @@ -13082,70 +9082,18 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + @@ -13153,15 +9101,7 @@ - - - - - - - - - + @@ -13177,19 +9117,7 @@ - - - - - - - - - - - - - + @@ -13269,8 +9197,7 @@ - - + @@ -13280,7 +9207,6 @@ - @@ -13289,41 +9215,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + @@ -13332,35 +9229,12 @@ - - - - - - - - - + - - - - - - - - - - - - - - - - + @@ -13373,27 +9247,12 @@ - - - - - - - - - - - - - + - - - - + @@ -13403,11 +9262,7 @@ - - - - - + @@ -13416,10 +9271,7 @@ - - - - + @@ -13428,10 +9280,7 @@ - - - - + @@ -13441,35 +9290,10 @@ - - - - - - - - + - - - - - - - - - - - - - - - - - - - + @@ -13499,12 +9323,7 @@ - - - - - - + @@ -13517,289 +9336,137 @@ - - - + - - - - + - - - + - - - + - - - + - - - + - - - + - - - + - - - - + - - - - - - + - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - - - - - - - - + - - - - - - + - - - - - - - + - - - - - - - + - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - + - - - - - - - + @@ -13807,56 +9474,15 @@ - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - + @@ -13865,149 +9491,79 @@ - - - + - - - - - - - - + - - - - - - - - - + - - - - - - - - - + - - - + - - - + - - - - - - - + - - - + - - - + - - - - - - - + - - - - - - + - - - - - + - - - - + - - - - + - - - + - - - - - - - - - + @@ -14015,9 +9571,7 @@ - - - + @@ -14025,19 +9579,7 @@ - - - - - - - - - - - - - + @@ -14290,7 +9832,7 @@ - + @@ -14320,7 +9862,6 @@ - @@ -14360,7 +9901,6 @@ - @@ -14393,7 +9933,7 @@ - + @@ -14412,8 +9952,6 @@ - - @@ -14476,15 +10014,13 @@ - + - - @@ -14497,76 +10033,59 @@ - + - - + - - - - + - - - + - - + - + - - + - - + - - - + - - - - + - - - - + @@ -14584,10 +10103,8 @@ - - + - @@ -14600,16 +10117,11 @@ - - - - - @@ -14619,9 +10131,6 @@ - - - @@ -14630,7 +10139,6 @@ - @@ -14657,11 +10165,9 @@ - + - - @@ -14688,7 +10194,7 @@ - + @@ -14726,7 +10232,6 @@ - @@ -14786,7 +10291,6 @@ - @@ -14934,7 +10438,7 @@ - + @@ -14946,8 +10450,6 @@ - - @@ -14962,7 +10464,7 @@ - + @@ -15419,9 +10921,6 @@ - - - @@ -15509,7 +11008,6 @@ - diff --git a/scripts/compile-native-roads.js b/scripts/compile-native-roads.js index b7b478c..d09e6d2 100644 --- a/scripts/compile-native-roads.js +++ b/scripts/compile-native-roads.js @@ -23,9 +23,23 @@ function compileArea(configPath) { const area = readAreaConfig(configPath, { repoRoot }); const overrides = loadOverrides(area.outputs.nativeRoadOverrides); const model = compileRoadModel(fs.readFileSync(area.input, "utf8"), overrides); - validateOverrides(overrides, model); + // Editing the source OSM retires the ids some overrides point at. Those + // entries can no longer match anything, so drop them with a diagnostic rather + // than aborting the whole compile — otherwise every OSM edit blocks the + // pipeline until the file is hand-pruned, one error message at a time. + const validated = validateOverrides(overrides, model, { skipStaleTargets: true }); + for (const item of validated.stale) console.warn(`[warning] 忽略失效的 override(目标已不存在):${item.id} -> ${item.target}`); fs.mkdirSync(area.outputs.pipelineDir, { recursive: true }); const compiled = compileGeometry(model, overrides, { edgeLines: area.nativeRoad.edgeLines, junctionTemplates: area.nativeRoad.junctionTemplates }); + compiled.diagnostics.push(...validated.stale.map((item) => ({ + id: `diagnostic:stale-override:${item.id}`, + severity: "warning", + subjectId: item.id, + sourceIds: [], + rule: "stale-override-target", + message: `该设置指向的 ${item.kind} 目标 ${item.target} 已不存在(OSM 改动后 id 失效),本次编译已忽略。可在工作台重新设置,或从 native-road-overrides.json 中删除。`, + geometry: null, + }))); const signalDocument = loadOrGenerate(area.outputs.nativeTrafficSignals, fs.readFileSync(area.input, "utf8"), compiled.vehicleStopLines, compiled.intersectionSurface); const signalRuntime = runtime(signalDocument); // Persist validation normalization, including one-time legacy heading migration. diff --git a/scripts/lib/complex-junction.js b/scripts/lib/complex-junction.js index e3a072b..b346c02 100644 --- a/scripts/lib/complex-junction.js +++ b/scripts/lib/complex-junction.js @@ -261,9 +261,15 @@ function readReferenceCalibration(cluster) { function complexJunctionMetrics(cluster) { if (metricsCache.has(cluster)) return metricsCache.get(cluster); const calibration = readReferenceCalibration(cluster); + // Without a reference geometry `coreRadiusMeters` is the only size input the + // template has, so honour it literally within the schema's own 12..80 range. + // It used to be scaled by .52 and clamped to 17, which silently capped every + // unreferenced junction at a core far smaller than its own approach envelope + // — a 24 m dual-carriageway arm was being fitted into a 16.6 m core no matter + // what the config asked for. The calibrated branch is unchanged. const coreRadius = calibration ? Math.max(12, Math.min(24, calibration.shortSpanMeters * .14)) - : Math.max(11, Math.min(17, cluster.coreRadiusMeters * .52)); + : Math.max(12, Math.min(80, Number(cluster.coreRadiusMeters) || 28)); const metrics = { calibration, coreRadius, approachOuterRadius: coreRadius + (Number(cluster.outerRadiusExtraMeters) || 18) }; metricsCache.set(cluster, metrics); return metrics; diff --git a/scripts/lib/native-road.js b/scripts/lib/native-road.js index 008123d..692275a 100644 --- a/scripts/lib/native-road.js +++ b/scripts/lib/native-road.js @@ -154,7 +154,26 @@ function loadOverrides(file) { return validateOverrides(JSON.parse(fs.readFileSync(file, "utf8"))); } -function validateOverrides(value, model) { +// An override points at an id derived from OSM. Editing the source can retire +// that id — a way deleted, or split differently so `segment/6` no longer +// exists — which leaves the entry pointing at nothing. That is stale data, not +// a malformed override, so callers that merely consume overrides can ask to +// skip them and keep going. Callers that *save* overrides still use the default +// strict mode: writing a reference that cannot resolve is a real error. +function staleOverrideTarget(item, sets) { + if (!sets.roadIds) return null; + if (item.kind === "road" && typeof item.roadId === "string" && !sets.roadIds.has(item.roadId)) return item.roadId; + if (item.kind === "lane-separator-style" && typeof item.roadId === "string" && !sets.roadIds.has(item.roadId)) return item.roadId; + if (item.kind === "edge-line-style" && typeof item.roadId === "string" && !sets.directionalRoadIds.has(item.roadId)) return item.roadId; + if (item.kind === "center-line-style" && typeof item.segmentId === "string" && !sets.segmentIds.has(item.segmentId)) return item.segmentId; + if (item.kind === "junction-connection" && typeof item.fromEndpointId === "string" && typeof item.toEndpointId === "string" + && (!sets.endpointIds.has(item.fromEndpointId) || !sets.endpointIds.has(item.toEndpointId))) return `${item.fromEndpointId} → ${item.toEndpointId}`; + if (item.kind === "lane-connection" && typeof item.fromLaneId === "string" && typeof item.toLaneId === "string" + && (!sets.laneIds.has(item.fromLaneId) || !sets.laneIds.has(item.toLaneId))) return `${item.fromLaneId} → ${item.toLaneId}`; + return null; +} + +function validateOverrides(value, model, options = {}) { if (!value || value.schema !== OVERRIDE_SCHEMA || !Array.isArray(value.overrides)) throw new Error(`Overrides must use ${OVERRIDE_SCHEMA}.`); const ids = new Set(); const roadIds = model ? new Set(model.roads.flatMap((road) => [road.id, road.sourceRoadId])) : null; @@ -162,9 +181,16 @@ function validateOverrides(value, model) { const endpointIds = model ? new Set(model.endpoints.map((endpoint) => endpoint.id)) : null; const laneIds = model ? new Set(model.roads.flatMap((road) => Array.from({ length: road.laneCount }, (_, index) => `lane:${road.id}:${index + 1}`))) : null; const segmentIds = model ? new Set(model.roads.map((road) => road.segmentId)) : null; + const sets = { roadIds, directionalRoadIds, endpointIds, laneIds, segmentIds }; + const kept = []; + const stale = []; for (const item of value.overrides) { if (!item || typeof item.id !== "string" || !item.id || ids.has(item.id)) throw new Error("Each override needs a unique id."); ids.add(item.id); + if (options.skipStaleTargets) { + const target = staleOverrideTarget(item, sets); + if (target) { stale.push({ id: item.id, kind: item.kind, target }); continue; } + } if (item.kind === "road") { if (typeof item.roadId !== "string" || roadIds && !roadIds.has(item.roadId)) throw new Error(`Unknown road override target: ${item.roadId}`); for (const key of ["widthMeters", "laneCount"]) if (item[key] !== undefined && (!Number.isFinite(item[key]) || item[key] <= 0 || (key === "laneCount" && !Number.isInteger(item[key])))) throw new Error(`Invalid road override ${key}.`); @@ -181,8 +207,9 @@ function validateOverrides(value, model) { } else if (item.kind === "edge-line-style") { if (typeof item.roadId !== "string" || (directionalRoadIds && !directionalRoadIds.has(item.roadId)) || !["left", "right"].includes(item.side) || !CENTER_LINE_COLORS.has(item.color) || !CENTER_LINE_PATTERNS.has(item.pattern)) throw new Error("Invalid edge line style override."); } else throw new Error(`Unsupported override kind: ${item.kind}`); + kept.push(item); } - return { schema: OVERRIDE_SCHEMA, overrides: value.overrides }; + return { schema: OVERRIDE_SCHEMA, overrides: kept, stale }; } function applyRoadOverrides(road, overrides, diagnostics) { diff --git a/scripts/test-native-road.js b/scripts/test-native-road.js index b065e1f..9b8f54a 100644 --- a/scripts/test-native-road.js +++ b/scripts/test-native-road.js @@ -379,6 +379,20 @@ const laneOverrides = validateOverrides({ schema: "native-road-overrides/v1", ov assert.equal(compileGeometry(turnModel, laneOverrides).connectors.features.length, 0); assert.equal(compileGeometry(turnModel, laneOverrides).movements.length, 0); assert.throws(() => validateOverrides({ schema: "native-road-overrides/v1", overrides: [{ id: "bad", kind: "road", roadId: "missing", widthMeters: 4 }] }, initial), /Unknown road/); +// Editing OSM retires ids. Saving such a reference is still an error, but a +// consumer may ask to skip it so one stale entry cannot block the whole compile. +const staleDoc = { schema: "native-road-overrides/v1", overrides: [ + { id: "stale-road", kind: "road", roadId: "road:way/does-not-exist:forward", widthMeters: 4 }, + { id: "live-road", kind: "road", roadId: target.id, widthMeters: 9 }, +] }; +assert.throws(() => validateOverrides(staleDoc, initial), /Unknown road/); +const skipped = validateOverrides(staleDoc, initial, { skipStaleTargets: true }); +assert.equal(skipped.overrides.length, 1); +assert.equal(skipped.overrides[0].id, "live-road"); +assert.deepEqual(skipped.stale.map((item) => item.id), ["stale-road"]); +assert.equal(skipped.stale[0].target, "road:way/does-not-exist:forward"); +// Skipping only forgives missing targets; a malformed entry still throws. +assert.throws(() => validateOverrides({ schema: "native-road-overrides/v1", overrides: [{ id: "bad-width", kind: "road", roadId: target.id, widthMeters: -1 }] }, initial, { skipStaleTargets: true }), /Invalid road override/); const freshArea = fs.mkdtempSync(path.join(os.tmpdir(), "native-road-fresh-area-")); try { const input = path.join(freshArea, "input.osm");