From 16777e4dfae36993d54e8bca2a14075af1fbda11 Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Sat, 6 Apr 2024 11:04:19 -0700 Subject: [PATCH] add daylight landcover to tileset [#154] (#228) * add daylight landcover to tileset [#154] * Use geopackage mirror of daylight dataset from https://daylightmap.org/2023/10/11/landcover.html * remap daylight classes to tilezen-like kinds * tiles 3.5.0, changelog --- CHANGELOG.md | 4 +++ .../java/com/protomaps/basemap/Basemap.java | 11 ++++-- .../protomaps/basemap/layers/Landcover.java | 36 +++++++++++++++++++ .../basemap/layers/LandcoverTest.java | 35 ++++++++++++++++++ 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java create mode 100644 tiles/src/test/java/com/protomaps/basemap/layers/LandcoverTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index c224a914..03c7a387 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +Tiles v3.5.0 +------ +- Add Daylight Landcover from zooms 0-7. [#154] + Tiles v3.4.1 ------ - Improve boundaries generalization [#200] diff --git a/tiles/src/main/java/com/protomaps/basemap/Basemap.java b/tiles/src/main/java/com/protomaps/basemap/Basemap.java index becfb165..865b93ba 100644 --- a/tiles/src/main/java/com/protomaps/basemap/Basemap.java +++ b/tiles/src/main/java/com/protomaps/basemap/Basemap.java @@ -8,6 +8,7 @@ import com.protomaps.basemap.layers.Boundaries; import com.protomaps.basemap.layers.Buildings; import com.protomaps.basemap.layers.Earth; +import com.protomaps.basemap.layers.Landcover; import com.protomaps.basemap.layers.Landuse; import com.protomaps.basemap.layers.Natural; import com.protomaps.basemap.layers.PhysicalLine; @@ -37,6 +38,10 @@ public Basemap(NaturalEarthDb naturalEarthDb, QrankDb qrankDb) { registerHandler(landuse); registerSourceHandler("osm", landuse); + var landcover = new Landcover(); + registerHandler(landcover); + registerSourceHandler("landcover", landcover::processLandcover); + var natural = new Natural(); registerHandler(natural); registerSourceHandler("osm", natural); @@ -91,7 +96,7 @@ public String description() { @Override public String version() { - return "3.4.1"; + return "3.5.0"; } @Override @@ -127,7 +132,9 @@ static void run(Arguments args) throws Exception { .addShapefileSource("osm_water", sourcesDir.resolve("water-polygons-split-3857.zip"), "https://osmdata.openstreetmap.de/download/water-polygons-split-3857.zip") .addShapefileSource("osm_land", sourcesDir.resolve("land-polygons-split-3857.zip"), - "https://osmdata.openstreetmap.de/download/land-polygons-split-3857.zip"); + "https://osmdata.openstreetmap.de/download/land-polygons-split-3857.zip") + .addGeoPackageSource("landcover", sourcesDir.resolve("daylight-landcover.gpkg"), + "https://r2-public.protomaps.com/datasets/daylight-landcover.gpkg"); // Downloader.create(planetiler.config()).add("ne", neUrl, nePath) // .add("qrank", "https://qrank.wmcloud.org/download/qrank.csv.gz", sourcesDir.resolve("qrank.csv.gz")).run(); diff --git a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java new file mode 100644 index 00000000..565e79d7 --- /dev/null +++ b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java @@ -0,0 +1,36 @@ +package com.protomaps.basemap.layers; + +import com.onthegomap.planetiler.FeatureCollector; +import com.onthegomap.planetiler.ForwardingProfile; +import com.onthegomap.planetiler.VectorTile; +import com.onthegomap.planetiler.geo.GeometryException; +import com.onthegomap.planetiler.reader.SourceFeature; +import com.protomaps.basemap.feature.FeatureId; +import java.util.List; +import java.util.Map; + +public class Landcover implements ForwardingProfile.FeaturePostProcessor { + + static final Map kindMapping = Map.of("urban", "urban_area", "crop", "farmland", "grass", "grassland", + "trees", "forest", "snow", "glacier", "shrub", "scrub", "barren", "barren"); + + public void processLandcover(SourceFeature sf, FeatureCollector features) { + String kind = kindMapping.getOrDefault(sf.getString("class"), "unknown"); + + features.polygon(this.name()) + .setId(FeatureId.create(sf)) + .setAttr("pmap:kind", kind) + .setZoomRange(0, 7) + .setMinPixelSize(0.0); + } + + @Override + public String name() { + return "landcover"; + } + + @Override + public List postProcess(int zoom, List items) throws GeometryException { + return items; + } +} diff --git a/tiles/src/test/java/com/protomaps/basemap/layers/LandcoverTest.java b/tiles/src/test/java/com/protomaps/basemap/layers/LandcoverTest.java new file mode 100644 index 00000000..a326bd25 --- /dev/null +++ b/tiles/src/test/java/com/protomaps/basemap/layers/LandcoverTest.java @@ -0,0 +1,35 @@ +package com.protomaps.basemap.layers; + +import static com.onthegomap.planetiler.TestUtils.newPolygon; + +import com.onthegomap.planetiler.reader.SimpleFeature; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class LandcoverTest extends LayerTest { + + @ParameterizedTest + @CsvSource(value = { + "urban,urban_area", + "crop,farmland", + "grass,grassland", + "trees,forest", + "snow,glacier", + "shrub,scrub", + "barren,barren" + }) + void simple(String daylightClassString, String expectedString) { + assertFeatures(7, + List.of(Map.of("pmap:kind", expectedString)), + process(SimpleFeature.create( + newPolygon(0, 0, 0, 1, 1, 1, 0, 0), + new HashMap<>(Map.of("class", daylightClassString)), + "landcover", + null, + 0 + ))); + } +}