From 67d9876134f5f307163256bd4d3014211ce57780 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Thu, 7 Aug 2025 18:47:45 -0700 Subject: [PATCH 1/3] feat: Add Bicycle parking nodes to the map --- .../java/org/transitopia/layers/Cycling.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/org/transitopia/layers/Cycling.java b/src/main/java/org/transitopia/layers/Cycling.java index 32b41c4..ab7496c 100644 --- a/src/main/java/org/transitopia/layers/Cycling.java +++ b/src/main/java/org/transitopia/layers/Cycling.java @@ -22,6 +22,8 @@ public class Cycling implements private double BUFFER_SIZE = 4.0; // When zoomed out more than this, don't encode details of the cycling paths (makes tiles too big) private int MIN_ZOOM_ATTR = 13; + // Hide things like bike parking areas below this zoom level. + private int MIN_ZOOM_DETAILS = 12; private static final String LAYER_NAME = "transitopia_cycling"; // Minimum lengths for coalescing paths together at specific zoom levels private static final ZoomFunction.MeterToPixelThresholds MIN_LENGTH = ZoomFunction.meterThresholds() @@ -207,7 +209,24 @@ else if (feature.hasTag("highway") && !feature.hasTag("oneway", "yes") && newLine.setAttrWithMinzoom("routes", routeIdsString, MIN_ZOOM_ATTR); } } + } else if (feature.isPoint()) { + if (feature.hasTag("amenity", "bicycle_parking")) { + features.point(LAYER_NAME) + .setAttr("amenity", "bicycle_parking") + .setAttr("name", feature.getTag("name")) + .setAttr("operator", feature.getTag("operator")) + .setAttr("indoor", feature.getTag("indoor")) + .setAttr("access", feature.getTag("access")) // TODO: validate, rstrict to private/customers/members + .setAttr("capacity", feature.getTag("capacity")) + .setAttr("bicycle_parking", feature.getTag("bicycle_parking")) // TODO: validate and ignore if not a known value + .setAttr("covered", feature.getTag("covered")) + .setAttr("cyclestreets_id", feature.getTag("cyclestreets_id")) + .setAttr("fee", feature.getTag("fee")) + .setMinZoom(MIN_ZOOM_DETAILS); + } + // TODO: amenity=kick-scooter_parking } + // TODO: area versions of the point features like parking. } private record RouteRelationInfo(long id) implements OsmRelationInfo { From 8ec2601bbea83c4d9953f7bbe350e5e1d92b8bed Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Sat, 9 Aug 2025 17:05:31 -0700 Subject: [PATCH 2/3] feat: don't include details that we don't need to render the map --- src/main/java/org/transitopia/layers/Cycling.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/org/transitopia/layers/Cycling.java b/src/main/java/org/transitopia/layers/Cycling.java index ab7496c..02b8ad2 100644 --- a/src/main/java/org/transitopia/layers/Cycling.java +++ b/src/main/java/org/transitopia/layers/Cycling.java @@ -214,17 +214,9 @@ else if (feature.hasTag("highway") && !feature.hasTag("oneway", "yes") && features.point(LAYER_NAME) .setAttr("amenity", "bicycle_parking") .setAttr("name", feature.getTag("name")) - .setAttr("operator", feature.getTag("operator")) - .setAttr("indoor", feature.getTag("indoor")) - .setAttr("access", feature.getTag("access")) // TODO: validate, rstrict to private/customers/members - .setAttr("capacity", feature.getTag("capacity")) - .setAttr("bicycle_parking", feature.getTag("bicycle_parking")) // TODO: validate and ignore if not a known value - .setAttr("covered", feature.getTag("covered")) - .setAttr("cyclestreets_id", feature.getTag("cyclestreets_id")) - .setAttr("fee", feature.getTag("fee")) + .setAttr("osmNodeId", feature.id()) .setMinZoom(MIN_ZOOM_DETAILS); } - // TODO: amenity=kick-scooter_parking } // TODO: area versions of the point features like parking. } From cf061b184e10e3ce0f762fcb6eb19d80e9bab506 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Sun, 10 Aug 2025 16:12:00 -0700 Subject: [PATCH 3/3] feat: find bike parking areas too, not just nodes --- src/main/java/org/transitopia/layers/Cycling.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/transitopia/layers/Cycling.java b/src/main/java/org/transitopia/layers/Cycling.java index 02b8ad2..43e8a11 100644 --- a/src/main/java/org/transitopia/layers/Cycling.java +++ b/src/main/java/org/transitopia/layers/Cycling.java @@ -210,6 +210,7 @@ else if (feature.hasTag("highway") && !feature.hasTag("oneway", "yes") && } } } else if (feature.isPoint()) { + // Find bike rack/parking nodes if (feature.hasTag("amenity", "bicycle_parking")) { features.point(LAYER_NAME) .setAttr("amenity", "bicycle_parking") @@ -218,7 +219,17 @@ else if (feature.hasTag("highway") && !feature.hasTag("oneway", "yes") && .setMinZoom(MIN_ZOOM_DETAILS); } } - // TODO: area versions of the point features like parking. + + if (feature.canBePolygon()) { + // Find bike rack/parking areas, e.g. https://www.openstreetmap.org/way/697625710 + if (feature.hasTag("amenity", "bicycle_parking")) { + features.centroid(LAYER_NAME) + .setAttr("amenity", "bicycle_parking") + .setAttr("name", feature.getTag("name")) + .setAttr("osmWayId", feature.id()) + .setMinZoom(MIN_ZOOM_DETAILS); + } + } } private record RouteRelationInfo(long id) implements OsmRelationInfo {