From e958f1adf9dd041e582a47b7ab28e93051941103 Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Wed, 21 Dec 2022 14:58:49 +0800 Subject: [PATCH] tile-join reads and writes pmtiles. [#10] --- Makefile | 2 +- tile-join.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 9133e9fb..6e298538 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,7 @@ tippecanoe-enumerate: enumerate.o tippecanoe-decode: decode.o projection.o mvt.o write_json.o text.o jsonpull/jsonpull.o dirtiles.o pmtiles_file.o $(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -tile-join: tile-join.o projection.o pool.o mbtiles.o mvt.o memfile.o dirtiles.o jsonpull/jsonpull.o text.o evaluator.o csv.o write_json.o +tile-join: tile-join.o projection.o pool.o mbtiles.o mvt.o memfile.o dirtiles.o jsonpull/jsonpull.o text.o evaluator.o csv.o write_json.o pmtiles_file.o $(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread tippecanoe-json-tool: jsontool.o jsonpull/jsonpull.o csv.o text.o geojson-loop.o diff --git a/tile-join.cpp b/tile-join.cpp index 4814ea7d..90cef59a 100644 --- a/tile-join.cpp +++ b/tile-join.cpp @@ -5,6 +5,8 @@ #define _DEFAULT_SOURCE #include +#include +#include #include #include #include @@ -27,6 +29,7 @@ #include "mbtiles.hpp" #include "geometry.hpp" #include "dirtiles.hpp" +#include "pmtiles_file.hpp" #include "evaluator.hpp" #include "csv.hpp" #include "text.hpp" @@ -373,6 +376,9 @@ struct reader { sqlite3_stmt *stmt = NULL; struct reader *next = NULL; + char *pmtiles_map = NULL; + std::vector pmtiles_entries; + bool operator<(const struct reader &r) const { if (zoom < r.zoom) { return true; @@ -427,6 +433,32 @@ struct reader *begin_reading(char *fname) { r->dirtiles.erase(r->dirtiles.begin()); } + } else if (pmtiles_has_suffix(fname)) { + int pmtiles_fd = open(fname, O_RDONLY | O_CLOEXEC); + r->pmtiles_map = (char *) mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, pmtiles_fd, 0); + + if (r->pmtiles_map == MAP_FAILED) { + perror("mmap in decode"); + exit(EXIT_MEMORY); + } + if (close(pmtiles_fd) != 0) { + perror("close"); + exit(EXIT_CLOSE); + } + + r->pmtiles_entries = pmtiles_entries_tms(r->pmtiles_map, minzoom, maxzoom); + std::reverse(r->pmtiles_entries.begin(), r->pmtiles_entries.end()); + + if (r->pmtiles_entries.size() == 0) { + r->zoom = 32; + } else { + r->zoom = r->pmtiles_entries.back().z; + r->x = r->pmtiles_entries.back().x; + r->y = r->pmtiles_entries.back().y; + r->sorty = (1LL << r->zoom) - 1 - r->y; + } + r->data = std::string(r->pmtiles_map + r->pmtiles_entries.back().offset, r->pmtiles_entries.back().length); + r->pmtiles_entries.pop_back(); } else { sqlite3 *db; @@ -736,6 +768,18 @@ void decode(struct reader *readers, std::map &layer } else { r->zoom = 32; } + } else if (r->pmtiles_map != NULL) { + if (r->pmtiles_entries.size() == 0) { + r->zoom = 32; + } else { + r->zoom = r->pmtiles_entries.back().z; + r->x = r->pmtiles_entries.back().x; + r->y = r->pmtiles_entries.back().y; + r->sorty = (1LL << r->zoom) - 1 - r->y; + r->data = std::string(r->pmtiles_map + r->pmtiles_entries.back().offset, r->pmtiles_entries.back().length); + + r->pmtiles_entries.pop_back(); + } } else { if (r->dirtiles.size() == 0) { r->zoom = 32; @@ -775,7 +819,10 @@ void decode(struct reader *readers, std::map &layer next = r->next; sqlite3 *db = r->db; - if (db == NULL) { + if (r->pmtiles_map) { + db = pmtilesmeta2tmp(r->name.c_str(), r->pmtiles_map); + // json, strategies + } else if (db == NULL) { db = dirmeta2tmp(r->dirbase.c_str()); } else { sqlite3_finalize(r->stmt); @@ -1141,7 +1188,12 @@ int main(int argc, char **argv) { if (out_mbtiles != NULL) { if (force) { unlink(out_mbtiles); + } else { + if (pmtiles_has_suffix(out_mbtiles)) { + check_pmtiles(out_mbtiles, argv); + } } + outdb = mbtiles_open(out_mbtiles, argv, 0); } if (out_dir != NULL) { @@ -1220,5 +1272,9 @@ int main(int argc, char **argv) { json_free(filter); } + if (pmtiles_has_suffix(out_mbtiles)) { + mbtiles_map_image_to_pmtiles(out_mbtiles, m, !pC, quiet, false); + } + return 0; }