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 }
/// <inheritdoc /> public virtual void VisitRelation(Relation relation) { }
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)); }