From c9e542e688c072879e190df7d0731656bb811b5b Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Mon, 4 Apr 2016 11:18:37 -0700 Subject: [PATCH] Keep meta count inline to avoid thrash if no attributes --- geojson.c | 4 +++- tile.cc | 16 +++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/geojson.c b/geojson.c index c2e8023f..87474cf1 100644 --- a/geojson.c +++ b/geojson.c @@ -562,7 +562,6 @@ int serialize_geometry(json_object *geometry, json_object *properties, const cha } } - serialize_int(metafile, m, metapos, fname); for (i = 0; i < m; i++) { serialize_long_long(metafile, addpool(poolfile, treefile, metakey[i], VT_STRING), metapos, fname); serialize_long_long(metafile, addpool(poolfile, treefile, metaval[i], metatype[i]), metapos, fname); @@ -587,6 +586,7 @@ int serialize_geometry(json_object *geometry, json_object *properties, const cha serialize_int(geomfile, segment, geompos, fname); serialize_long_long(geomfile, metastart, geompos, fname); + serialize_int(geomfile, m, geompos, fname); long long wx = *initial_x, wy = *initial_y; parse_geometry(t, coordinates, bbox, geompos, geomfile, VT_MOVETO, fname, line, &wx, &wy, initialized, initial_x, initial_y); serialize_byte(geomfile, VT_END, geompos, fname); @@ -1507,6 +1507,8 @@ int read_json(int argc, struct source **sourcelist, char *fname, const char *lay struct stringpool p; memfile_write(r->treefile, &p, sizeof(struct stringpool)); } + // Keep metadata file from being completely empty if no attributes + serialize_int(r->metafile, 0, &r->metapos, "meta"); r->file_bbox = malloc(4 * sizeof(long long)); if (r->file_bbox == NULL) { diff --git a/tile.cc b/tile.cc index 7b61d11f..f6e5952d 100644 --- a/tile.cc +++ b/tile.cc @@ -212,10 +212,7 @@ struct pool_val *retrieve_string(char **f, struct pool *p, char *stringpool) { return ret; } -void decode_meta(char **meta, char *stringpool, struct pool *keys, struct pool *values, struct pool *file_keys, std::vector *intmeta) { - int m; - deserialize_int(meta, &m); - +void decode_meta(int m, char **meta, char *stringpool, struct pool *keys, struct pool *values, struct pool *file_keys, std::vector *intmeta) { int i; for (i = 0; i < m; i++) { struct pool_val *key = retrieve_string(meta, keys, stringpool); @@ -364,7 +361,7 @@ struct sll { } }; -void rewrite(drawvec &geom, int z, int nextzoom, int maxzoom, long long *bbox, unsigned tx, unsigned ty, int buffer, int line_detail, int *within, long long *geompos, FILE **geomfile, const char *fname, signed char t, int layer, long long metastart, signed char feature_minzoom, int child_shards, int max_zoom_increment, long long seq, int tippecanoe_minzoom, int tippecanoe_maxzoom, int segment, unsigned *initial_x, unsigned *initial_y) { +void rewrite(drawvec &geom, int z, int nextzoom, int maxzoom, long long *bbox, unsigned tx, unsigned ty, int buffer, int line_detail, int *within, long long *geompos, FILE **geomfile, const char *fname, signed char t, int layer, long long metastart, signed char feature_minzoom, int child_shards, int max_zoom_increment, long long seq, int tippecanoe_minzoom, int tippecanoe_maxzoom, int segment, unsigned *initial_x, unsigned *initial_y, int m) { if (geom.size() > 0 && nextzoom <= maxzoom) { int xo, yo; int span = 1 << (nextzoom - z); @@ -447,6 +444,7 @@ void rewrite(drawvec &geom, int z, int nextzoom, int maxzoom, long long *bbox, u } serialize_int(geomfile[j], segment, &geompos[j], fname); serialize_long_long(geomfile[j], metastart, &geompos[j], fname); + serialize_int(geomfile[j], m, &geompos[j], fname); long long wx = initial_x[segment], wy = initial_y[segment]; for (size_t u = 0; u < geom.size(); u++) { @@ -471,6 +469,7 @@ void rewrite(drawvec &geom, int z, int nextzoom, int maxzoom, long long *bbox, u struct partial { std::vector geoms; long long layer; + int m; char *meta; signed char t; int segment; @@ -697,7 +696,9 @@ long long write_tile(char **geoms, char *metabase, char *stringpool, int z, unsi deserialize_int(geoms, &segment); long long metastart; + int m; deserialize_long_long(geoms, &metastart); + deserialize_int(geoms, &m); char *meta = metabase + metastart + meta_off[segment]; long long bbox[4]; @@ -770,7 +771,7 @@ long long write_tile(char **geoms, char *metabase, char *stringpool, int z, unsi } if (line_detail == detail && fraction == 1) { /* only write out the next zoom once, even if we retry */ - rewrite(geom, z, nextzoom, maxzoom, bbox, tx, ty, buffer, line_detail, within, geompos, geomfile, fname, t, layer, metastart, feature_minzoom, child_shards, max_zoom_increment, original_seq, tippecanoe_minzoom, tippecanoe_maxzoom, segment, initial_x, initial_y); + rewrite(geom, z, nextzoom, maxzoom, bbox, tx, ty, buffer, line_detail, within, geompos, geomfile, fname, t, layer, metastart, feature_minzoom, child_shards, max_zoom_increment, original_seq, tippecanoe_minzoom, tippecanoe_maxzoom, segment, initial_x, initial_y, m); } if (z < minzoom) { @@ -823,6 +824,7 @@ long long write_tile(char **geoms, char *metabase, char *stringpool, int z, unsi partial p; p.geoms.push_back(geom); p.layer = layer; + p.m = m; p.meta = meta; p.t = t; p.segment = segment; @@ -892,7 +894,7 @@ long long write_tile(char **geoms, char *metabase, char *stringpool, int z, unsi c.coalesced = false; c.original_seq = original_seq; - decode_meta(&meta, stringpool + pool_off[segment], keys[layer], values[layer], file_keys[layer], &c.meta); + decode_meta(partials[i].m, &meta, stringpool + pool_off[segment], keys[layer], values[layer], file_keys[layer], &c.meta); features[layer].push_back(c); } }