From c24cfada616c759088ae1f2eea0a200d83aee6e8 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Wed, 5 Nov 2014 12:17:12 -0800 Subject: [PATCH] Move feature type to index so point skipping can avoid looking up geometry Which should avoid having to page the geometry in if there is more data than will fit in memory --- geojson.c | 2 +- tile.cc | 6 ++---- tile.h | 3 ++- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/geojson.c b/geojson.c index d285f30..3f15c15 100644 --- a/geojson.c +++ b/geojson.c @@ -381,7 +381,6 @@ void read_json(FILE *f, char *fname, char *layername, int maxzoom, int minzoom, unsigned bbox[] = { UINT_MAX, UINT_MAX, 0, 0 }; - serialize_int(metafile, mb_geometry[t], &fpos, fname, jp); parse_geometry(t, coordinates, bbox, &fpos, metafile, VT_MOVETO, fname, jp); serialize_int(metafile, VT_END, &fpos, fname, jp); @@ -467,6 +466,7 @@ void read_json(FILE *f, char *fname, char *layername, int maxzoom, int minzoom, ix.index = encode(x << (32 - z), y << (32 - z)); } ix.fpos = start; + ix.type = mb_geometry[t]; ix.maxzoom = z; fwrite_check(&ix, sizeof(struct index), 1, indexfile, fname, jp); } diff --git a/tile.cc b/tile.cc index 0fc98f7..1ed706f 100644 --- a/tile.cc +++ b/tile.cc @@ -376,10 +376,7 @@ long long write_tile(struct index *start, struct index *end, char *metabase, uns } dup.insert(std::pair(i->fpos, 1)); - int t; - char *meta = metabase + i->fpos; - deserialize_int(&meta, &t); - + int t = i->type; if (t == VT_POINT) { seq++; @@ -390,6 +387,7 @@ long long write_tile(struct index *start, struct index *end, char *metabase, uns } } + char *meta = metabase + i->fpos; drawvec geom = decode_geometry(&meta, z, tx, ty, line_detail); bool reduced = false; diff --git a/tile.h b/tile.h index 0612765..9b29f8b 100644 --- a/tile.h +++ b/tile.h @@ -19,8 +19,9 @@ struct pool_val *deserialize_string(char **f, struct pool *p, int type); struct index { unsigned long long index; - long long fpos : 56; + long long fpos : 48; int maxzoom : 8; + int type : 8; }; long long write_tile(struct index *start, struct index *end, char *metabase, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int basezoom, struct pool *file_keys, char *layername, sqlite3 *outdb, double droprate, int buffer);