public void Read(byte[] data) { if (data == null) { throw new Exception("Tile data cannot be null"); } if (data.Length < 1) { throw new Exception("Tile data cannot be empty"); } if (data[0] == 0x1f && data[1] == 0x8b) { return; } OnlineMapsPBFReader reader = new OnlineMapsPBFReader(data); while (reader.NextByte()) { if (reader.tag != (int)TileType.Layers) { reader.Skip(); continue; } string name = null; byte[] layerMessage = reader.View(); OnlineMapsPBFReader layerView = new OnlineMapsPBFReader(layerMessage); while (layerView.NextByte()) { if (layerView.tag == (int)LayerType.Name) { name = layerView.GetString((ulong)layerView.Varint()); } else { layerView.Skip(); } } layers.Add(name, layerMessage); } }
public static Feature GetFeature(Layer layer, int index) { byte[] data = layer.featuresData[index]; OnlineMapsPBFReader reader = new OnlineMapsPBFReader(data); Feature feature = new Feature(layer); while (reader.NextByte()) { switch ((FeatureType)reader.tag) { case FeatureType.Id: feature.id = (ulong)reader.Varint(); break; case FeatureType.Tags: List <int> tags = reader.GetPackedUnit32().Select(t => (int)t).ToList(); feature.tags = tags; break; case FeatureType.Type: int geomType = (int)reader.Varint(); feature.geometryType = (GeomType)geomType; break; case FeatureType.Geometry: feature.geometryCommands = reader.GetPackedUnit32(); break; default: reader.Skip(); break; } } return(feature); }
private static Layer GetLayer(byte[] data) { Layer layer = new Layer(); OnlineMapsPBFReader layerReader = new OnlineMapsPBFReader(data); while (layerReader.NextByte()) { switch ((LayerType)layerReader.tag) { case LayerType.Version: layer.version = (ulong)layerReader.Varint(); break; case LayerType.Name: layer.name = layerReader.GetString((ulong)layerReader.Varint()); break; case LayerType.Extent: layer.extent = (ulong)layerReader.Varint(); break; case LayerType.Keys: byte[] keyBuffer = layerReader.View(); string key = Encoding.UTF8.GetString(keyBuffer, 0, keyBuffer.Length); layer.keys.Add(key); break; case LayerType.Values: byte[] valueBuffer = layerReader.View(); OnlineMapsPBFReader valReader = new OnlineMapsPBFReader(valueBuffer); while (valReader.NextByte()) { switch ((ValueType)valReader.tag) { case ValueType.String: byte[] stringBuffer = valReader.View(); string value = Encoding.UTF8.GetString(stringBuffer, 0, stringBuffer.Length); layer.values.Add(value); break; case ValueType.Float: layer.values.Add(valReader.GetFloat()); break; case ValueType.Double: layer.values.Add(valReader.GetDouble()); break; case ValueType.Int: layer.values.Add(valReader.Varint()); break; case ValueType.UInt: case ValueType.SInt: layer.values.Add(valReader.Varint()); break; case ValueType.Bool: layer.values.Add(valReader.Varint() == 1); break; } } break; case LayerType.Features: layer.featuresData.Add(layerReader.View()); break; default: layerReader.Skip(); break; } } return(layer); }