Skip to content

Commit 0c5fc50

Browse files
committed
Don't keep duplicates in memory while coalescing
1 parent a72f5e6 commit 0c5fc50

1 file changed

Lines changed: 31 additions & 20 deletions

File tree

‎tile.cpp‎

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2497,7 +2497,9 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
24972497
std::sort(layer_features.begin(), layer_features.end());
24982498
}
24992499

2500-
{
2500+
if (additional[A_COALESCE]) {
2501+
// coalesce adjacent identical features if requested
2502+
25012503
size_t out = 0;
25022504
if (layer_features.size() > 0) {
25032505
out++;
@@ -2506,7 +2508,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
25062508
for (size_t x = 1; x < layer_features.size(); x++) {
25072509
size_t y = out - 1;
25082510

2509-
if (additional[A_COALESCE] && out > 0 && coalcmp(&layer_features[x], &layer_features[y]) == 0) {
2511+
if (out > 0 && coalcmp(&layer_features[x], &layer_features[y]) == 0) {
25102512
for (size_t g = 0; g < layer_features[x].geom.size(); g++) {
25112513
layer_features[y].geom.push_back(layer_features[x].geom[g]);
25122514
}
@@ -2519,31 +2521,40 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
25192521
layer_features.resize(out);
25202522
}
25212523

2522-
std::vector<coalesce> out;
2523-
for (size_t x = 0; x < layer_features.size(); x++) {
2524-
if (layer_features[x].coalesced && layer_features[x].type == VT_LINE) {
2525-
layer_features[x].geom = remove_noop(layer_features[x].geom, layer_features[x].type, 0);
2526-
if (!(prevent[P_SIMPLIFY] || (z == maxzoom && prevent[P_SIMPLIFY_LOW]))) {
2527-
// XXX revisit: why does this not take zoom into account?
2528-
layer_features[x].geom = simplify_lines(layer_features[x].geom, 32, 0, 0, 0,
2529-
!(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, layer_features[x].type == VT_POLYGON ? 4 : 0, shared_nodes, NULL, 0);
2524+
{
2525+
// clean up coalesced linestrings by simplification
2526+
// and coalesced polygons by cleaning
2527+
//
2528+
// then close polygons
2529+
2530+
size_t out = 0;
2531+
2532+
for (size_t x = 0; x < layer_features.size(); x++) {
2533+
if (layer_features[x].coalesced && layer_features[x].type == VT_LINE) {
2534+
layer_features[x].geom = remove_noop(layer_features[x].geom, layer_features[x].type, 0);
2535+
if (!(prevent[P_SIMPLIFY] || (z == maxzoom && prevent[P_SIMPLIFY_LOW]))) {
2536+
// XXX revisit: why does this not take zoom into account?
2537+
layer_features[x].geom = simplify_lines(layer_features[x].geom, 32, 0, 0, 0,
2538+
!(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, layer_features[x].type == VT_POLYGON ? 4 : 0, shared_nodes, NULL, 0);
2539+
}
25302540
}
2531-
}
25322541

2533-
if (layer_features[x].type == VT_POLYGON) {
2534-
if (layer_features[x].coalesced) {
2535-
// we can try scaling up because this is tile coordinates
2536-
layer_features[x].geom = clean_or_clip_poly(layer_features[x].geom, 0, 0, false, true);
2542+
if (layer_features[x].type == VT_POLYGON) {
2543+
if (layer_features[x].coalesced) {
2544+
// we can try scaling up because this is tile coordinates
2545+
layer_features[x].geom = clean_or_clip_poly(layer_features[x].geom, 0, 0, false, true);
2546+
}
2547+
2548+
layer_features[x].geom = close_poly(layer_features[x].geom);
25372549
}
25382550

2539-
layer_features[x].geom = close_poly(layer_features[x].geom);
2551+
if (layer_features[x].geom.size() > 0) {
2552+
layer_features[out++] = layer_features[x];
2553+
}
25402554
}
25412555

2542-
if (layer_features[x].geom.size() > 0) {
2543-
out.push_back(layer_features[x]);
2544-
}
2556+
layer_features.resize(out);
25452557
}
2546-
layer_features = out;
25472558

25482559
if (prevent[P_INPUT_ORDER]) {
25492560
std::sort(layer_features.begin(), layer_features.end(), preservecmp);

0 commit comments

Comments
 (0)