Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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
                });
            }
        }
Ejemplo n.º 3
0
        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;
 }