From a185073f0abea557a9ab11a23a4219aaaad2ea0a Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Thu, 18 Jun 2015 14:16:16 -0700 Subject: [PATCH] Shrink the geometry by shaving off bits below the maxzoom tile resolution --- geojson.c | 10 +++++++--- geometry.cc | 4 ++-- tile.cc | 4 ++-- tile.h | 1 + 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/geojson.c b/geojson.c index d43b0db2..c381e95c 100644 --- a/geojson.c +++ b/geojson.c @@ -26,6 +26,7 @@ int full_detail = -1; int min_detail = 7; unsigned initial_x = 0, initial_y = 0; +int geometry_scale = 0; int initialized = 0; #define GEOM_POINT 0 /* array of positions */ @@ -164,8 +165,8 @@ void parse_geometry(int t, json_object *j, unsigned *bbox, long long *fpos, FILE } serialize_byte(out, op, fpos, fname); - serialize_long_long(out, x - *wx, fpos, fname); - serialize_long_long(out, y - *wy, fpos, fname); + serialize_long_long(out, (x >> geometry_scale) - (*wx >> geometry_scale), fpos, fname); + serialize_long_long(out, (y >> geometry_scale) - (*wy >> geometry_scale), fpos, fname); *wx = x; *wy = y; } else { @@ -494,7 +495,7 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max long long indexpos = 0; unlink(metaname); - unlink(poolname); + //unlink(poolname); unlink(geomname); unlink(indexname); @@ -1182,6 +1183,9 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } + geometry_scale = 32 - (full_detail + maxzoom); + printf("geometry scale is %d\n", geometry_scale); + if (outdir == NULL) { fprintf(stderr, "%s: must specify -o out.mbtiles\n", argv[0]); exit(EXIT_FAILURE); diff --git a/geometry.cc b/geometry.cc index 14d489d2..281a41ca 100644 --- a/geometry.cc +++ b/geometry.cc @@ -41,8 +41,8 @@ drawvec decode_geometry(char **meta, int z, unsigned tx, unsigned ty, int detail deserialize_long_long(meta, &dx); deserialize_long_long(meta, &dy); - wx += dx; - wy += dy; + wx += dx << geometry_scale; + wy += dy << geometry_scale; long long wwx = wx; long long wwy = wy; diff --git a/tile.cc b/tile.cc index 2877da45..585783fe 100644 --- a/tile.cc +++ b/tile.cc @@ -510,8 +510,8 @@ long long write_tile(char **geoms, char *metabase, char *stringpool, unsigned *f serialize_byte(geomfile[j], geom[u].op, &geompos[j], fname); if (geom[u].op != VT_CLOSEPATH) { - serialize_long_long(geomfile[j], geom[u].x + sx - wx, &geompos[j], fname); - serialize_long_long(geomfile[j], geom[u].y + sy - wy, &geompos[j], fname); + serialize_long_long(geomfile[j], ((geom[u].x + sx) >> geometry_scale) - (wx >> geometry_scale), &geompos[j], fname); + serialize_long_long(geomfile[j], ((geom[u].y + sy) >> geometry_scale) - (wy >> geometry_scale), &geompos[j], fname); wx = geom[u].x + sx; wy = geom[u].y + sy; } diff --git a/tile.h b/tile.h index bccc1450..644662e1 100644 --- a/tile.h +++ b/tile.h @@ -28,3 +28,4 @@ struct pool_val *deserialize_string(char **f, struct pool *p, int type); long long write_tile(char **geom, char *metabase, char *stringpool, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int min_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, char *prevent); extern unsigned initial_x, initial_y; +extern int geometry_scale;