slides/webgl/asset/data/compress.js (55 lines of code) (raw):
function compress(json) {
json.UTF8Encoding = true;
json.UTF8Scale = 1e6;
var features = json.features;
features.forEach(function (feature){
var encodeOffsets = feature.geometry.encodeOffsets = [];
var coordinates = feature.geometry.coordinates;
if (feature.geometry.type === 'MultiPolygon') {
coordinates.forEach(function (polygon, idx1){
encodeOffsets[idx1] = [];
polygon.forEach(function (coordinate, idx2) {
coordinates[idx1][idx2] = encodePolygon(
coordinate, encodeOffsets[idx1][idx2] = []
);
});
});
}
else {
coordinates.forEach(function (coordinate, idx){
coordinates[idx] = encodePolygon(
coordinate, encodeOffsets[idx] = []
);
});
}
});
return json;
}
function encodePolygon(coordinates, encodeOffsets) {
var result = '';
var prevX = quantize(coordinates[0][0]);
var prevY = quantize(coordinates[0][1]);
// Store the origin offset
encodeOffsets[0] = prevX;
encodeOffsets[1] = prevY;
for (var i = 0; i < coordinates.length; i++) {
var point = coordinates[i];
result += encode(point[0], prevX);
result += encode(point[1], prevY);
prevX = quantize(point[0]);
prevY = quantize(point[1]);
}
return result;
}
function quantize(val) {
return Math.ceil(val * 1e6);
}
function encode(val, prev){
// Quantization
val = quantize(val);
// var tmp = val;
// Delta
var delta = val - prev;
if (((delta << 1) ^ (delta >> 15)) + 64 === 8232) {
//WTF, 8232 will get syntax error in js code
delta--;
}
// ZigZag
delta = (delta << 1) ^ (delta >> 15);
// add offset and get unicode
return String.fromCharCode(delta + 64);
// var tmp = {'tmp' : str};
// try{
// eval("(" + JSON.stringify(tmp) + ")");
// }catch(e) {
// console.log(val + 64);
// }
}
module.exports = compress;