Example #1
0
        /// <summary> Adds way model to element source and scene. </summary>
        private void AddWayModel(long id, List <Vector2d> footprint, TagCollection tags)
        {
            EnsureElementSource(footprint.First());
            var nullPoint = _tileController.CurrentTile.RelativeNullPoint;

            var way = new Way()
            {
                Id          = id,
                Tags        = tags,
                Coordinates = footprint.Select(p => GeoProjection.ToGeoCoordinate(nullPoint, p)).ToList()
            };

            _elementSourceEditor.Add(way);
            way.Accept(new WayVisitor(_tileController.CurrentTile, _modelLoader, _objectPool));
        }
        private void AssertWays(Way expected, Way result)
        {
            Assert.AreEqual(expected.Id, result.Id);

            Assert.AreEqual(expected.Tags.Count, result.Tags.Count);
            for (var i = 0; i < expected.Tags.Count; i++)
            {
                Assert.AreEqual(expected.Tags[i], result.Tags[i]);
            }

            Assert.AreEqual(expected.Coordinates.Count, result.Coordinates.Count);
            for (var i = 0; i < expected.Coordinates.Count; i++)
            {
                AssertGeoCoordinates(expected.Coordinates[i], result.Coordinates[i]);
            }
        }
Example #3
0
        public void ProcessWay(Way way, int tagCount)
        {
            IndexStatistic.IncrementTotal(ElementType.Way);
            if (way.Id < 0)
            {
                IndexStatistic.Skip(way.Id, ElementType.Way);
                return;
            }

            var envelop = new Envelop();

            way.Coordinates = new List <GeoCoordinate>(way.NodeIds.Count);
            foreach (var nodeId in way.NodeIds)
            {
                if (!_nodes.ContainsKey(nodeId))
                {
                    IndexStatistic.Skip(way.Id, ElementType.Way);
                    return;
                }
                var coordinate = _nodes[nodeId];
                way.Coordinates.Add(coordinate.Unscale());
                envelop.Extend(coordinate.Latitude, coordinate.Longitude);
            }

            if (tagCount > 0)
            {
                uint offset = Store.Insert(way);
                Tree.Insert(offset, envelop);
                _wayOffsets.Add(way.Id, offset);
                IndexStatistic.Increment(ElementType.Way);
            }
            else
            {
                // keep it as it may be used by relation
                _ways.Add(way.Id, way);
            }
        }
Example #4
0
 /// <inheritdoc />
 public virtual void VisitWay(Way way) { }
Example #5
0
        public void ProcessRelation(Relation relation, int tagCount)
        {
            IndexStatistic.IncrementTotal(ElementType.Relation);
            if (relation.Id < 0)
            {
                IndexStatistic.Skip(relation.Id, ElementType.Relation);
                return;
            }

            var envelop = new Envelop();

            // this cicle prevents us to insert ways which are part of unresolved relation
            foreach (var member in relation.Members)
            {
                var type = (ElementType)member.TypeId;

                if (type == ElementType.Node || type == ElementType.Relation || // TODO not supported yet
                    (!_wayOffsets.ContainsKey(member.MemberId) && !_ways.ContainsKey(member.MemberId)))
                {
                    // outline relations should be ignored
                    if (type == ElementType.Relation && member.Role == "outline")
                    {
                        _skippedRelations.Add(member.MemberId);
                    }

                    _skippedRelations.Add(relation.Id);
                    IndexStatistic.Skip(relation.Id, ElementType.Relation);
                    return;
                }
            }

            foreach (var member in relation.Members)
            {
                var  type         = (ElementType)member.TypeId;
                uint memberOffset = 0;
                switch (type)
                {
                case ElementType.Way:
                    Way way = null;
                    if (_wayOffsets.ContainsKey(member.MemberId))
                    {
                        memberOffset = _wayOffsets[member.MemberId];
                        way          = Store.Get(memberOffset) as Way;
                    }
                    else if (_ways.ContainsKey(member.MemberId))
                    {
                        way          = _ways[member.MemberId];
                        memberOffset = Store.Insert(way);
                        _wayOffsets.Add(member.MemberId, memberOffset);
                    }
                    foreach (GeoCoordinate t in way.Coordinates)
                    {
                        envelop.Extend(new PointEnvelop(t));
                    }
                    break;

                default:
                    throw new InvalidOperationException("Unknown element type!");
                }
                // TODO merge tags?
                member.Offset = memberOffset;
            }
            _relations.Add(new MutableTuple <Relation, Envelop>(relation, envelop));
        }