/// <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]); } }
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); } }
/// <inheritdoc /> public virtual void VisitWay(Way way) { }
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)); }