public static VectorTileFeature Parse(Tile.Feature feature, List <string> keys, List <Tile.Value> values, uint extent) { var result = new VectorTileFeature(); var id = feature.Id; var geom = GeometryParser.ParseGeometry(feature.Geometry, feature.Type); result.GeometryType = feature.Type; // add the geometry result.Geometry = geom; result.Extent = extent; // now add the attributes result.Id = id.ToString(CultureInfo.InvariantCulture); result.Attributes = AttributesParser.Parse(keys, values, feature.Tags); return(result); }
/// <summary> /// Encodes a Mapbox .mvt tile /// </summary> /// <param name="layers">List of VectorTileLayers to encode. A Tile should contain at least one layer</param> /// <param name="stream">output .mvt tile stream</param> public static void Encode(List <VectorTileLayer> layers, Stream stream) { Tile tile = new Tile(); foreach (var vectorTileLayer in layers) { Tile.Layer tileLayer = new Tile.Layer(); tile.Layers.Add(tileLayer); tileLayer.Name = vectorTileLayer.Name; tileLayer.Version = vectorTileLayer.Version; tileLayer.Extent = vectorTileLayer.Extent; //index the key value attributes List <string> keys = new List <string> (); List <AttributeKeyValue> values = new List <AttributeKeyValue>(); Dictionary <string, int> keysIndex = new Dictionary <string, int>(); Dictionary <dynamic, int> valuesIndex = new Dictionary <dynamic, int>(); foreach (var feature in vectorTileLayer.VectorTileFeatures) { foreach (var keyValue in feature.Attributes) { if (!keysIndex.ContainsKey(keyValue.Key)) { keysIndex.Add(keyValue.Key, keys.Count); keys.Add(keyValue.Key); } if (!valuesIndex.ContainsKey(keyValue.Value)) { valuesIndex.Add(keyValue.Value, values.Count); values.Add(keyValue); } } } for (int n = 0; n < vectorTileLayer.VectorTileFeatures.Count; ++n) { var feature = vectorTileLayer.VectorTileFeatures[n]; Tile.Feature tileFeature = new Tile.Feature(); tileLayer.Features.Add(tileFeature); ulong id; if (!ulong.TryParse(feature.Id, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out id)) { id = (ulong)(n + 1); } tileFeature.Id = id; tileFeature.Type = feature.GeometryType; GeometryParser.EncodeGeometry(feature.Geometry, feature.GeometryType, tileFeature.Geometry); foreach (var keyValue in feature.Attributes) { tileFeature.Tags.Add((uint)keysIndex[keyValue.Key]); tileFeature.Tags.Add((uint)valuesIndex[keyValue.Value]); } } tileLayer.Keys.AddRange(keys); foreach (var value in values) { tileLayer.Values.Add(AttributeKeyValue.ToTileValue(value)); } } Serializer.Serialize <Tile>(stream, tile); }