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); } }
public void Add(SWay way) { foreach (var node in way.Nodes) { BoundingRect.Extend(node.Lat, node.Lon); } WriteWay(way); }
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); }
public void WriteWay(SWay way) { if (way == null) { throw new ArgumentNullException(nameof(way)); } WriteWayData(way); AddOffsetsIndex((ulong)way.Id, infoStream.Position); WriteWayInfo(way); }
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); }
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; }
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); } }