From a37fc361c22fec8a0a165abdf1a9d0b3d2476713 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Mon, 19 Sep 2016 16:02:14 -0700 Subject: [PATCH] Merge tiles and layers. Differing extents not handled yet. --- tile-join.cpp | 66 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/tile-join.cpp b/tile-join.cpp index 38d0646..2853433 100644 --- a/tile-join.cpp +++ b/tile-join.cpp @@ -25,9 +25,8 @@ struct stats { double minlat, minlon, maxlat, maxlon; }; -void handle(std::string message, int z, unsigned x, unsigned y, std::vector > &file_keys, std::vector &layernames, int *nlayers, sqlite3 *outdb, std::vector &header, std::map > &mapping, std::set &exclude, int ifmatched) { +void handle(std::string message, int z, unsigned x, unsigned y, std::vector > &file_keys, std::vector &layernames, int *nlayers, sqlite3 *outdb, std::vector &header, std::map > &mapping, std::set &exclude, int ifmatched, mvt_tile &outtile) { mvt_tile tile; - mvt_tile outtile; int features_added = 0; if (!tile.decode(message)) { @@ -37,11 +36,28 @@ void handle(std::string message, int z, unsigned x, unsigned y, std::vector 500000) { - fprintf(stderr, "Tile %d/%u/%u size is %lld, >500000. Skipping this tile\n.", z, x, y, (long long) compressed.size()); - return; - } - - mbtiles_write_tile(outdb, z, x, y, compressed.data(), compressed.size()); } double min(double a, double b) { @@ -268,13 +273,38 @@ struct reader *begin_reading(char *fname) { } void decode(struct reader *readers, char *map, std::vector > &file_keys, std::vector &layernames, int *nlayers, sqlite3 *outdb, struct stats *st, std::vector &header, std::map > &mapping, std::set &exclude, int ifmatched, std::string &attribution) { + mvt_tile tile; + while (readers != NULL && readers->zoom < 32) { reader *r = readers; readers = readers->next; r->next = NULL; fprintf(stderr, "%lld/%lld/%lld \r", r->zoom, r->x, r->y); - handle(std::string(r->data, r->len), r->zoom, r->x, r->y, file_keys, layernames, nlayers, outdb, header, mapping, exclude, ifmatched); + handle(std::string(r->data, r->len), r->zoom, r->x, r->y, file_keys, layernames, nlayers, outdb, header, mapping, exclude, ifmatched, tile); + + if (readers == NULL || readers->zoom != r->zoom || readers->x != r->x || readers->y != r->y) { + bool anything = false; + for (size_t i = 0; i < tile.layers.size(); i++) { + if (tile.layers[i].features.size() > 0) { + anything = true; + break; + } + } + + if (anything) { + std::string compressed = tile.encode(); + + if (compressed.size() > 500000) { + fprintf(stderr, "Tile %lld/%lld/%lld size is %lld, >500000. Skipping this tile\n.", r->zoom, r->x, r->y, (long long) compressed.size()); + } else { + mbtiles_write_tile(outdb, r->zoom, r->x, r->y, compressed.data(), compressed.size()); + } + } + + tile = mvt_tile(); + } + if (sqlite3_step(r->stmt) == SQLITE_ROW) { r->zoom = sqlite3_column_int(r->stmt, 0); r->x = sqlite3_column_int(r->stmt, 1);