@@ -282,23 +282,42 @@ std::vector<mvt_layer> parse_layers(FILE *fp, int z, unsigned x, unsigned y, int
282
282
dv = fix_polygon (dv, false , false );
283
283
}
284
284
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
+
285
311
// Offset and scale geometry from global to tile
312
+
286
313
for (size_t i = 0 ; i < dv.size (); i++) {
287
314
long long scale = 1LL << (32 - z);
288
315
289
- // offset
316
+ // offset to tile
290
317
dv[i].x -= scale * x;
291
318
dv[i].y -= scale * y;
292
319
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
302
321
dv[i].x = std::round (dv[i].x * extent / (double ) scale);
303
322
dv[i].y = std::round (dv[i].y * extent / (double ) scale);
304
323
}
0 commit comments