mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-05 18:05:42 +02:00
More changing accessors to methods
This commit is contained in:
+105
-96
@@ -397,7 +397,15 @@ struct reader {
|
|||||||
char *pmtiles_map = NULL;
|
char *pmtiles_map = NULL;
|
||||||
std::vector<pmtiles::entry_zxy> pmtiles_entries;
|
std::vector<pmtiles::entry_zxy> pmtiles_entries;
|
||||||
|
|
||||||
|
std::pair<zxy, std::string> current() {
|
||||||
|
return std::pair<zxy, std::string>(zxy(zoom, x, y), data);
|
||||||
|
}
|
||||||
|
|
||||||
void advance() {
|
void advance() {
|
||||||
|
if (zoom > maxzoom_so_far) {
|
||||||
|
maxzoom_so_far = zoom;
|
||||||
|
}
|
||||||
|
|
||||||
if (db != NULL) {
|
if (db != NULL) {
|
||||||
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
zoom = sqlite3_column_int(stmt, 0);
|
zoom = sqlite3_column_int(stmt, 0);
|
||||||
@@ -504,6 +512,46 @@ struct reader {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string retrieve_overzoom(zxy tile) {
|
||||||
|
// lock around sqlite3 access
|
||||||
|
static pthread_mutex_t retrieve_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
|
zxy parent_tile = tile;
|
||||||
|
while (parent_tile.z > maxzoom_so_far) {
|
||||||
|
parent_tile.z--;
|
||||||
|
parent_tile.x /= 2;
|
||||||
|
parent_tile.y /= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pthread_mutex_lock(&retrieve_lock) != 0) {
|
||||||
|
perror("pthread_mutex_lock");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string source = get_tile(parent_tile);
|
||||||
|
|
||||||
|
if (pthread_mutex_unlock(&retrieve_lock) != 0) {
|
||||||
|
perror("pthread_mutex_unlock");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (source.size() != 0) {
|
||||||
|
std::string ret = overzoom(source, parent_tile.z, parent_tile.x, parent_tile.y, tile.z, tile.x, tile.y, -1, buffer, std::set<std::string>());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void close() {
|
||||||
|
if (pmtiles_map) {
|
||||||
|
db = pmtilesmeta2tmp(name.c_str(), pmtiles_map);
|
||||||
|
// json, strategies
|
||||||
|
} else if (db == NULL) {
|
||||||
|
db = dirmeta2tmp(dirbase.c_str());
|
||||||
|
} else {
|
||||||
|
sqlite3_finalize(stmt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
reader(const char *fname) {
|
reader(const char *fname) {
|
||||||
name = fname;
|
name = fname;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
@@ -522,7 +570,7 @@ struct reader {
|
|||||||
perror("mmap in decode");
|
perror("mmap in decode");
|
||||||
exit(EXIT_MEMORY);
|
exit(EXIT_MEMORY);
|
||||||
}
|
}
|
||||||
if (close(pmtiles_fd) != 0) {
|
if (::close(pmtiles_fd) != 0) {
|
||||||
perror("close");
|
perror("close");
|
||||||
exit(EXIT_CLOSE);
|
exit(EXIT_CLOSE);
|
||||||
}
|
}
|
||||||
@@ -565,35 +613,6 @@ struct reader *begin_reading(char *fname) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string retrieve_overzoom(struct reader *r, zxy tile) {
|
|
||||||
// lock around sqlite3 access
|
|
||||||
static pthread_mutex_t retrieve_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
||||||
|
|
||||||
zxy parent_tile = tile;
|
|
||||||
while (parent_tile.z > r->maxzoom_so_far) {
|
|
||||||
parent_tile.z--;
|
|
||||||
parent_tile.x /= 2;
|
|
||||||
parent_tile.y /= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pthread_mutex_lock(&retrieve_lock) != 0) {
|
|
||||||
perror("pthread_mutex_lock");
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string source = r->get_tile(parent_tile);
|
|
||||||
|
|
||||||
if (pthread_mutex_unlock(&retrieve_lock) != 0) {
|
|
||||||
perror("pthread_mutex_unlock");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (source.size() != 0) {
|
|
||||||
std::string ret = overzoom(source, parent_tile.z, parent_tile.x, parent_tile.y, tile.z, tile.x, tile.y, -1, buffer, std::set<std::string>());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
struct arg {
|
struct arg {
|
||||||
std::map<zxy, std::vector<std::string>> inputs{};
|
std::map<zxy, std::vector<std::string>> inputs{};
|
||||||
std::map<zxy, std::string> outputs{};
|
std::map<zxy, std::string> outputs{};
|
||||||
@@ -625,7 +644,7 @@ void *join_worker(void *v) {
|
|||||||
// it is a candidate for overzooming this tile from whatever
|
// it is a candidate for overzooming this tile from whatever
|
||||||
// zoom level it did produce last.
|
// zoom level it did produce last.
|
||||||
|
|
||||||
std::string overzoomed = retrieve_overzoom(r, ai->first);
|
std::string overzoomed = r->retrieve_overzoom(ai->first);
|
||||||
if (overzoomed.size() != 0) {
|
if (overzoomed.size() != 0) {
|
||||||
ai->second.push_back(overzoomed);
|
ai->second.push_back(overzoomed);
|
||||||
}
|
}
|
||||||
@@ -839,22 +858,20 @@ void decode(struct reader *readers, std::map<std::string, layermap_entry> &layer
|
|||||||
readers = readers->next;
|
readers = readers->next;
|
||||||
r->next = NULL;
|
r->next = NULL;
|
||||||
|
|
||||||
if (r->zoom != zoom_for_bbox) {
|
std::pair<zxy, std::string> current = r->current();
|
||||||
|
|
||||||
|
if (current.first.z != zoom_for_bbox) {
|
||||||
// Only use highest zoom for bbox calculation
|
// Only use highest zoom for bbox calculation
|
||||||
// to avoid z0 always covering the world
|
// to avoid z0 always covering the world
|
||||||
|
|
||||||
minlat = minlon = minlon2 = INT_MAX;
|
minlat = minlon = minlon2 = INT_MAX;
|
||||||
maxlat = maxlon = maxlon2 = INT_MIN;
|
maxlat = maxlon = maxlon2 = INT_MIN;
|
||||||
zoom_for_bbox = r->zoom;
|
zoom_for_bbox = current.first.z;
|
||||||
}
|
|
||||||
|
|
||||||
if (r->zoom > r->maxzoom_so_far) {
|
|
||||||
r->maxzoom_so_far = r->zoom;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double lat1, lon1, lat2, lon2;
|
double lat1, lon1, lat2, lon2;
|
||||||
tile2lonlat(r->x, r->y, r->zoom, &lon1, &lat1);
|
tile2lonlat(current.first.x, current.first.y, current.first.z, &lon1, &lat1);
|
||||||
tile2lonlat(r->x + 1, r->y + 1, r->zoom, &lon2, &lat2);
|
tile2lonlat(current.first.x + 1, current.first.y + 1, current.first.z, &lon2, &lat2);
|
||||||
minlat = min(lat2, minlat);
|
minlat = min(lat2, minlat);
|
||||||
minlon = min(lon1, minlon);
|
minlon = min(lon1, minlon);
|
||||||
maxlat = max(lat1, maxlat);
|
maxlat = max(lat1, maxlat);
|
||||||
@@ -868,16 +885,16 @@ void decode(struct reader *readers, std::map<std::string, layermap_entry> &layer
|
|||||||
minlon2 = min(lon1, minlon2);
|
minlon2 = min(lon1, minlon2);
|
||||||
maxlon2 = max(lon2, maxlon2);
|
maxlon2 = max(lon2, maxlon2);
|
||||||
|
|
||||||
if (r->zoom >= minzoom && r->zoom <= maxzoom) {
|
if (current.first.z >= minzoom && current.first.z <= maxzoom) {
|
||||||
zxy tile = zxy(r->zoom, r->x, r->y);
|
zxy tile = current.first;
|
||||||
if (tasks.count(tile) == 0) {
|
if (tasks.count(tile) == 0) {
|
||||||
tasks.insert(std::pair<zxy, std::vector<std::string>>(tile, std::vector<std::string>()));
|
tasks.insert(std::pair<zxy, std::vector<std::string>>(tile, std::vector<std::string>()));
|
||||||
}
|
}
|
||||||
auto f = tasks.find(tile);
|
auto f = tasks.find(tile);
|
||||||
f->second.push_back(r->data);
|
f->second.push_back(current.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (readers == NULL || readers->zoom != r->zoom || readers->x != r->x || readers->y != r->y) {
|
if (readers == NULL || readers->zoom != current.first.z || readers->x != current.first.x || readers->y != current.first.y) {
|
||||||
if (tasks.size() > 100 * CPUS) {
|
if (tasks.size() > 100 * CPUS) {
|
||||||
dispatch_tasks(tasks, layermaps, outdb, outdir, header, mapping, exclude, include, ifmatched, keep_layers, remove_layers, filter, readers);
|
dispatch_tasks(tasks, layermaps, outdb, outdir, header, mapping, exclude, include, ifmatched, keep_layers, remove_layers, filter, readers);
|
||||||
tasks.clear();
|
tasks.clear();
|
||||||
@@ -919,27 +936,19 @@ void decode(struct reader *readers, std::map<std::string, layermap_entry> &layer
|
|||||||
struct reader *next;
|
struct reader *next;
|
||||||
for (struct reader *r = readers; r != NULL; r = next) {
|
for (struct reader *r = readers; r != NULL; r = next) {
|
||||||
next = r->next;
|
next = r->next;
|
||||||
|
r->close();
|
||||||
|
|
||||||
sqlite3 *db = r->db;
|
sqlite3_stmt *stmt;
|
||||||
if (r->pmtiles_map) {
|
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'minzoom'", -1, &stmt, NULL) == SQLITE_OK) {
|
||||||
db = pmtilesmeta2tmp(r->name.c_str(), r->pmtiles_map);
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
// json, strategies
|
int minz = max(sqlite3_column_int(stmt, 0), minzoom);
|
||||||
} else if (db == NULL) {
|
|
||||||
db = dirmeta2tmp(r->dirbase.c_str());
|
|
||||||
} else {
|
|
||||||
sqlite3_finalize(r->stmt);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'minzoom'", -1, &r->stmt, NULL) == SQLITE_OK) {
|
|
||||||
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
|
|
||||||
int minz = max(sqlite3_column_int(r->stmt, 0), minzoom);
|
|
||||||
st->minzoom = min(st->minzoom, minz);
|
st->minzoom = min(st->minzoom, minz);
|
||||||
}
|
}
|
||||||
sqlite3_finalize(r->stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'maxzoom'", -1, &r->stmt, NULL) == SQLITE_OK) {
|
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'maxzoom'", -1, &stmt, NULL) == SQLITE_OK) {
|
||||||
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
int maxz = min(sqlite3_column_int(r->stmt, 0), maxzoom);
|
int maxz = min(sqlite3_column_int(stmt, 0), maxzoom);
|
||||||
|
|
||||||
if (!want_overzoom) {
|
if (!want_overzoom) {
|
||||||
if (st->maxzoom >= 0 && maxz != st->maxzoom) {
|
if (st->maxzoom >= 0 && maxz != st->maxzoom) {
|
||||||
@@ -949,38 +958,38 @@ void decode(struct reader *readers, std::map<std::string, layermap_entry> &layer
|
|||||||
|
|
||||||
st->maxzoom = max(st->maxzoom, maxz);
|
st->maxzoom = max(st->maxzoom, maxz);
|
||||||
}
|
}
|
||||||
sqlite3_finalize(r->stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'center'", -1, &r->stmt, NULL) == SQLITE_OK) {
|
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'center'", -1, &stmt, NULL) == SQLITE_OK) {
|
||||||
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
|
const unsigned char *s = sqlite3_column_text(stmt, 0);
|
||||||
if (s != NULL) {
|
if (s != NULL) {
|
||||||
sscanf((char *) s, "%lf,%lf", &st->midlon, &st->midlat);
|
sscanf((char *) s, "%lf,%lf", &st->midlon, &st->midlat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3_finalize(r->stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'attribution'", -1, &r->stmt, NULL) == SQLITE_OK) {
|
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'attribution'", -1, &stmt, NULL) == SQLITE_OK) {
|
||||||
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
|
const unsigned char *s = sqlite3_column_text(stmt, 0);
|
||||||
if (s != NULL) {
|
if (s != NULL) {
|
||||||
attribution = std::string((char *) s);
|
attribution = std::string((char *) s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3_finalize(r->stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'description'", -1, &r->stmt, NULL) == SQLITE_OK) {
|
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'description'", -1, &stmt, NULL) == SQLITE_OK) {
|
||||||
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
|
const unsigned char *s = sqlite3_column_text(stmt, 0);
|
||||||
if (s != NULL) {
|
if (s != NULL) {
|
||||||
description = std::string((char *) s);
|
description = std::string((char *) s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3_finalize(r->stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'name'", -1, &r->stmt, NULL) == SQLITE_OK) {
|
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'name'", -1, &stmt, NULL) == SQLITE_OK) {
|
||||||
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
|
const unsigned char *s = sqlite3_column_text(stmt, 0);
|
||||||
if (s != NULL) {
|
if (s != NULL) {
|
||||||
if (name.size() == 0) {
|
if (name.size() == 0) {
|
||||||
name = std::string((char *) s);
|
name = std::string((char *) s);
|
||||||
@@ -992,11 +1001,11 @@ void decode(struct reader *readers, std::map<std::string, layermap_entry> &layer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3_finalize(r->stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'bounds'", -1, &r->stmt, NULL) == SQLITE_OK) {
|
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'bounds'", -1, &stmt, NULL) == SQLITE_OK) {
|
||||||
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
|
const unsigned char *s = sqlite3_column_text(stmt, 0);
|
||||||
if (s != NULL) {
|
if (s != NULL) {
|
||||||
if (sscanf((char *) s, "%lf,%lf,%lf,%lf", &minlon, &minlat, &maxlon, &maxlat) == 4) {
|
if (sscanf((char *) s, "%lf,%lf,%lf,%lf", &minlon, &minlat, &maxlon, &maxlat) == 4) {
|
||||||
st->minlon = min(minlon, st->minlon);
|
st->minlon = min(minlon, st->minlon);
|
||||||
@@ -1006,11 +1015,11 @@ void decode(struct reader *readers, std::map<std::string, layermap_entry> &layer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3_finalize(r->stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'json'", -1, &r->stmt, NULL) == SQLITE_OK) {
|
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'json'", -1, &stmt, NULL) == SQLITE_OK) {
|
||||||
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
|
const unsigned char *s = sqlite3_column_text(stmt, 0);
|
||||||
|
|
||||||
if (s != NULL) {
|
if (s != NULL) {
|
||||||
json_pull *jp = json_begin_string((const char *) s);
|
json_pull *jp = json_begin_string((const char *) s);
|
||||||
@@ -1027,11 +1036,11 @@ void decode(struct reader *readers, std::map<std::string, layermap_entry> &layer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlite3_finalize(r->stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'generator_options'", -1, &r->stmt, NULL) == SQLITE_OK) {
|
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'generator_options'", -1, &stmt, NULL) == SQLITE_OK) {
|
||||||
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
|
const unsigned char *s = sqlite3_column_text(stmt, 0);
|
||||||
if (s != NULL) {
|
if (s != NULL) {
|
||||||
if (generator_options.size() != 0) {
|
if (generator_options.size() != 0) {
|
||||||
generator_options.append("; ");
|
generator_options.append("; ");
|
||||||
@@ -1041,19 +1050,19 @@ void decode(struct reader *readers, std::map<std::string, layermap_entry> &layer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3_finalize(r->stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'strategies'", -1, &r->stmt, NULL) == SQLITE_OK) {
|
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'strategies'", -1, &stmt, NULL) == SQLITE_OK) {
|
||||||
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
|
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||||
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
|
const unsigned char *s = sqlite3_column_text(stmt, 0);
|
||||||
handle_strategies(s, strategies);
|
handle_strategies(s, strategies);
|
||||||
}
|
}
|
||||||
sqlite3_finalize(r->stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Closes either real db or temp mirror of metadata.json
|
// Closes either real r->db or temp mirror of metadata.json
|
||||||
if (sqlite3_close(db) != SQLITE_OK) {
|
if (sqlite3_close(r->db) != SQLITE_OK) {
|
||||||
fprintf(stderr, "Could not close database: %s\n", sqlite3_errmsg(db));
|
fprintf(stderr, "Could not close database: %s\n", sqlite3_errmsg(r->db));
|
||||||
exit(EXIT_CLOSE);
|
exit(EXIT_CLOSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user