From f5135ebc63ed3d14e7d5496980278708d686a96a Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Mon, 23 Mar 2015 16:12:12 -0700 Subject: [PATCH] Writing out the JSON metadata for multiple layers --- geojson.c | 2 +- mbtiles.c | 45 ++++++++++++++++++++++++++++----------------- mbtiles.h | 2 +- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/geojson.c b/geojson.c index 64179a6..c490199 100644 --- a/geojson.c +++ b/geojson.c @@ -891,7 +891,7 @@ int read_json(FILE *f, const char *fname, const char *layername, int maxzoom, in midlon = maxlon; } - mbtiles_write_metadata(outdb, fname, layername, minzoom, maxzoom, minlat, minlon, maxlat, maxlon, midlat, midlon, file_keys); + mbtiles_write_metadata(outdb, fname, &layername, 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]); diff --git a/mbtiles.c b/mbtiles.c index 0936942..c9d5f57 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) { +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) { char *sql, *err; sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('name', %Q);", fname); @@ -174,27 +174,38 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, const char *layer sqlite3_free(sql); char *buf = strdup("{"); - aprintf(&buf, "\"vector_layers\": [ { \"id\": \""); - quote(&buf, layername); - aprintf(&buf, "\", \"description\": \"\", \"minzoom\": %d, \"maxzoom\": %d, \"fields\": {", minzoom, maxzoom); + aprintf(&buf, "\"vector_layers\": [ "); - struct pool_val *pv; - for (pv = file_keys[0]->head; pv != NULL; pv = pv->next) { // XXX layers - aprintf(&buf, "\""); - quote(&buf, pv->s); - - if (pv->type == VT_NUMBER) { - aprintf(&buf, "\": \"Number\""); - } else { - aprintf(&buf, "\": \"String\""); - } - - if (pv->next != NULL) { + int i; + for (i = 0; i < nlayers; i++) { + if (i != 0) { aprintf(&buf, ", "); } + + aprintf(&buf, "{ \"id\": \""); + quote(&buf, layername[i]); + aprintf(&buf, "\", \"description\": \"\", \"minzoom\": %d, \"maxzoom\": %d, \"fields\": {", minzoom, maxzoom); + + struct pool_val *pv; + for (pv = file_keys[i]->head; pv != NULL; pv = pv->next) { + aprintf(&buf, "\""); + quote(&buf, pv->s); + + if (pv->type == VT_NUMBER) { + aprintf(&buf, "\": \"Number\""); + } else { + aprintf(&buf, "\": \"String\""); + } + + if (pv->next != NULL) { + aprintf(&buf, ", "); + } + } + + aprintf(&buf, "} }"); } - aprintf(&buf, "} } ] }"); + aprintf(&buf, " ] }"); sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('json', %Q);", buf); if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) { diff --git a/mbtiles.h b/mbtiles.h index e96ea64..45de66b 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); +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_close(sqlite3 *outdb, char **argv);