diff --git a/tile.cpp b/tile.cpp index d96a2b0c..edb49dcf 100644 --- a/tile.cpp +++ b/tile.cpp @@ -557,7 +557,7 @@ int manage_gap(unsigned long long index, unsigned long long *previndex, double s return 0; } -long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *stringpool, int z, unsigned tx, unsigned ty, int detail, int min_detail, int basezoom, std::vector *layernames, sqlite3 *outdb, double droprate, int buffer, const char *fname, FILE **geomfile, int minzoom, int maxzoom, double todo, volatile long long *along, long long alongminus, double gamma, int nlayers, int child_shards, long long *meta_off, long long *pool_off, unsigned *initial_x, unsigned *initial_y, volatile int *running, double simplification, std::vector > *layermaps) { +long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *stringpool, int z, unsigned tx, unsigned ty, int detail, int min_detail, int basezoom, std::vector *layernames, sqlite3 *outdb, double droprate, int buffer, const char *fname, FILE **geomfile, int minzoom, int maxzoom, double todo, volatile long long *along, long long alongminus, double gamma, int nlayers, int child_shards, long long *meta_off, long long *pool_off, unsigned *initial_x, unsigned *initial_y, volatile int *running, double simplification, std::vector> *layermaps, std::vector> *layer_unmaps) { int line_detail; double fraction = 1; @@ -608,7 +608,7 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s long long unclipped_features = 0; std::vector partials; - std::vector > features; + std::vector> features; for (int i = 0; i < nlayers; i++) { features.push_back(std::vector()); } @@ -927,6 +927,8 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s c.id = partials[i].id; c.has_id = partials[i].has_id; + // printf("segment %d layer %lld is %s\n", partials[i].segment, partials[i].layer, (*layer_unmaps)[partials[i].segment][partials[i].layer].c_str()); + features[layer].push_back(c); } } @@ -1155,7 +1157,8 @@ struct write_tile_args { unsigned *initial_y; volatile int *running; int err; - std::vector > *layermaps; + std::vector> *layermaps; + std::vector> *layer_unmaps; }; void *run_thread(void *vargs) { @@ -1196,7 +1199,7 @@ void *run_thread(void *vargs) { // fprintf(stderr, "%d/%u/%u\n", z, x, y); - long long len = write_tile(geom, &geompos, arg->metabase, arg->stringpool, z, x, y, z == arg->maxzoom ? arg->full_detail : arg->low_detail, arg->min_detail, arg->basezoom, arg->layernames, arg->outdb, arg->droprate, arg->buffer, arg->fname, arg->geomfile, arg->minzoom, arg->maxzoom, arg->todo, arg->along, geompos, arg->gamma, arg->nlayers, arg->child_shards, arg->meta_off, arg->pool_off, arg->initial_x, arg->initial_y, arg->running, arg->simplification, arg->layermaps); + long long len = write_tile(geom, &geompos, arg->metabase, arg->stringpool, z, x, y, z == arg->maxzoom ? arg->full_detail : arg->low_detail, arg->min_detail, arg->basezoom, arg->layernames, arg->outdb, arg->droprate, arg->buffer, arg->fname, arg->geomfile, arg->minzoom, arg->maxzoom, arg->todo, arg->along, geompos, arg->gamma, arg->nlayers, arg->child_shards, arg->meta_off, arg->pool_off, arg->initial_x, arg->initial_y, arg->running, arg->simplification, arg->layermaps, arg->layer_unmaps); if (len < 0) { int *err = &arg->err; @@ -1247,7 +1250,20 @@ void *run_thread(void *vargs) { return NULL; } -int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpool, unsigned *midx, unsigned *midy, std::vector &layernames, int maxzoom, int minzoom, int basezoom, sqlite3 *outdb, double droprate, int buffer, const char *fname, const char *tmpdir, double gamma, int nlayers, int full_detail, int low_detail, int min_detail, long long *meta_off, long long *pool_off, unsigned *initial_x, unsigned *initial_y, double simplification, std::vector > &layermaps) { +int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpool, unsigned *midx, unsigned *midy, std::vector &layernames, int maxzoom, int minzoom, int basezoom, sqlite3 *outdb, double droprate, int buffer, const char *fname, const char *tmpdir, double gamma, int nlayers, int full_detail, int low_detail, int min_detail, long long *meta_off, long long *pool_off, unsigned *initial_x, unsigned *initial_y, double simplification, std::vector> &layermaps) { + // Table to map segment and layer number back to layer name + std::vector> layer_unmaps; + for (size_t seg = 0; seg < layermaps.size(); seg++) { + layer_unmaps.push_back(std::vector()); + + for (auto a = layermaps[seg].begin(); a != layermaps[seg].end(); ++a) { + if (a->second.id >= layer_unmaps[seg].size()) { + layer_unmaps[seg].resize(a->second.id + 1); + } + layer_unmaps[seg][a->second.id] = a->first; + } + } + int i; for (i = 0; i <= maxzoom; i++) { long long most = 0; @@ -1384,6 +1400,7 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpo args[thread].initial_x = initial_x; args[thread].initial_y = initial_y; args[thread].layermaps = &layermaps; + args[thread].layer_unmaps = &layer_unmaps; args[thread].tasks = dispatches[thread].tasks; args[thread].running = &running;