From d13f60e9c4e51f8dcb608fc5688a087543d2e154 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Fri, 30 Oct 2015 17:30:18 -0700 Subject: [PATCH] Merge files into one layer if a name is specified with -l --- README.md | 3 ++- decode.cc | 19 +++++++++++++++++++ geojson.c | 38 +++++++++++++++++++++++++++----------- man/tippecanoe.1 | 3 ++- 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 2e25f1a..d35cc6d 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,8 @@ Options ### Naming - * -l _name_: Layer name (default "file" if source is file.json or output is file.mbtiles). Only works if there is only one layer. + * -l _name_: Layer name (default "file" if source is file.json or output is file.mbtiles). If there are multiple input files + specified, the files are all merged into the single named layer. * -n _name_: Human-readable name (default file.json) ### File control diff --git a/decode.cc b/decode.cc index a31f1ac..ed96d90 100644 --- a/decode.cc +++ b/decode.cc @@ -109,6 +109,20 @@ void handle(std::string message, int z, unsigned x, unsigned y, int describe) { mapnik::vector::tile_layer layer = tile.layers(l); int extent = layer.extent(); + if (describe) { + if (l != 0) { + printf(",\n"); + } + + printf("{ \"type\": \"FeatureCollection\""); + printf(", \"properties\": { \"name\": "); + printq(layer.name().c_str()); + printf(" }"); + printf(", \"features\": [\n"); + + within = 0; + } + for (int f = 0; f < layer.features_size(); f++) { mapnik::vector::tile_feature feat = layer.features(f); int px = 0, py = 0; @@ -275,6 +289,7 @@ void handle(std::string message, int z, unsigned x, unsigned y, int describe) { int state = 0; for (unsigned i = 0; i < rings.size(); i++) { + printf("AREA %f ", areas[i]); if (areas[i] <= 0) { if (state != 0) { // new multipolygon @@ -316,6 +331,10 @@ void handle(std::string message, int z, unsigned x, unsigned y, int describe) { printf(" } }\n"); } + + if (describe) { + printf("] }\n"); + } } printf("] }\n"); diff --git a/geojson.c b/geojson.c index a1d4804..194f87d 100644 --- a/geojson.c +++ b/geojson.c @@ -796,31 +796,48 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max unsigned midx = 0, midy = 0; long long seq = 0; - int nlayers = argc; - if (nlayers == 0) { + int nlayers; + if (layername != NULL) { nlayers = 1; + } else { + nlayers = argc; + if (nlayers == 0) { + nlayers = 1; + } } - int layer; - for (layer = 0; layer < nlayers; layer++) { + int nsources = argc; + if (nsources == 0) { + nsources = 1; + } + + int source; + for (source = 0; source < nsources; source++) { json_pull *jp; const char *reading; FILE *fp; - if (layer >= argc) { + if (source >= argc) { reading = "standard input"; fp = stdin; } else { - reading = argv[layer]; - fp = fopen(argv[layer], "r"); + reading = argv[source]; + fp = fopen(argv[source], "r"); if (fp == NULL) { - perror(argv[layer]); + perror(argv[source]); continue; } } jp = json_begin_file(fp); + int layer; + if (nlayers == 1) { + layer = 0; + } else { + layer = source; + } + parse_json(jp, reading, &seq, &metapos, &geompos, &indexpos, exclude, include, exclude_all, metafile, geomfile, indexfile, poolfile, treefile, fname, maxzoom, layer, droprate, file_bbox); json_end(jp); @@ -867,7 +884,7 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max char *layernames[nlayers]; for (i = 0; i < nlayers; i++) { - if (argc <= 1 && layername != NULL) { + if (layername != NULL) { layernames[i] = strdup(layername); } else { char *src = argv[i]; @@ -892,7 +909,6 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max if (cp != NULL) { *cp = '\0'; } - layername = trunc; char *out = trunc; for (cp = trunc; *cp; cp++) { @@ -1137,7 +1153,7 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max midlon = maxlon; } - mbtiles_write_metadata(outdb, fname, layernames, minzoom, maxzoom, minlat, minlon, maxlat, maxlon, midlat, midlon, file_keys, nlayers); // XXX layers + mbtiles_write_metadata(outdb, fname, layernames, minzoom, maxzoom, minlat, minlon, maxlat, maxlon, midlat, midlon, file_keys, nlayers); for (i = 0; i < nlayers; i++) { pool_free_strings(&file_keys1[i]); diff --git a/man/tippecanoe.1 b/man/tippecanoe.1 index 11db972..e01a973 100644 --- a/man/tippecanoe.1 +++ b/man/tippecanoe.1 @@ -54,7 +54,8 @@ it encounters. .SS Naming .RS .IP \(bu 2 -\-l \fIname\fP: Layer name (default "file" if source is file.json or output is file.mbtiles). Only works if there is only one layer. +\-l \fIname\fP: Layer name (default "file" if source is file.json or output is file.mbtiles). If there are multiple input files +specified, the files are all merged into the single named layer. .IP \(bu 2 \-n \fIname\fP: Human\-readable name (default file.json) .RE