Scaffolding for layers within per-tile processing

This commit is contained in:
Eric Fischer
2015-03-23 11:36:35 -07:00
parent 26bcdef06b
commit d370b07231
+55 -37
View File
@@ -346,16 +346,19 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u
int line_detail; int line_detail;
static bool evaluated = false; static bool evaluated = false;
double oprogress = 0; double oprogress = 0;
int nlayers = 1; // XXX
char *og = *geoms; char *og = *geoms;
for (line_detail = detail; line_detail >= MIN_DETAIL || line_detail == detail; line_detail--) { for (line_detail = detail; line_detail >= MIN_DETAIL || line_detail == detail; line_detail--) {
GOOGLE_PROTOBUF_VERIFY_VERSION; GOOGLE_PROTOBUF_VERIFY_VERSION;
struct pool keys, values; struct pool keys[nlayers], values[nlayers];
pool_init(&keys, 0); int i;
pool_init(&values, 0); for (i = 0; i < nlayers; i++) {
std::set<long long> dup; pool_init(&keys[i], 0);
pool_init(&values[i], 0);
}
long long count = 0; long long count = 0;
//long long along = 0; //long long along = 0;
@@ -371,7 +374,10 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u
double scale = (double) (1LL << (64 - 2 * (z + 8))); double scale = (double) (1LL << (64 - 2 * (z + 8)));
double gap = 0; double gap = 0;
std::vector<coalesce> features; std::vector<std::vector<coalesce> > features;
for (i = 0; i < nlayers; i++) {
features.push_back(std::vector<coalesce>());
}
int within[4] = { 0 }; int within[4] = { 0 };
long long geompos[4] = { 0 }; long long geompos[4] = { 0 };
@@ -385,6 +391,8 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u
break; break;
} }
int layer = 0; // XXX layer
long long metastart; long long metastart;
deserialize_long_long(geoms, &metastart); deserialize_long_long(geoms, &metastart);
char *meta = metabase + metastart; char *meta = metabase + metastart;
@@ -574,8 +582,8 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u
c.metasrc = meta; c.metasrc = meta;
c.coalesced = false; c.coalesced = false;
decode_meta(&meta, &keys, &values, file_keys, &c.meta, NULL); decode_meta(&meta, &keys[layer], &values[layer], file_keys, &c.meta, NULL);
features.push_back(c); features[layer].push_back(c);
} }
} }
@@ -587,47 +595,57 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u
} }
} }
std::sort(features.begin(), features.end()); for (j = 0; j < nlayers; j++) {
std::sort(features[j].begin(), features[j].end());
std::vector<coalesce> out; std::vector<coalesce> out;
unsigned x; unsigned x;
for (x = 0; x < features.size(); x++) { for (x = 0; x < features[j].size(); x++) {
unsigned y = out.size() - 1; unsigned y = out.size() - 1;
if (out.size() > 0 && coalcmp(&features[x], &out[y]) < 0) { if (out.size() > 0 && coalcmp(&features[j][x], &out[y]) < 0) {
fprintf(stderr, "\nfeature out of order\n"); fprintf(stderr, "\nfeature out of order\n");
}
if (out.size() > 0 && out[y].geom.size() + features[x].geom.size() < 20000 && coalcmp(&features[x], &out[y]) == 0 && features[x].type != VT_POINT) {
unsigned z;
for (z = 0; z < features[x].geom.size(); z++) {
out[y].geom.push_back(features[x].geom[z]);
} }
out[y].coalesced = true;
} else {
out.push_back(features[x]);
}
}
features = out;
for (x = 0; x < features.size(); x++) { if (out.size() > 0 && out[y].geom.size() + features[j][x].geom.size() < 20000 && coalcmp(&features[j][x], &out[y]) == 0 && features[j][x].type != VT_POINT) {
if (features[x].coalesced && features[x].type == VT_LINE) { unsigned z;
features[x].geom = remove_noop(features[x].geom, features[x].type); for (z = 0; z < features[j][x].geom.size(); z++) {
features[x].geom = simplify_lines(features[x].geom, 32, 0); out[y].geom.push_back(features[j][x].geom[z]);
}
out[y].coalesced = true;
} else {
out.push_back(features[j][x]);
}
}
features[j] = out;
for (x = 0; x < features[j].size(); x++) {
if (features[j][x].coalesced && features[j][x].type == VT_LINE) {
features[j][x].geom = remove_noop(features[j][x].geom, features[j][x].type);
features[j][x].geom = simplify_lines(features[j][x].geom, 32, 0);
}
} }
} }
if (features.size() > 0) { long long totalsize = 0;
if (features.size() > 200000) { for (j = 0; j < nlayers; j++) {
fprintf(stderr, "tile %d/%u/%u has %lld features, >200000 \n", z, tx, ty, (long long) features.size()); totalsize += features[j].size();
}
if (totalsize > 0) {
if (totalsize > 200000) {
fprintf(stderr, "tile %d/%u/%u has %lld features, >200000 \n", z, tx, ty, totalsize);
fprintf(stderr, "Try using -z to set a higher base zoom level.\n"); fprintf(stderr, "Try using -z to set a higher base zoom level.\n");
return -1; return -1;
} }
mapnik::vector::tile tile = create_tile(layername, line_detail, features, &count, &keys, &values); mapnik::vector::tile tile = create_tile(layername, line_detail, features[0], &count, &keys[0], &values[0]); // XXX layer
pool_free(&keys); int i;
pool_free(&values); for (i = 0; i < nlayers; i++) {
pool_free(&keys[i]);
pool_free(&values[i]);
}
std::string s; std::string s;
std::string compressed; std::string compressed;
@@ -640,7 +658,7 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u
if (line_detail == MIN_DETAIL || !evaluated) { if (line_detail == MIN_DETAIL || !evaluated) {
evaluated = true; evaluated = true;
evaluate(features, metabase, file_keys, layername, line_detail, compressed.size()); evaluate(features[0], metabase, file_keys, layername, line_detail, compressed.size()); // XXX layer
} }
} else { } else {
mbtiles_write_tile(outdb, z, tx, ty, compressed.data(), compressed.size()); mbtiles_write_tile(outdb, z, tx, ty, compressed.data(), compressed.size());