Example #1
0
        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);
        }