From 650f68455e314545ddc45b1de97f916e4b156ede Mon Sep 17 00:00:00 2001 From: Michael Barry Date: Thu, 27 Jan 2022 06:14:37 -0500 Subject: [PATCH] Fix pedestrian area multipolygons (#63) --- .../basemap/layers/Transportation.java | 5 ++-- .../basemap/layers/AbstractLayerTest.java | 11 +++++++ .../basemap/layers/TransportationTest.java | 29 +++++++++++++++++-- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/onthegomap/planetiler/basemap/layers/Transportation.java b/src/main/java/com/onthegomap/planetiler/basemap/layers/Transportation.java index 3f116c1..2d9da5e 100644 --- a/src/main/java/com/onthegomap/planetiler/basemap/layers/Transportation.java +++ b/src/main/java/com/onthegomap/planetiler/basemap/layers/Transportation.java @@ -513,8 +513,9 @@ public class Transportation implements public void process(Tables.OsmHighwayPolygon element, FeatureCollector features) { String manMade = element.manMade(); if (isBridgeOrPier(manMade) || - // ignore underground pedestrian areas - (element.isArea() && element.layer() >= 0)) { + // only allow closed ways where area=yes, and multipolygons + // and ignore underground pedestrian areas + (!element.source().canBeLine() && element.layer() >= 0)) { String highwayClass = highwayClass(element.highway(), element.publicTransport(), null, element.manMade()); if (highwayClass != null) { features.polygon(LAYER_NAME).setBufferPixels(BUFFER_SIZE) diff --git a/src/test/java/com/onthegomap/planetiler/basemap/layers/AbstractLayerTest.java b/src/test/java/com/onthegomap/planetiler/basemap/layers/AbstractLayerTest.java index d40a902..2ecfae6 100644 --- a/src/test/java/com/onthegomap/planetiler/basemap/layers/AbstractLayerTest.java +++ b/src/test/java/com/onthegomap/planetiler/basemap/layers/AbstractLayerTest.java @@ -131,6 +131,17 @@ public abstract class AbstractLayerTest { ); } + SourceFeature closedWayFeature(Map props) { + return SimpleFeature.createFakeOsmFeature( + newLineString(0, 0, 1, 0, 1, 1, 0, 1, 0, 0), + new HashMap<>(props), + OSM_SOURCE, + null, + 0, + null + ); + } + SourceFeature polygonFeatureWithArea(double area, Map props) { return SimpleFeature.create( GeoUtils.worldToLatLonCoords(rectangle(0, Math.sqrt(area))), diff --git a/src/test/java/com/onthegomap/planetiler/basemap/layers/TransportationTest.java b/src/test/java/com/onthegomap/planetiler/basemap/layers/TransportationTest.java index 04fb63f..28d24fd 100644 --- a/src/test/java/com/onthegomap/planetiler/basemap/layers/TransportationTest.java +++ b/src/test/java/com/onthegomap/planetiler/basemap/layers/TransportationTest.java @@ -990,7 +990,7 @@ public class TransportationTest extends AbstractLayerTest { @Test public void testPedestrianArea() { - assertFeatures(10, List.of(Map.of( + Map pedestrianArea = Map.of( "_layer", "transportation", "class", "path", "subclass", "pedestrian", @@ -998,13 +998,36 @@ public class TransportationTest extends AbstractLayerTest { "_minzoom", 13, "_maxzoom", 14, "_type", "polygon" - )), process(polygonFeature(Map.of( + ); + Map circularPath = Map.of( + "_layer", "transportation", + "class", "path", + "subclass", "pedestrian", + + "_minzoom", 14, + "_maxzoom", 14, + "_type", "line" + ); + assertFeatures(14, List.of(pedestrianArea), process(closedWayFeature(Map.of( "highway", "pedestrian", "area", "yes", "foot", "yes" )))); + assertFeatures(14, List.of(pedestrianArea), process(polygonFeature(Map.of( + "highway", "pedestrian", + "foot", "yes" + )))); + assertFeatures(14, List.of(circularPath), process(closedWayFeature(Map.of( + "highway", "pedestrian", + "foot", "yes" + )))); + assertFeatures(14, List.of(circularPath), process(closedWayFeature(Map.of( + "highway", "pedestrian", + "foot", "yes", + "area", "no" + )))); // ignore underground pedestrian areas - assertFeatures(10, List.of(), + assertFeatures(14, List.of(), process(polygonFeature(Map.of( "highway", "pedestrian", "area", "yes",