/// <summary> /// Applies a changeset. /// </summary> public DiffResultResult ApplyChangeset(long id, OsmChange changeset) { if (changeset == null) { throw new ArgumentNullException("changeset"); } var results = new List <OsmGeoResult>(); var nodeTransforms = new Dictionary <long, long>(); var wayTransforms = new Dictionary <long, long>(); var relationTransforms = new Dictionary <long, long>(); if (changeset.Create != null) { foreach (var create in changeset.Create) { var newId = this.GetNextId(create.Type); switch (create.Type) { case OsmGeoType.Node: nodeTransforms.Add(create.Id.Value, newId); break; case OsmGeoType.Way: var way = create as Way; for (var i = 0; i < way.Nodes.Length; i++) { long newNodeId; if (nodeTransforms.TryGetValue(way.Nodes[i], out newNodeId)) { way.Nodes[i] = newNodeId; } } wayTransforms.Add(create.Id.Value, newId); break; case OsmGeoType.Relation: var relation = create as Relation; for (var i = 0; i < relation.Members.Length; i++) { long newMemberId; var member = relation.Members[i]; switch (member.Type) { case OsmGeoType.Node: if (nodeTransforms.TryGetValue(member.Id, out newMemberId)) { member.Id = newMemberId; } break; case OsmGeoType.Way: if (wayTransforms.TryGetValue(member.Id, out newMemberId)) { member.Id = newMemberId; } break; case OsmGeoType.Relation: if (relationTransforms.TryGetValue(member.Id, out newMemberId)) { member.Id = newMemberId; } break; } relation.Members[i] = member; } relationTransforms.Add(create.Id.Value, newId); break; } results.Add(OsmGeoResult.CreateCreation( create, newId)); create.Id = newId; create.Version = 1; create.TimeStamp = DateTime.Now.ToUniversalTime(); create.Visible = true; } this.Add(changeset.Create); } if (changeset.Modify != null) { _db.Archive(changeset.Modify.Select(x => new OsmGeoKey() { Id = x.Id.Value, Type = x.Type })); foreach (var modify in changeset.Modify) { results.Add(OsmGeoResult.CreateModification( modify, modify.Version.Value + 1)); switch (modify.Type) { case OsmGeoType.Way: var way = modify as Way; for (var i = 0; i < way.Nodes.Length; i++) { long newNodeId; if (nodeTransforms.TryGetValue(way.Nodes[i], out newNodeId)) { way.Nodes[i] = newNodeId; } } break; case OsmGeoType.Relation: var relation = modify as Relation; for (var i = 0; i < relation.Members.Length; i++) { long newMemberId; var member = relation.Members[i]; switch (member.Type) { case OsmGeoType.Node: if (nodeTransforms.TryGetValue(member.Id, out newMemberId)) { member.Id = newMemberId; } break; case OsmGeoType.Way: if (wayTransforms.TryGetValue(member.Id, out newMemberId)) { member.Id = newMemberId; } break; case OsmGeoType.Relation: if (relationTransforms.TryGetValue(member.Id, out newMemberId)) { member.Id = newMemberId; } break; } relation.Members[i] = member; } break; } modify.Version = modify.Version + 1; modify.TimeStamp = DateTime.Now.ToUniversalTime(); modify.Visible = true; } _db.Add(changeset.Modify); } if (changeset.Delete != null) { foreach (var delete in changeset.Delete) { results.Add(OsmGeoResult.CreateDeletion( delete)); } _db.Archive(changeset.Delete.Select(x => new OsmGeoKey() { Id = x.Id.Value, Type = x.Type })); } return(new DiffResultResult(new DiffResult() { Results = results.ToArray(), Generator = "OsmSharp", Version = 0.6f }, DiffResultStatus.BestEffortOK)); }
/// <summary> /// Applies a changeset. /// </summary> public DiffResultResult ApplyChangeset(long id, OsmChange changeset) { if (changeset == null) { throw new ArgumentNullException("changeset"); } var results = new List <OsmGeoResult>(); if (changeset.Modify != null) { _db.Archive(changeset.Modify.Select(x => new OsmGeoKey() { Id = x.Id.Value, Type = x.Type })); foreach (var modify in changeset.Modify) { results.Add(OsmGeoResult.CreateModification( modify, modify.Version.Value + 1)); modify.Version = modify.Version + 1; modify.TimeStamp = DateTime.Now.ToUniversalTime(); modify.Visible = true; } _db.Add(changeset.Modify); } if (changeset.Delete != null) { foreach (var delete in changeset.Delete) { results.Add(OsmGeoResult.CreateDeletion( delete)); } _db.Archive(changeset.Delete.Select(x => new OsmGeoKey() { Id = x.Id.Value, Type = x.Type })); } if (changeset.Create != null) { foreach (var create in changeset.Create) { var newId = this.GetNextId(create.Type); results.Add(OsmGeoResult.CreateCreation( create, newId)); create.Id = newId; create.Version = 1; create.TimeStamp = DateTime.Now.ToUniversalTime(); create.Visible = true; } this.Add(changeset.Create); } return(new DiffResultResult(new DiffResult() { Results = results.ToArray(), Generator = "OsmSharp", Version = 0.6f }, DiffResultStatus.BestEffortOK)); }