--- a/src/main/java/org/openmaptiles/layers/Transportation.java +++ b/src/main/java/org/openmaptiles/layers/Transportation.java @@ -200,7 +200,8 @@ entry(FieldValues.CLASS_SERVICE, 13), entry(FieldValues.CLASS_MINOR, 13), entry(FieldValues.CLASS_RACEWAY, 12), - entry(FieldValues.CLASS_TERTIARY, 11), + // OpenRydr: tertiary at z9 (stock 11) so a town's street grid isn't holey at overview zoom. + entry(FieldValues.CLASS_TERTIARY, 9), entry(FieldValues.CLASS_BUSWAY, 11), entry(FieldValues.CLASS_BUS_GUIDEWAY, 11), entry(FieldValues.CLASS_SECONDARY, 9), @@ -208,6 +209,18 @@ entry(FieldValues.CLASS_TRUNK, 6), entry(FieldValues.CLASS_MOTORWAY, 4) ); + } + + /** + * OpenRydr: the OSM {@code maxspeed} tag for the app's speed-limit badge — EXPLICIT mph values only, + * normalized to "55 mph". The app ignores everything else (a bare US "35" is usually a mis-tagged + * mph value, so it is never converted from km/h), so dropping it here keeps those lines merging. + * maxspeed:advisory is deliberately NOT used. + */ + private static String maxspeed(String value) { + if (value == null) return null; + var m = java.util.regex.Pattern.compile("^(\\d{1,3})\\s*mph$").matcher(value.trim().toLowerCase(java.util.Locale.ROOT)); + return m.matches() ? m.group(1) + " mph" : null; } /** Returns a value for {@code surface} tag constrained to a small set of known values from raw OSM data. */ @@ -535,6 +548,12 @@ .setAttrWithMinzoom(Fields.SERVICE, service, 12) .setAttrWithMinzoom(Fields.ONEWAY, nullIfInt(element.isOneway(), 0), 12) .setAttrWithMinzoom(Fields.SURFACE, surface(coalesce(element.surface(), element.tracktype())), 12) + // OpenRydr: z13+ only (the app reads it at nav zoom, which overzooms z14), so lower zooms merge as stock. + .setAttrWithMinzoom("maxspeed", maxspeed(element.source().getTag("maxspeed") instanceof Object v ? v.toString() : null), 13) + // OpenRydr: road name + ref at z13+ for the app's Record Ride current-road badge, read from these same + // rendered lines as maxspeed (stock keeps names only in transportation_name, label lines). z13+ only. + .setAttrWithMinzoom("name", element.name() == null || element.name().isBlank() ? null : element.name(), 13) + .setAttrWithMinzoom("ref", element.ref() == null || element.ref().isBlank() ? null : element.ref(), 13) .setMinPixelSize(0) // merge during post-processing, then limit by size .setSortKey(element.zOrder()) .setMinZoom(minzoom); @@ -577,7 +596,8 @@ if ("pier".equals(element.manMade())) { minzoom = 13; } else if (isResidentialOrUnclassified(highway)) { - minzoom = 12; + // OpenRydr: residential/unclassified at z9 (stock 12) — visible by ~z9.5 (maptiler.md target). + minzoom = 9; } else { String baseClass = highwayClass.replace("_construction", ""); minzoom = switch (baseClass) {