From 5b9f11dd91da1a3f928e2177466323372d800026 Mon Sep 17 00:00:00 2001 From: Mikko Haavisto Date: Fri, 8 Dec 2023 11:31:11 +0200 Subject: [PATCH 1/3] filter motorway classes correctly --- src/main/java/io/sharedstreets/tools/builder/ProcessPBF.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/sharedstreets/tools/builder/ProcessPBF.java b/src/main/java/io/sharedstreets/tools/builder/ProcessPBF.java index 7b5ba48..744649d 100644 --- a/src/main/java/io/sharedstreets/tools/builder/ProcessPBF.java +++ b/src/main/java/io/sharedstreets/tools/builder/ProcessPBF.java @@ -149,7 +149,7 @@ else if(roadClass.intValue() == Way.ROAD_CLASS.ClassTrunk.getValue()) filteredClasses.add(Way.ROAD_CLASS.ClassTrunk); else if(roadClass.intValue() == Way.ROAD_CLASS.ClassMotorway.getValue()) - filteredClasses.add(Way.ROAD_CLASS.ClassUnclassified); + filteredClasses.add(Way.ROAD_CLASS.ClassMotorway); else if(roadClass.intValue() == Way.ROAD_CLASS.ClassResidential.getValue()) filteredClasses.add(Way.ROAD_CLASS.ClassResidential); From 5eb89935e9bd08622c53283088fffd5c27d5a8db Mon Sep 17 00:00:00 2001 From: Mikko Haavisto Date: Fri, 8 Dec 2023 11:31:36 +0200 Subject: [PATCH 2/3] if mixed segment make segment class equal lowest class --- .../data/SharedStreetsOSMMetadata.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/sharedstreets/data/SharedStreetsOSMMetadata.java b/src/main/java/io/sharedstreets/data/SharedStreetsOSMMetadata.java index 09e7d94..6fd3b5d 100644 --- a/src/main/java/io/sharedstreets/data/SharedStreetsOSMMetadata.java +++ b/src/main/java/io/sharedstreets/data/SharedStreetsOSMMetadata.java @@ -160,8 +160,17 @@ public Way.ROAD_CLASS getRoadClass() { for(WaySectionMetadata waySection : this.waySections) { if(roadClass == null || roadClass == waySection.roadClass) roadClass = waySection.roadClass; - else { - roadClass = Way.ROAD_CLASS.ClassOther; + + // if mixed segment make segment class equal lowest class + // per https://github.com/sharedstreets/sharedstreets-ref-system/issues/20#issuecomment-378079937 + // [excluded road] + // | + // [highway=primary] | [highway=secondary] + // ====================*===================== + // [roadClass=secondary] + + else if(waySection.roadClass.getValue() > roadClass.getValue()){ + roadClass = waySection.roadClass; break; } } From 03ebf79caed227a98fd30af40c43803469085fb1 Mon Sep 17 00:00:00 2001 From: Mikko Haavisto Date: Fri, 8 Dec 2023 11:32:08 +0200 Subject: [PATCH 3/3] can't merge primary road classes with other road classes --- .../tools/builder/model/BaseSegment.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/io/sharedstreets/tools/builder/model/BaseSegment.java b/src/main/java/io/sharedstreets/tools/builder/model/BaseSegment.java index 6cd763e..895001a 100644 --- a/src/main/java/io/sharedstreets/tools/builder/model/BaseSegment.java +++ b/src/main/java/io/sharedstreets/tools/builder/model/BaseSegment.java @@ -49,6 +49,20 @@ public static boolean canMerge(BaseSegment baseSegment1, BaseSegment baseSegment return false; } + // can't merge primary road classes with other road classes + // + // Motivation: + // We're merging aggressively, and creating mixed roadClass references to prevent poorly mapped OSM ways getting + // split up when they should be a contiguous reference. However, primary roads are often mapped with better quality + // and it makes sense to handle start/end of motorway/trunk roads properly. + + int baseSegment1RoadClass = baseSegment1.getRoadClass().getValue(); + int baseSegment2RoadClass = baseSegment2.getRoadClass().getValue(); + int roadClassMergeThreshold = Way.ROAD_CLASS.ClassPrimary.getValue(); + if(baseSegment1RoadClass != baseSegment2RoadClass && (baseSegment1RoadClass <= roadClassMergeThreshold || baseSegment2RoadClass <= roadClassMergeThreshold)) + return false; + + // check for duplicates-- need to catch circular segments (they appear mergable) if(baseSegment1.waySections.length == baseSegment2.waySections.length) { boolean duplicate = true;