Skip to content

Instantly share code, notes, and snippets.

@mourner
Last active August 29, 2015 14:12
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save mourner/39dbf31fa1a88be00fd8 to your computer and use it in GitHub Desktop.
How a generated pbf encoding/decoding code should look
'use strict';
exports.Tile = {read: readTile, write: writeTile};
exports.Layer = {read: readLayer, write: writeLayer};
exports.Feature = {read: readFeature, write: writeFeature};
exports.Value = {read: readValue, write: writeValue};
// decoding vector tile
function readTile(pbf, end) {
return pbf.readFields(readTileField, {layers: []}, end);
}
function readLayer(pbf, end) {
return pbf.readFields(readLayerField, {features: [], keys: [], values: []}, end);
}
function readFeature(pbf, end) {
return pbf.readFields(readFeatureField, {}, end);
}
function readValue(pbf, end) {
return pbf.readFields(readValueField, {}, end);
}
function readTileField(tag, tile, pbf) {
if (tag === 3) tile.layers.push(readMessage(readLayer, pbf));
}
function readLayerField(tag, layer, pbf) {
if (tag === 1) layer.name = pbf.readString();
else if (tag === 2) layer.features.push(readMessage(readFeature, pbf));
else if (tag === 3) layer.keys.push(pbf.readString());
else if (tag === 4) layer.values.push(readMessage(readValue, pbf));
else if (tag === 5) layer.extent = pbf.readVarint();
else if (tag === 15) layer.version = pbf.readVarint();
}
function readFeatureField(tag, feature, pbf) {
if (tag === 1) feature.id = pbf.readVarint();
else if (tag === 2) feature.tags = pbf.readPackedVarint();
else if (tag === 3) feature.type = pbf.readVarint();
else if (tag === 4) feature.geometry = pbf.readPackedVarint();
}
function readValueField(tag, value, pbf) {
if (tag === 1) value.string_value = pbf.readString();
else if (tag === 2) value.float_value = pbf.readFloat();
else if (tag === 3) value.double_value = pbf.readDouble();
else if (tag === 4) value.int_value = pbf.readVarint();
else if (tag === 5) value.uint_value = pbf.readVarint();
else if (tag === 6) value.sint_value = pbf.readSVarint();
else if (tag === 7) value.bool_value = pbf.readBoolean();
}
function readMessage(fn, pbf) {
return fn(pbf, pbf.readVarint() + pbf.pos);
}
// encoding vector tile
function writeTile(tile, pbf) {
if (tile.layers !== undefined) for (var i = 0; i < tile.layers.length; i++) pbf.writeMessage(3, writeLayer, tile.layers[i]);
}
function writeLayer(layer, pbf) {
if (layer.name !== undefined) pbf.writeStringField(1, layer.name);
var i;
if (layer.features !== undefined) for (i = 0; i < layer.features.length; i++) pbf.writeMessage(2, writeFeature, layer.features[i]);
if (layer.keys !== undefined) for (i = 0; i < layer.keys.length; i++) pbf.writeStringField(3, layer.keys[i]);
if (layer.values !== undefined) for (i = 0; i < layer.values.length; i++) pbf.writeMessage(4, writeValue, layer.values[i]);
if (layer.extent !== undefined) pbf.writeVarintField(5, layer.extent);
if (layer.version !== undefined) pbf.writeVarintField(15, layer.version);
}
function writeFeature(feature, pbf) {
if (feature.id !== undefined) pbf.writeVarintField(1, feature.id);
if (feature.tags !== undefined) pbf.writePackedVarint(2, feature.tags);
if (feature.type !== undefined) pbf.writeVarintField(3, feature.type);
if (feature.geometry !== undefined) pbf.writePackedVarint(4, feature.geometry);
}
function writeValue(value, pbf) {
if (value.string_value !== undefined) pbf.writeStringField(1, value.string_value);
if (value.float_value !== undefined) pbf.writeFloatField(2, value.float_value);
if (value.double_value !== undefined) pbf.writeDoubleField(3, value.double_value);
if (value.int_value !== undefined) pbf.writeVarintField(4, value.int_value);
if (value.uint_value !== undefined) pbf.writeVarintField(5, value.uint_value);
if (value.sint_value !== undefined) pbf.writeSVarintField(6, value.sint_value);
if (value.bool_value !== undefined) pbf.writeBooleanField(7, value.bool_value);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment