public void CanProcessOneOuterNonClosed()
        {
            // ARRANGE
            var relation = new Relation()
            {
                Tags = new Dictionary <string, string>()
                {
                    { "type", "multipolygon" },
                    { "tag", "tags" }
                }.ToTags(),
                Members = new List <RelationMember>()
                {
                    CreateRelationWayMember("outer", new Vector2d(0, 0), new Vector2d(3, 5),
                                            new Vector2d(7, 3)),
                    CreateRelationWayMember("outer", new Vector2d(7, 3), new Vector2d(8, -1),
                                            new Vector2d(3, -4), new Vector2d(0, 0)),
                }
            };
            var areas = new List <Area>();

            // ACT
            MultipolygonProcessor.FillAreas(relation, areas);

            // ASSERT
            Assert.AreEqual(1, areas.Count);
            var area = areas.First();

            Assert.AreEqual(6, area.Points.Count);
            Assert.AreEqual(0, area.Holes.Count);
        }
        public void CanProcessMultiplyOuterAndMultiplyInnerArbitaryTypes()
        {
            // see fig.6 http://wiki.openstreetmap.org/wiki/Talk:Relation:multipolygon
            // accessed 22.11.2014

            // ARRANGE
            var relation = new Relation()
            {
                Tags = new Dictionary <string, string>()
                {
                    { "type", "multipolygon" },
                    { "tag", "tags" }
                }.ToTags(),
                Members = new List <RelationMember>()
                {
                    CreateRelationWayMember("outer", new Vector2d(1, 5), new Vector2d(8, 4)),
                    CreateRelationWayMember("outer", new Vector2d(8, 4), new Vector2d(9, -1)),
                    CreateRelationWayMember("outer", new Vector2d(9, -1), new Vector2d(8, -6), new Vector2d(2, -5)),
                    CreateRelationWayMember("outer", new Vector2d(2, -5), new Vector2d(0, -3), new Vector2d(1, 5)),

                    CreateRelationWayMember("inner", new Vector2d(2, 1), new Vector2d(3, 3), new Vector2d(6, 3)),
                    CreateRelationWayMember("inner", new Vector2d(6, 3), new Vector2d(4, 0), new Vector2d(2, 1)),
                    CreateRelationWayMember("inner", new Vector2d(1, -2), new Vector2d(3, -1)),
                    CreateRelationWayMember("inner", new Vector2d(3, -1), new Vector2d(4, -4)),
                    CreateRelationWayMember("inner", new Vector2d(4, -4), new Vector2d(1, -3)),
                    CreateRelationWayMember("inner", new Vector2d(1, -3), new Vector2d(1, -2)),
                    CreateRelationWayMember("inner", new Vector2d(6, -3), new Vector2d(7, -1),
                                            new Vector2d(8, -4), new Vector2d(6, -3)),

                    CreateRelationWayMember("outer", new Vector2d(10, 5), new Vector2d(14, 5)),
                    CreateRelationWayMember("outer", new Vector2d(14, 5), new Vector2d(14, -1)),
                    CreateRelationWayMember("outer", new Vector2d(14, -1), new Vector2d(10, -1)),
                    CreateRelationWayMember("outer", new Vector2d(10, -1), new Vector2d(10, 5)),

                    CreateRelationWayMember("inner", new Vector2d(11, 4), new Vector2d(13, 4)),
                    CreateRelationWayMember("inner", new Vector2d(13, 4), new Vector2d(13, 0), new Vector2d(11, 0)),
                    CreateRelationWayMember("inner", new Vector2d(11, 0), new Vector2d(12, 2)),
                    CreateRelationWayMember("inner", new Vector2d(12, 2), new Vector2d(11, 4)),

                    CreateRelationWayMember("outer", new Vector2d(10, -3), new Vector2d(14, -3), new Vector2d(14, -6),
                                            new Vector2d(10, -6), new Vector2d(10, -3)),
                }
            };
            var areas = new List <Area>();

            // ACT
            MultipolygonProcessor.FillAreas(relation, areas);

            // ASSERT
            Assert.AreEqual(3, areas.Count);
            Assert.AreEqual(3, areas.Single(a => a.Points.Count == 7).Holes.Count);
            Assert.AreEqual(1, areas.Single(a => a.Points.Count == 5 && a.Points[0].Longitude > -2).Holes.Count); // select higher rectangle
            Assert.AreEqual(0, areas.Single(a => a.Points.Count == 5 && a.Points[0].Longitude < -2).Holes.Count); // select lower rectangle
        }
Exemplo n.º 3
0
 /// <inheritdoc />
 public virtual void VisitRelation(Relation relation) { }
Exemplo n.º 4
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));
        }