Skip to content

Instantly share code, notes, and snippets.

@mourner
Created September 30, 2015 08:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mourner/a7c6ea76f450bb92e316 to your computer and use it in GitHub Desktop.
Save mourner/a7c6ea76f450bb92e316 to your computer and use it in GitHub Desktop.
A proof of concept for efficient point encoding in vector tiles
var tile = require('./points.json');
tile.layers.forEach(function (layer) {
layer.id = [];
layer.geometry = [];
layer.tags = [];
var x0 = 0;
var y0 = 0;
var id = 0;
layer.features.sort(compareFeatures);
for (var k = 0; k < layer.features.length; k++) {
var f = layer.features[k];
layer.id.push(f.id - id);
id = f.id;
var x = fromZigZag(f.geometry[1]);
var y = fromZigZag(f.geometry[2]);
layer.geometry.push(toZigZag(x - x0));
layer.geometry.push(toZigZag(y - y0));
var tags = [];
for (var i = 0; i < f.tags.length; i += 2) {
tags[i / 2] = f.tags[i + 1];
}
for (i = 0; i < layer.keys.length; i++) {
layer.tags.push(tags[i] || 0);
}
x0 = x;
y0 = y;
}
delete layer.features;
});
console.log(JSON.stringify(tile));
function compareFeatures(a, b) {
// return zOrder(a) - zOrder(b);
return a.id - b.id;
}
function fromZigZag(n) {
return n % 2 === 0 ? n / 2 : -(n + 1) / 2;
}
function toZigZag(n) {
return n >= 0 ? n * 2 : -n * 2 - 1;
}
function zOrder(f) {
x = Math.round(1024 * (fromZigZag(f.geometry[1]) + 1024) / 6144);
y = Math.round(1024 * (fromZigZag(f.geometry[2]) + 1024) / 6144);
x = (x | (x << 8)) & 0x00FF00FF;
x = (x | (x << 4)) & 0x0F0F0F0F;
x = (x | (x << 2)) & 0x33333333;
x = (x | (x << 1)) & 0x55555555;
y = (y | (y << 8)) & 0x00FF00FF;
y = (y | (y << 4)) & 0x0F0F0F0F;
y = (y | (y << 2)) & 0x33333333;
y = (y | (y << 1)) & 0x55555555;
return x | (y << 1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment