diff --git a/geojson.c b/geojson.c index 4887bfb..261c779 100644 --- a/geojson.c +++ b/geojson.c @@ -194,7 +194,7 @@ struct pool_val *deserialize_string(char **f, struct pool *p, int type) { return ret; } -int traverse_zooms(int geomfd[4], off_t geom_size[4], char *metabase, unsigned *file_bbox, struct pool **file_keys, unsigned *midx, unsigned *midy, const char *layername, int maxzoom, int minzoom, sqlite3 *outdb, double droprate, int buffer, const char *fname, const char *tmpdir, double gamma, int nlayers) { +int traverse_zooms(int geomfd[4], off_t geom_size[4], char *metabase, unsigned *file_bbox, struct pool **file_keys, unsigned *midx, unsigned *midy, char **layernames, int maxzoom, int minzoom, sqlite3 *outdb, double droprate, int buffer, const char *fname, const char *tmpdir, double gamma, int nlayers) { int i; for (i = 0; i <= maxzoom; i++) { long long most = 0; @@ -255,7 +255,7 @@ int traverse_zooms(int geomfd[4], off_t geom_size[4], char *metabase, unsigned * // fprintf(stderr, "%d/%u/%u\n", z, x, y); - long long len = write_tile(&geom, metabase, file_bbox, z, x, y, z == maxzoom ? full_detail : low_detail, maxzoom, file_keys, layername, outdb, droprate, buffer, fname, sub, minzoom, maxzoom, todo, geomstart, along, gamma, nlayers); + long long len = write_tile(&geom, metabase, file_bbox, z, x, y, z == maxzoom ? full_detail : low_detail, maxzoom, file_keys, layernames, outdb, droprate, buffer, fname, sub, minzoom, maxzoom, todo, geomstart, along, gamma, nlayers); if (len < 0) { return i - 1; @@ -881,7 +881,7 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max fprintf(stderr, "%lld features, %lld bytes of geometry, %lld bytes of metadata\n", seq, (long long) geomst.st_size, (long long) metast.st_size); - int written = traverse_zooms(fd, size, meta, file_bbox, file_keys, &midx, &midy, layername, maxzoom, minzoom, outdb, droprate, buffer, fname, tmpdir, gamma, nlayers); + int written = traverse_zooms(fd, size, meta, file_bbox, file_keys, &midx, &midy, layernames, maxzoom, minzoom, outdb, droprate, buffer, fname, tmpdir, gamma, nlayers); if (maxzoom != written) { fprintf(stderr, "\n\n\n*** NOTE TILES ONLY COMPLETE THROUGH ZOOM %d ***\n\n\n", written); diff --git a/tile.cc b/tile.cc index 18dc145..ed98192 100644 --- a/tile.cc +++ b/tile.cc @@ -214,52 +214,56 @@ void decode_meta(char **meta, struct pool *keys, struct pool *values, struct poo } } -mapnik::vector::tile create_tile(const char *layername, int line_detail, std::vector &features, long long *count, struct pool *keys, struct pool *values) { +mapnik::vector::tile create_tile(char **layernames, int line_detail, std::vector > &features, long long *count, struct pool **keys, struct pool **values, int nlayers) { mapnik::vector::tile tile; - mapnik::vector::tile_layer *layer = tile.add_layers(); - layer->set_name(layername); - layer->set_version(1); - layer->set_extent(1 << line_detail); + int i; + for (i = 0; i < nlayers; i++) { + mapnik::vector::tile_layer *layer = tile.add_layers(); - unsigned x; - for (x = 0; x < features.size(); x++) { - if (features[x].type == VT_LINE || features[x].type == VT_POLYGON) { - features[x].geom = remove_noop(features[x].geom, features[x].type); + layer->set_name(layernames[i]); + layer->set_version(1); + layer->set_extent(1 << line_detail); + + unsigned x; + for (x = 0; x < features[i].size(); x++) { + if (features[i][x].type == VT_LINE || features[i][x].type == VT_POLYGON) { + features[i][x].geom = remove_noop(features[i][x].geom, features[i][x].type); + } + + mapnik::vector::tile_feature *feature = layer->add_features(); + + if (features[i][x].type == VT_POINT) { + feature->set_type(mapnik::vector::tile::Point); + } else if (features[i][x].type == VT_LINE) { + feature->set_type(mapnik::vector::tile::LineString); + } else if (features[i][x].type == VT_POLYGON) { + feature->set_type(mapnik::vector::tile::Polygon); + } else { + feature->set_type(mapnik::vector::tile::Unknown); + } + + to_feature(features[i][x].geom, feature); + *count += features[i][x].geom.size(); + + unsigned y; + for (y = 0; y < features[i][x].meta.size(); y++) { + feature->add_tags(features[i][x].meta[y]); + } } - mapnik::vector::tile_feature *feature = layer->add_features(); - - if (features[x].type == VT_POINT) { - feature->set_type(mapnik::vector::tile::Point); - } else if (features[x].type == VT_LINE) { - feature->set_type(mapnik::vector::tile::LineString); - } else if (features[x].type == VT_POLYGON) { - feature->set_type(mapnik::vector::tile::Polygon); - } else { - feature->set_type(mapnik::vector::tile::Unknown); + struct pool_val *pv; + for (pv = keys[i]->head; pv != NULL; pv = pv->next) { + layer->add_keys(pv->s, strlen(pv->s)); } + for (pv = values[i]->head; pv != NULL; pv = pv->next) { + mapnik::vector::tile_value *tv = layer->add_values(); - to_feature(features[x].geom, feature); - *count += features[x].geom.size(); - - unsigned y; - for (y = 0; y < features[x].meta.size(); y++) { - feature->add_tags(features[x].meta[y]); - } - } - - struct pool_val *pv; - for (pv = keys->head; pv != NULL; pv = pv->next) { - layer->add_keys(pv->s, strlen(pv->s)); - } - for (pv = values->head; pv != NULL; pv = pv->next) { - mapnik::vector::tile_value *tv = layer->add_values(); - - if (pv->type == VT_NUMBER) { - tv->set_double_value(atof(pv->s)); - } else { - tv->set_string_value(pv->s); + if (pv->type == VT_NUMBER) { + tv->set_double_value(atof(pv->s)); + } else { + tv->set_string_value(pv->s); + } } } @@ -284,6 +288,7 @@ struct sll { } }; +#if 0 void evaluate(std::vector &features, char *metabase, struct pool *file_keys, const char *layername, int line_detail, long long orig) { std::vector options; @@ -302,7 +307,7 @@ void evaluate(std::vector &features, char *metabase, struct pool *file } std::vector empty; - mapnik::vector::tile tile = create_tile(layername, line_detail, empty, &count, &keys, &values); + mapnik::vector::tile tile = create_tile(layername, line_detail, empty, &count, &keys, &values, 1); // XXX layer std::string s; std::string compressed; @@ -329,7 +334,7 @@ void evaluate(std::vector &features, char *metabase, struct pool *file long long count = 0; std::vector empty; - mapnik::vector::tile tile = create_tile(layername, line_detail, features, &count, &keys, &values); + mapnik::vector::tile tile = create_tile(layername, line_detail, features, &count, &keys, &values, nlayers); std::string s; std::string compressed; @@ -341,8 +346,9 @@ void evaluate(std::vector &features, char *metabase, struct pool *file pool_free(&values); pool_free(&keys); } +#endif -long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, unsigned tx, unsigned ty, int detail, int basezoom, struct pool **file_keys, const char *layername, sqlite3 *outdb, double droprate, int buffer, const char *fname, FILE *geomfile[4], int file_minzoom, int file_maxzoom, double todo, char *geomstart, long long along, double gamma, int nlayers) { +long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, unsigned tx, unsigned ty, int detail, int basezoom, struct pool **file_keys, char **layernames, sqlite3 *outdb, double droprate, int buffer, const char *fname, FILE *geomfile[4], int file_minzoom, int file_maxzoom, double todo, char *geomstart, long long along, double gamma, int nlayers) { int line_detail; static bool evaluated = false; double oprogress = 0; @@ -352,11 +358,15 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u for (line_detail = detail; line_detail >= MIN_DETAIL || line_detail == detail; line_detail--) { GOOGLE_PROTOBUF_VERIFY_VERSION; - struct pool keys[nlayers], values[nlayers]; + struct pool keys1[nlayers], values1[nlayers]; + struct pool *keys[nlayers], *values[nlayers]; int i; for (i = 0; i < nlayers; i++) { - pool_init(&keys[i], 0); - pool_init(&values[i], 0); + pool_init(&keys1[i], 0); + pool_init(&values1[i], 0); + + keys[i] = &keys1[i]; + values[i] = &values1[i]; } long long count = 0; @@ -583,7 +593,7 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u c.metasrc = meta; c.coalesced = false; - decode_meta(&meta, &keys[layer], &values[layer], file_keys[layer], &c.meta, NULL); + decode_meta(&meta, keys[layer], values[layer], file_keys[layer], &c.meta, NULL); features[layer].push_back(c); } } @@ -640,12 +650,12 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u return -1; } - mapnik::vector::tile tile = create_tile(layername, line_detail, features[0], &count, &keys[0], &values[0]); // XXX layer + mapnik::vector::tile tile = create_tile(layernames, line_detail, features, &count, keys, values, nlayers); int i; for (i = 0; i < nlayers; i++) { - pool_free(&keys[i]); - pool_free(&values[i]); + pool_free(&keys1[i]); + pool_free(&values1[i]); } std::string s; @@ -659,7 +669,9 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u if (line_detail == MIN_DETAIL || !evaluated) { evaluated = true; +#if 0 evaluate(features[0], metabase, file_keys[0], layername, line_detail, compressed.size()); // XXX layer +#endif } } else { mbtiles_write_tile(outdb, z, tx, ty, compressed.data(), compressed.size()); diff --git a/tile.h b/tile.h index 02d825a..0ab429b 100644 --- a/tile.h +++ b/tile.h @@ -25,4 +25,4 @@ void deserialize_uint(char **f, unsigned *n); void deserialize_byte(char **f, signed char *n); struct pool_val *deserialize_string(char **f, struct pool *p, int type); -long long write_tile(char **geom, char *metabase, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int basezoom, struct pool **file_keys, const char *layername, sqlite3 *outdb, double droprate, int buffer, const char *fname, FILE *geomfile[4], int file_minzoom, int file_maxzoom, double todo, char *geomstart, long long along, double gamma, int nlayers); +long long write_tile(char **geom, char *metabase, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int basezoom, struct pool **file_keys, char **layernames, sqlite3 *outdb, double droprate, int buffer, const char *fname, FILE *geomfile[4], int file_minzoom, int file_maxzoom, double todo, char *geomstart, long long along, double gamma, int nlayers);