Exemplo n.º 1
0
        /// <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));
        }
Exemplo n.º 2
0
        /// <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));
        }