public GPost Read(Stream MapStream, int SectionId) { var postData = ReadBytes(MapStream, _recordLength); var ordinate = BitConverter.ToInt32(postData.Take(3).Concat(new byte[1]).ToArray(), 0); var flags = postData[3]; var direction = DecodeDirection((flags >> 7) & 0x01); var position = (PositionInSection)(flags & 0x03); var crossing = (flags & (1 << 6)) > 0; var point = new EarthPoint(BitConverter.ToInt32(postData, 4) * 10e-9 * 180 / Math.PI, BitConverter.ToInt32(postData, 8) * 10e-9 * 180 / Math.PI); var childrenStartAddress = SubInt(postData, 12, 3); var post = new GPost(ordinate, point, direction, position, SectionId, crossing); var previousPosition = MapStream.Position; MapStream.Seek(childrenStartAddress, SeekOrigin.Begin); var tracksCount = MapStream.ReadByte(); for (var i = 0; i < tracksCount; i++) { var track = _trackReader.Read(MapStream); if (track != null) { post.Tracks.Add(track); } } MapStream.Seek(previousPosition, SeekOrigin.Begin); return(post); }
private static IEnumerable <PositionedGObject> PositeObjects(GSection sec, GPost post) { GPost p2 = sec.Posts .Where(pp => (int)post.Direction * (post.Ordinate - pp.Ordinate) > 0) .OrderBy(pp => (int)post.Direction * (post.Ordinate - pp.Ordinate)).FirstOrDefault(); if (p2 == null) { yield break; } double l = post.Point.DistanceTo(p2.Point); foreach (var o in post.Tracks.First().Objects) { double ratio = (o.Ordinate - post.Ordinate) / l; var o_point = new EarthPoint( (1 - ratio) * post.Point.Latitude + ratio * p2.Point.Latitude, (1 - ratio) * post.Point.Longitude + ratio * p2.Point.Longitude); yield return(new PositionedGObject() { Object = o, Point = o_point }); } }
private static IEnumerable<PositionedGObject> PositeObjects(GSection sec, GPost post) { GPost p2 = sec.Posts .Where(pp => (int)post.Direction * (post.Ordinate - pp.Ordinate) > 0) .OrderBy(pp => (int)post.Direction * (post.Ordinate - pp.Ordinate)).FirstOrDefault(); if (p2 == null) yield break; double l = post.Point.DistanceTo(p2.Point); foreach (var o in post.Tracks.First().Objects) { double ratio = (o.Ordinate - post.Ordinate) / l; var o_point = new EarthPoint( (1 - ratio) * post.Point.Latitude + ratio * p2.Point.Latitude, (1 - ratio) * post.Point.Longitude + ratio * p2.Point.Longitude); yield return new PositionedGObject() { Object = o, Point = o_point }; } }
public KilometerPostMapElement(GPost Post) : base(Post.Point) { this.Post = Post; SectionBrush = Brushes.Aquamarine; }