From 6a27c19c6b7671228bf1ed5e7228a1baac5e2153 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Wed, 13 Jun 2018 15:59:52 -0700 Subject: [PATCH] Trim away unused features and layers from sub-tiles --- vt3.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/vt3.cpp b/vt3.cpp index 1dd99c8..d87ee6f 100644 --- a/vt3.cpp +++ b/vt3.cpp @@ -114,7 +114,7 @@ static std::vector remove_noop(std::vector geom, std std::vector out; for (size_t i = 0; i < geom.size(); i++) { - if (geom[i].op == mvt_moveto && i + 1 < geom.size() && geom[i + 1].op == mvt_moveto) { + if (geom[i].op == mvt_moveto && (i + 1 >= geom.size() || geom[i + 1].op == mvt_moveto)) { if (geom[i].id != 0) { #if 0 fprintf(stderr, "Removing a moveto with an id %ld\n", geom[i].id); @@ -320,6 +320,24 @@ void split_feature(mvt_layer const &layer, mvt_feature const &feature, std::vect } } +void trim_tile(mvt_tile &tile) { + for (ssize_t i = tile.layers.size() - 1; i >= 0; i--) { + mvt_layer &layer = tile.layers[i]; + + for (ssize_t j = layer.features.size() - 1; j >= 0; j--) { + mvt_feature &feature = layer.features[j]; + + if (feature.geometry.size() == 0) { + layer.features.erase(layer.features.begin() + j); + } + } + + if (layer.features.size() == 0) { + tile.layers.erase(tile.layers.begin() + i); + } + } +} + mvt_tile split_and_merge(mvt_tile tile, int tile_zoom) { // Features will be split into an NxN grid of sub-tiles, // to be merged back together at the end, @@ -368,6 +386,12 @@ mvt_tile split_and_merge(mvt_tile tile, int tile_zoom) { // Trim unused features from layers, layers from tiles + for (size_t x = 0; x < n; x++) { + for (size_t y = 0; y < n; y++) { + trim_tile(subtiles[x][y]); + } + } + // Write each tile to PBF // Decode each tile back from PBF