1 | #pragma once |
2 | |
3 | #include <mapbox/geojsonvt/clip.hpp> |
4 | #include <mapbox/geojsonvt/types.hpp> |
5 | |
6 | namespace mapbox { |
7 | namespace geojsonvt { |
8 | namespace detail { |
9 | |
10 | inline void shiftCoords(vt_features& features, double offset) { |
11 | for (auto& feature : features) { |
12 | mapbox::geometry::for_each_point(geom&: feature.geometry, |
13 | f: [offset](vt_point& point) { point.x += offset; }); |
14 | feature.bbox.min.x += offset; |
15 | feature.bbox.max.x += offset; |
16 | } |
17 | } |
18 | |
19 | inline vt_features wrap(const vt_features& features, double buffer) { |
20 | // left world copy |
21 | auto left = clip<0>(features, k1: -1 - buffer, k2: buffer, minAll: -1, maxAll: 2); |
22 | // right world copy |
23 | auto right = clip<0>(features, k1: 1 - buffer, k2: 2 + buffer, minAll: -1, maxAll: 2); |
24 | |
25 | if (left.empty() && right.empty()) |
26 | return features; |
27 | |
28 | // center world copy |
29 | auto merged = clip<0>(features, k1: -buffer, k2: 1 + buffer, minAll: -1, maxAll: 2); |
30 | |
31 | if (!left.empty()) { |
32 | // merge left into center |
33 | shiftCoords(features&: left, offset: 1.0); |
34 | merged.insert(position: merged.begin(), first: left.begin(), last: left.end()); |
35 | } |
36 | if (!right.empty()) { |
37 | // merge right into center |
38 | shiftCoords(features&: right, offset: -1.0); |
39 | merged.insert(position: merged.end(), first: right.begin(), last: right.end()); |
40 | } |
41 | return merged; |
42 | } |
43 | |
44 | } // namespace detail |
45 | } // namespace geojsonvt |
46 | } // namespace mapbox |
47 | |