diff --git a/geojson.c b/geojson.c index ae1b4de..4887bfb 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; } -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, 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, const char *tmpdir, double gamma, int nlayers) { int i; for (i = 0; i <= maxzoom; i++) { long long most = 0; @@ -255,7 +255,7 @@ int traverse_zooms(int geomfd[4], off_t geom_size[4], char *metabase, unsigned * // fprintf(stderr, "%d/%u/%u\n", z, x, y); - 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, sub, minzoom, maxzoom, todo, geomstart, along, gamma); + 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, sub, minzoom, maxzoom, todo, geomstart, along, gamma, nlayers); if (len < 0) { return i - 1; @@ -669,35 +669,41 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max file_keys[i] = &file_keys1[i]; } - char trunc[strlen(fname) + 1]; - if (layername == NULL) { - const char *ocp, *use = fname; - for (ocp = fname; *ocp; ocp++) { - if (*ocp == '/' && ocp[1] != '\0') { - use = ocp + 1; + char *layernames[nlayers]; + for (i = 0; i < nlayers; i++) { + if (argc == 1 && layername != NULL) { + layernames[i] = strdup(layername); + } else { + char *trunc = layernames[i] = malloc(strlen(argv[i]) + 1); + + const char *ocp, *use = argv[i]; + for (ocp = argv[i]; *ocp; ocp++) { + if (*ocp == '/' && ocp[1] != '\0') { + use = ocp + 1; + } } - } - strcpy(trunc, use); + strcpy(trunc, use); - char *cp = strstr(trunc, ".json"); - if (cp != NULL) { - *cp = '\0'; - } - cp = strstr(trunc, ".mbtiles"); - if (cp != NULL) { - *cp = '\0'; - } - layername = trunc; - - char *out = trunc; - for (cp = trunc; *cp; cp++) { - if (isalpha(*cp) || isdigit(*cp) || *cp == '_') { - *out++ = *cp; + char *cp = strstr(trunc, ".json"); + if (cp != NULL) { + *cp = '\0'; } - } - *out = '\0'; + cp = strstr(trunc, ".mbtiles"); + if (cp != NULL) { + *cp = '\0'; + } + layername = trunc; - printf("using layer name %s\n", trunc); + char *out = trunc; + for (cp = trunc; *cp; cp++) { + if (isalpha(*cp) || isdigit(*cp) || *cp == '_') { + *out++ = *cp; + } + } + *out = '\0'; + + printf("using layer %d name %s\n", i, trunc); + } } /* Sort the index by geometry */ @@ -875,7 +881,7 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max fprintf(stderr, "%lld features, %lld bytes of geometry, %lld bytes of metadata\n", seq, (long long) geomst.st_size, (long long) metast.st_size); - int written = traverse_zooms(fd, size, meta, file_bbox, file_keys, &midx, &midy, layername, maxzoom, minzoom, outdb, droprate, buffer, fname, tmpdir, gamma); + int written = traverse_zooms(fd, size, meta, file_bbox, file_keys, &midx, &midy, layername, maxzoom, minzoom, outdb, droprate, buffer, fname, tmpdir, gamma, nlayers); if (maxzoom != written) { fprintf(stderr, "\n\n\n*** NOTE TILES ONLY COMPLETE THROUGH ZOOM %d ***\n\n\n", written); @@ -915,10 +921,11 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max midlon = maxlon; } - mbtiles_write_metadata(outdb, fname, &layername, 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); // XXX layers for (i = 0; i < nlayers; i++) { pool_free_strings(&file_keys1[i]); + free(layernames[i]); } return ret; } diff --git a/mbtiles.c b/mbtiles.c index c9d5f57..ec13ef3 100644 --- a/mbtiles.c +++ b/mbtiles.c @@ -107,7 +107,7 @@ static void aprintf(char **buf, const char *format, ...) { free(tmp); } -void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, const char **layername, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, struct pool **file_keys, int nlayers) { +void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, char **layername, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, struct pool **file_keys, int nlayers) { char *sql, *err; sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('name', %Q);", fname); diff --git a/mbtiles.h b/mbtiles.h index 45de66b..9e42f1b 100644 --- a/mbtiles.h +++ b/mbtiles.h @@ -2,6 +2,6 @@ sqlite3 *mbtiles_open(char *dbname, char **argv); void mbtiles_write_tile(sqlite3 *outdb, int z, int tx, int ty, const char *data, int size); -void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, const char **layername, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, struct pool **file_keys, int nlayers); +void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, char **layername, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, struct pool **file_keys, int nlayers); void mbtiles_close(sqlite3 *outdb, char **argv); diff --git a/tile.cc b/tile.cc index f2bf4d6..18dc145 100644 --- a/tile.cc +++ b/tile.cc @@ -342,11 +342,10 @@ void evaluate(std::vector &features, char *metabase, struct pool *file pool_free(&keys); } -long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, unsigned tx, unsigned ty, int detail, int basezoom, struct pool **file_keys, const char *layername, 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) { +long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, unsigned tx, unsigned ty, int detail, int basezoom, struct pool **file_keys, const char *layername, 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) { int line_detail; static bool evaluated = false; double oprogress = 0; - int nlayers = 1; // XXX char *og = *geoms; diff --git a/tile.h b/tile.h index 4dbe9df..02d825a 100644 --- a/tile.h +++ b/tile.h @@ -25,4 +25,4 @@ void deserialize_uint(char **f, unsigned *n); void deserialize_byte(char **f, signed char *n); struct pool_val *deserialize_string(char **f, struct pool *p, int type); -long long write_tile(char **geom, char *metabase, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int basezoom, struct pool **file_keys, const char *layername, 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); +long long write_tile(char **geom, char *metabase, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int basezoom, struct pool **file_keys, const char *layername, 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);