@@ -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