From bd07d834557025669c43c6c9e9bc25505e818957 Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Thu, 28 Mar 2024 12:45:10 -0700 Subject: [PATCH 1/9] 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 --- .../java/com/protomaps/basemap/Basemap.java | 8 +++- .../protomaps/basemap/layers/Landcover.java | 40 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java diff --git a/tiles/src/main/java/com/protomaps/basemap/Basemap.java b/tiles/src/main/java/com/protomaps/basemap/Basemap.java index becfb165..d7c4987a 100644 --- a/tiles/src/main/java/com/protomaps/basemap/Basemap.java +++ b/tiles/src/main/java/com/protomaps/basemap/Basemap.java @@ -9,6 +9,7 @@ import com.protomaps.basemap.layers.Buildings; import com.protomaps.basemap.layers.Earth; import com.protomaps.basemap.layers.Landuse; +import com.protomaps.basemap.layers.Landcover; import com.protomaps.basemap.layers.Natural; import com.protomaps.basemap.layers.PhysicalLine; import com.protomaps.basemap.layers.PhysicalPoint; @@ -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); @@ -127,7 +132,8 @@ 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..52eb0a58 --- /dev/null +++ b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java @@ -0,0 +1,40 @@ +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; + +public class Landcover implements ForwardingProfile.FeaturePostProcessor { + + public void processLandcover(SourceFeature sf, FeatureCollector features) { + String kind = sf.getString("class"); + if (kind.equals("urban")) kind = "urban_area"; + if (kind.equals("crop")) kind = "farmland"; + if (kind.equals("grass")) kind = "grassland"; + if (kind.equals("trees")) kind = "forest"; + if (kind.equals("snow")) kind = "glacier"; + if (kind.equals("shrub")) kind = "scrub"; + // barren is passed through + + 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; + } +} From 48b2050b0e4da952568ffd49006ee83cc6b6b7d7 Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Thu, 28 Mar 2024 12:50:13 -0700 Subject: [PATCH 2/9] formatting --- .../java/com/protomaps/basemap/Basemap.java | 5 +++-- .../protomaps/basemap/layers/Landcover.java | 19 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/tiles/src/main/java/com/protomaps/basemap/Basemap.java b/tiles/src/main/java/com/protomaps/basemap/Basemap.java index d7c4987a..9406e8fd 100644 --- a/tiles/src/main/java/com/protomaps/basemap/Basemap.java +++ b/tiles/src/main/java/com/protomaps/basemap/Basemap.java @@ -8,8 +8,8 @@ import com.protomaps.basemap.layers.Boundaries; import com.protomaps.basemap.layers.Buildings; import com.protomaps.basemap.layers.Earth; -import com.protomaps.basemap.layers.Landuse; import com.protomaps.basemap.layers.Landcover; +import com.protomaps.basemap.layers.Landuse; import com.protomaps.basemap.layers.Natural; import com.protomaps.basemap.layers.PhysicalLine; import com.protomaps.basemap.layers.PhysicalPoint; @@ -133,7 +133,8 @@ static void run(Arguments args) throws Exception { "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") - .addGeoPackageSource("landcover", sourcesDir.resolve("daylight-landcover.gpkg"), "https://r2-public.protomaps.com/datasets/daylight-landcover.gpkg"); + .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 index 52eb0a58..ec11550c 100644 --- a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java +++ b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java @@ -6,19 +6,24 @@ import com.onthegomap.planetiler.geo.GeometryException; import com.onthegomap.planetiler.reader.SourceFeature; import com.protomaps.basemap.feature.FeatureId; - import java.util.List; public class Landcover implements ForwardingProfile.FeaturePostProcessor { public void processLandcover(SourceFeature sf, FeatureCollector features) { String kind = sf.getString("class"); - if (kind.equals("urban")) kind = "urban_area"; - if (kind.equals("crop")) kind = "farmland"; - if (kind.equals("grass")) kind = "grassland"; - if (kind.equals("trees")) kind = "forest"; - if (kind.equals("snow")) kind = "glacier"; - if (kind.equals("shrub")) kind = "scrub"; + if (kind.equals("urban")) + kind = "urban_area"; + if (kind.equals("crop")) + kind = "farmland"; + if (kind.equals("grass")) + kind = "grassland"; + if (kind.equals("trees")) + kind = "forest"; + if (kind.equals("snow")) + kind = "glacier"; + if (kind.equals("shrub")) + kind = "scrub"; // barren is passed through features.polygon(this.name()) From 0f8d2f19d9bf409a3b1cfbbe6071fa7de2f19678 Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Sat, 6 Apr 2024 10:26:29 -0700 Subject: [PATCH 3/9] tests --- .../protomaps/basemap/layers/Landcover.java | 1 - .../basemap/layers/LandcoverTest.java | 35 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tiles/src/test/java/com/protomaps/basemap/layers/LandcoverTest.java diff --git a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java index ec11550c..0f1f6c35 100644 --- a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java +++ b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java @@ -24,7 +24,6 @@ public void processLandcover(SourceFeature sf, FeatureCollector features) { kind = "glacier"; if (kind.equals("shrub")) kind = "scrub"; - // barren is passed through features.polygon(this.name()) .setId(FeatureId.create(sf)) 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..9abca9f2 --- /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; + +public 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 + ))); + } +} From bb0a77fea204f08e242c1f4a6f048cd966c1533f Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Sat, 6 Apr 2024 10:35:03 -0700 Subject: [PATCH 4/9] refactor --- .../protomaps/basemap/layers/Landcover.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java index 0f1f6c35..357b99a9 100644 --- a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java +++ b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java @@ -12,18 +12,25 @@ public class Landcover implements ForwardingProfile.FeaturePostProcessor { public void processLandcover(SourceFeature sf, FeatureCollector features) { String kind = sf.getString("class"); - if (kind.equals("urban")) - kind = "urban_area"; - if (kind.equals("crop")) - kind = "farmland"; - if (kind.equals("grass")) - kind = "grassland"; - if (kind.equals("trees")) - kind = "forest"; - if (kind.equals("snow")) - kind = "glacier"; - if (kind.equals("shrub")) - kind = "scrub"; + switch (kind) { + case "urban": + kind = "urban_area"; + break; + case "crop": + kind = "farmland"; + break; + case "grass": + kind = "grassland"; + break; + case "trees": + kind = "forest"; + break; + case "snow": + kind = "glacier"; + break; + case "shrub": + kind = "scrub"; + } features.polygon(this.name()) .setId(FeatureId.create(sf)) From cfcd9304e1bd637b507d222fe6f8627cfeafe24f Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Sat, 6 Apr 2024 10:41:28 -0700 Subject: [PATCH 5/9] linting --- tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java | 2 ++ .../test/java/com/protomaps/basemap/layers/LandcoverTest.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java index 357b99a9..0f755881 100644 --- a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java +++ b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java @@ -30,6 +30,8 @@ public void processLandcover(SourceFeature sf, FeatureCollector features) { break; case "shrub": kind = "scrub"; + default: + break; } features.polygon(this.name()) diff --git a/tiles/src/test/java/com/protomaps/basemap/layers/LandcoverTest.java b/tiles/src/test/java/com/protomaps/basemap/layers/LandcoverTest.java index 9abca9f2..a326bd25 100644 --- a/tiles/src/test/java/com/protomaps/basemap/layers/LandcoverTest.java +++ b/tiles/src/test/java/com/protomaps/basemap/layers/LandcoverTest.java @@ -9,7 +9,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -public class LandcoverTest extends LayerTest { +class LandcoverTest extends LayerTest { @ParameterizedTest @CsvSource(value = { From 89ba11901b5dfdb2916d8be4c0c187e0856b1bac Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Sat, 6 Apr 2024 10:48:03 -0700 Subject: [PATCH 6/9] linting --- tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java index 0f755881..3255beee 100644 --- a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java +++ b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java @@ -30,6 +30,7 @@ public void processLandcover(SourceFeature sf, FeatureCollector features) { break; case "shrub": kind = "scrub"; + break; default: break; } From e1fa73989b85a044e02093c07459bdee204904dc Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Sat, 6 Apr 2024 10:54:09 -0700 Subject: [PATCH 7/9] linting --- .../protomaps/basemap/layers/Landcover.java | 28 ++++--------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java index 3255beee..e4cbd810 100644 --- a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java +++ b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java @@ -7,33 +7,15 @@ 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 { + final static 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 = sf.getString("class"); - switch (kind) { - case "urban": - kind = "urban_area"; - break; - case "crop": - kind = "farmland"; - break; - case "grass": - kind = "grassland"; - break; - case "trees": - kind = "forest"; - break; - case "snow": - kind = "glacier"; - break; - case "shrub": - kind = "scrub"; - break; - default: - break; - } + String kind = kindMapping.getOrDefault(sf.getString("class"), "unknown"); features.polygon(this.name()) .setId(FeatureId.create(sf)) From 8955dcd86fbd21f681bb2e416e8e6261bffc40c8 Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Sat, 6 Apr 2024 10:57:38 -0700 Subject: [PATCH 8/9] more linting --- tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java index e4cbd810..565e79d7 100644 --- a/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java +++ b/tiles/src/main/java/com/protomaps/basemap/layers/Landcover.java @@ -11,7 +11,7 @@ public class Landcover implements ForwardingProfile.FeaturePostProcessor { - final static Map kindMapping = Map.of("urban", "urban_area", "crop", "farmland", "grass", "grassland", + 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) { From 04fe41a08f4e1a85cfa9116466a91be3a7e584c7 Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Sat, 6 Apr 2024 11:02:08 -0700 Subject: [PATCH 9/9] tiles 3.5.0, changelog --- CHANGELOG.md | 4 ++++ tiles/src/main/java/com/protomaps/basemap/Basemap.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) 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 9406e8fd..865b93ba 100644 --- a/tiles/src/main/java/com/protomaps/basemap/Basemap.java +++ b/tiles/src/main/java/com/protomaps/basemap/Basemap.java @@ -96,7 +96,7 @@ public String description() { @Override public String version() { - return "3.4.1"; + return "3.5.0"; } @Override