From b59a251924fdbf7e223a76ff10ee4e0afe22df11 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Fri, 6 Mar 2015 16:33:32 -0800 Subject: [PATCH] Write metadata even when tiling fails so you can look at the partial map --- geojson.c | 27 +++++++++++++++++++++------ tile.cc | 4 ++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/geojson.c b/geojson.c index 4acb77c..e17912a 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; } -void 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, struct json_pull *jp, const char *tmpdir, double gamma) { +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, struct json_pull *jp, const char *tmpdir, double gamma) { int i; for (i = 0; i <= maxzoom; i++) { long long most = 0; @@ -257,6 +257,10 @@ void traverse_zooms(int geomfd[4], off_t geom_size[4], char *metabase, unsigned 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, jp, sub, minzoom, maxzoom, todo, geomstart, along, gamma); + if (len < 0) { + return i - 1; + } + if (z == maxzoom && len > most) { *midx = x; *midy = y; @@ -286,6 +290,7 @@ void traverse_zooms(int geomfd[4], off_t geom_size[4], char *metabase, unsigned } fprintf(stderr, "\n"); + return maxzoom; } struct index { @@ -356,7 +361,9 @@ static void merge(struct merge *merges, int nmerges, unsigned char *map, FILE *f } } -void read_json(FILE *f, const char *fname, const char *layername, int maxzoom, int minzoom, sqlite3 *outdb, struct pool *exclude, struct pool *include, int exclude_all, double droprate, int buffer, const char *tmpdir, double gamma) { +int read_json(FILE *f, const char *fname, const char *layername, int maxzoom, int minzoom, sqlite3 *outdb, struct pool *exclude, struct pool *include, int exclude_all, double droprate, int buffer, const char *tmpdir, double gamma) { + int ret = EXIT_SUCCESS; + char metaname[strlen(tmpdir) + strlen("/meta.XXXXXXXX") + 1]; char geomname[strlen(tmpdir) + strlen("/geom.XXXXXXXX") + 1]; char indexname[strlen(tmpdir) + strlen("/index.XXXXXXXX") + 1]; @@ -836,7 +843,13 @@ void read_json(FILE *f, const char *fname, const char *layername, int maxzoom, i fprintf(stderr, "%lld features, %lld bytes of geometry, %lld bytes of metadata\n", seq, (long long) geomst.st_size, (long long) metast.st_size); - traverse_zooms(fd, size, meta, file_bbox, &file_keys, &midx, &midy, layername, maxzoom, minzoom, outdb, droprate, buffer, fname, jp, tmpdir, gamma); + int written = traverse_zooms(fd, size, meta, file_bbox, &file_keys, &midx, &midy, layername, maxzoom, minzoom, outdb, droprate, buffer, fname, jp, tmpdir, gamma); + + if (maxzoom != written) { + fprintf(stderr, "\n\n\n*** NOTE TILES ONLY COMPLETE THROUGH ZOOM %d ***\n\n\n", written); + maxzoom = written; + ret = EXIT_FAILURE; + } if (munmap(meta, metast.st_size) != 0) { perror("munmap meta"); @@ -873,6 +886,7 @@ void read_json(FILE *f, const char *fname, const char *layername, int maxzoom, i mbtiles_write_metadata(outdb, fname, layername, minzoom, maxzoom, minlat, minlon, maxlat, maxlon, midlat, midlon, &file_keys); pool_free_strings(&file_keys); + return ret; } int main(int argc, char **argv) { @@ -982,6 +996,7 @@ int main(int argc, char **argv) { } sqlite3 *outdb = mbtiles_open(outdir, argv); + int ret = EXIT_SUCCESS; if (argc == optind + 1) { int i; @@ -990,7 +1005,7 @@ int main(int argc, char **argv) { if (f == NULL) { fprintf(stderr, "%s: %s: %s\n", argv[0], argv[i], strerror(errno)); } else { - read_json(f, name ? name : argv[i], layer, maxzoom, minzoom, outdb, &exclude, &include, exclude_all, droprate, buffer, tmpdir, gamma); + ret = read_json(f, name ? name : argv[i], layer, maxzoom, minzoom, outdb, &exclude, &include, exclude_all, droprate, buffer, tmpdir, gamma); fclose(f); } } @@ -998,9 +1013,9 @@ int main(int argc, char **argv) { fprintf(stderr, "%s: Only accepts one input file\n", argv[0]); exit(EXIT_FAILURE); } else { - read_json(stdin, name ? name : outdir, layer, maxzoom, minzoom, outdb, &exclude, &include, exclude_all, droprate, buffer, tmpdir, gamma); + ret = read_json(stdin, name ? name : outdir, layer, maxzoom, minzoom, outdb, &exclude, &include, exclude_all, droprate, buffer, tmpdir, gamma); } mbtiles_close(outdb, argv); - return 0; + return ret; } diff --git a/tile.cc b/tile.cc index a0c9b85..48abeca 100644 --- a/tile.cc +++ b/tile.cc @@ -621,7 +621,7 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u if (features.size() > 200000) { fprintf(stderr, "tile %d/%u/%u has %lld features, >200000 \n", z, tx, ty, (long long) features.size()); fprintf(stderr, "Try using -z to set a higher base zoom level.\n"); - exit(EXIT_FAILURE); + return -1; } mapnik::vector::tile tile = create_tile(layername, line_detail, features, &count, &keys, &values); @@ -652,6 +652,6 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u } fprintf(stderr, "could not make tile %d/%u/%u small enough\n", z, tx, ty); - exit(EXIT_FAILURE); + return -1; }