Skip to content

Commit 8232993

Browse files
committed
Another try at fixing longitude wraparound for bins
1 parent 51fcf14 commit 8232993

File tree

1 file changed

+29
-10
lines changed

1 file changed

+29
-10
lines changed

Diff for: read_json.cpp

+29-10
Original file line numberDiff line numberDiff line change
@@ -282,23 +282,42 @@ std::vector<mvt_layer> parse_layers(FILE *fp, int z, unsigned x, unsigned y, int
282282
dv = fix_polygon(dv, false, false);
283283
}
284284

285+
if (z > 0) {
286+
// handle longitude wraparound
287+
//
288+
// this is supposed to be data for a single tile,
289+
// so any jump from the left hand side of the world
290+
// to the right side, or vice versa, is unexpected,
291+
// so move it to the other side.
292+
//
293+
// (unless this is z0, in which case it is still
294+
// reasonable to have a big, world-spanning polygon,
295+
// and I'm not sure what to do about that.)
296+
297+
for (size_t i = 0; i < dv.size(); i++) {
298+
if (i > 0) {
299+
if ((dv[0].x < (1LL << 31)) &&
300+
(dv[i].x > (1LL << 31))) {
301+
dv[i].x -= 1LL << 32;
302+
}
303+
if ((dv[0].x > (1LL << 31)) &&
304+
(dv[i].x < (1LL << 31))) {
305+
dv[i].x += 1LL << 32;
306+
}
307+
}
308+
}
309+
}
310+
285311
// Offset and scale geometry from global to tile
312+
286313
for (size_t i = 0; i < dv.size(); i++) {
287314
long long scale = 1LL << (32 - z);
288315

289-
// offset
316+
// offset to tile
290317
dv[i].x -= scale * x;
291318
dv[i].y -= scale * y;
292319

293-
// handle longitude wraparound
294-
if (dv[i].x > 2 * scale && dv[i].x - (1LL << 32) > -3 * scale) {
295-
dv[i].x -= 1LL << 32;
296-
}
297-
if (dv[i].x < -3 * scale && dv[i].x + (1LL << 32) < 2 * scale) {
298-
dv[i].x += 1LL << 32;
299-
}
300-
301-
// scale
320+
// scale to tile
302321
dv[i].x = std::round(dv[i].x * extent / (double) scale);
303322
dv[i].y = std::round(dv[i].y * extent / (double) scale);
304323
}

0 commit comments

Comments
 (0)