Ejemplo n.º 1
0
        private void WriteWay(SWay way)
        {
            if (waysCount == 0)
            {
                writer.Write((byte)0);
            }

            waysCount++;

            wayIdWriter.WriteZigZag(way.Id);
            writer.Write7BitEncodedInt((ulong)way.WayType);
            writer.Write7BitEncodedInt((ulong)way.Nodes.Count);

            wayNodeIdWriter.Reset();
            wayLatWriter.Reset();
            wayLonWriter.Reset();

            foreach (var node in way.Nodes)
            {
                wayNodesCount++;
                wayNodeIdWriter.WriteZigZag((long)node.Id);
                wayLatWriter.WriteZigZag(node.Lat);
                wayLonWriter.WriteZigZag(node.Lon);
            }
        }
Ejemplo n.º 2
0
        public void Add(SWay way)
        {
            foreach (var node in way.Nodes)
            {
                BoundingRect.Extend(node.Lat, node.Lon);
            }

            WriteWay(way);
        }
Ejemplo n.º 3
0
        public void Add(SWay way)
        {
            var split = FindBlock(way);

            split.Block.Add(way);

            if (split.Block.Size >= BlockLimit)
            {
                SplitBlock(split);
            }
        }
        private SWay CreateSWay(OsmWay way, IReadOnlyList <MapNode> nodes)
        {
            var sway = new SWay
            {
                Id      = way.Id,
                WayType = GetWayType(way),
                Nodes   = nodes.Select(x => new WayNode((ulong)x.Id, x.Lat, x.Lon)).ToList()
            };

            return(sway);
        }
Ejemplo n.º 5
0
        public void WriteWay(SWay way)
        {
            if (way == null)
            {
                throw new ArgumentNullException(nameof(way));
            }


            WriteWayData(way);

            AddOffsetsIndex((ulong)way.Id, infoStream.Position);
            WriteWayInfo(way);
        }
Ejemplo n.º 6
0
        private SWay[] ReadAllWays()
        {
            var split = reader.ReadByte();

            if (split != 0)
            {
                throw new InvalidOperationException("Not all ways were read.");
            }

            wayIdReader.Reset();
            wayNodeIdReader.Reset();
            wayLatReader.Reset();
            wayLonReader.Reset();

            var allWays = new SWay[waysCount];

            for (var i = 0; i < allWays.Length; i++)
            {
                var id    = wayIdReader.ReadZigZag();
                var type  = (int)reader.Read7BitEncodedInt();
                var count = (int)reader.Read7BitEncodedInt();

                wayLatReader.Reset();
                wayLonReader.Reset();

                var nodes = new List <WayNode>(count);
                for (var j = 0; j < count; j++)
                {
                    var nodeId = (ulong)wayNodeIdReader.ReadZigZag();
                    var lat    = (int)wayLatReader.ReadZigZag();
                    var lon    = (int)wayLonReader.ReadZigZag();

                    nodes.Add(new WayNode(
                                  nodeId,
                                  lat,
                                  lon
                                  ));
                }

                var way = new SWay
                {
                    Id      = id,
                    WayType = type,
                    Nodes   = nodes
                };

                allWays[i] = way;
            }

            return(allWays);
        }
Ejemplo n.º 7
0
        private void WriteWayInfo(SWay way)
        {
            infoWriter.Write7BitEncodedInt(way.Id);
            var rect = way.Rect;

            infoWriter.Write(rect.MinLat);
            infoWriter.Write(rect.MinLon);

            infoWriter.Write7BitEncodedInt(EncodeHelpers.EncodeZigZag(way.MidLat - rect.MinLat));
            infoWriter.Write7BitEncodedInt(EncodeHelpers.EncodeZigZag(way.MidLon - rect.MinLon));

            infoWriter.Write7BitEncodedInt(EncodeHelpers.EncodeZigZag(rect.MaxLat - way.MidLat));
            infoWriter.Write7BitEncodedInt(EncodeHelpers.EncodeZigZag(rect.MaxLon - way.MidLon));

            infoLength = infoStream.Position;
        }
Ejemplo n.º 8
0
        private void WriteWayData(SWay way)
        {
            idWriter.WriteIncrementOnly((ulong)way.Id);

            var nodes = way.Nodes;

            waysWriter.Write7BitEncodedInt((ulong)nodes.Count);

            nodeIdWriter.Reset();
            latWriter.Reset();
            lonWriter.Reset();

            foreach (var node in nodes)
            {
                nodeIdWriter.WriteZigZag(node.Id);
                latWriter.WriteZigZag(node.Lat);
                lonWriter.WriteZigZag(node.Lon);
            }
        }