private async Task Updatehighways(OsmChange changes)
        {
            var deleteTasks = new List <Task>();

            foreach (var highwaysToRemove in changes.Delete.OfType <Way>())
            {
                var task = _elasticSearchGateway.DeleteHighwaysById(highwaysToRemove.Id.ToString());
                deleteTasks.Add(task);
            }
            await Task.WhenAll(deleteTasks);

            var updateTasks = new List <Task <CompleteWay> >();

            foreach (var highwaysToUpdate in changes.Modify
                     .Concat(changes.Create)
                     .OfType <Way>()
                     .Where(w => w.Tags != null && w.Tags.ContainsKey("highway")))
            {
                var task = _osmGateway.GetCompleteWay(highwaysToUpdate.Id.ToString());
                updateTasks.Add(task);
            }
            var updatedWays = await Task.WhenAll(updateTasks);

            var geoJsonHighways = _osmGeoJsonPreprocessorExecutor.Preprocess(updatedWays.ToList());
            await _elasticSearchGateway.UpdateHighwaysData(geoJsonHighways);
        }
Exemplo n.º 2
0
        public void TestUpdate_OsmChangeFileWithDeletion_ShouldDeleteFromDatabase()
        {
            var changes = new OsmChange
            {
                Create = new OsmGeo[0],
                Modify = new OsmGeo[0],
                Delete = new OsmGeo[] {
                    new Way()
                    {
                        Id = 1, Tags = new TagsCollection {
                            { "highway", "track" }
                        }
                    }
                }
            };

            _geoJsonPreprocessorExecutor
            .Preprocess(Arg.Is <Dictionary <string, List <ICompleteOsmGeo> > >(x => x.Values.Count == 0))
            .Returns(new List <Feature>());
            _geoJsonPreprocessorExecutor
            .Preprocess(Arg.Is <List <CompleteWay> >(x => x.Count == 0))
            .Returns(new List <Feature>());

            _service.Update(changes).Wait();

            _elasticSearchGateway.Received(1).DeleteHighwaysById("way_1");
            _elasticSearchGateway.Received(1).DeleteOsmPointOfInterestById("way_1");
        }
Exemplo n.º 3
0
        public void TestUpdate_OsmChangeFileWithModification_ShouldUpdateDatabase()
        {
            var way = new CompleteWay()
            {
                Id   = 1,
                Tags = new TagsCollection {
                    { "highway", "track" }, { "route", "bicycle" }
                },
                Nodes = new Node[0]
            };
            var changes = new OsmChange
            {
                Create = new OsmGeo[0],
                Modify = new OsmGeo[] { way.ToSimple() },
                Delete = new OsmGeo[0]
            };
            var list = new List <Feature> {
                new Feature(new LineString(new Coordinate[0]), new AttributesTable())
            };

            _geoJsonPreprocessorExecutor
            .Preprocess(Arg.Is <Dictionary <string, List <ICompleteOsmGeo> > >(x => x.Values.Count == 1))
            .Returns(list);
            _geoJsonPreprocessorExecutor
            .Preprocess(Arg.Is <List <CompleteWay> >(x => x.Count == 1))
            .Returns(list);
            _osmGateway.GetCompleteWay(1).Returns(way);

            _service.Update(changes).Wait();

            _elasticSearchGateway.Received(1).UpdatePointsOfInterestData(Arg.Is <List <Feature> >(x => x.Count == 1));
            _elasticSearchGateway.Received(1).UpdateHighwaysData(Arg.Is <List <Feature> >(x => x.Count == 1));
        }
Exemplo n.º 4
0
        /// <summary>
        /// Applies the given changes.
        /// </summary>
        public void ApplyChangeset(OsmChange changeset)
        {
            if (changeset == null)
            {
                throw new ArgumentNullException("changeset");
            }

            if (changeset.Delete != null)
            {
                this.Delete(changeset.Delete.Select(x => new OsmGeoKey()
                {
                    Id   = x.Id.Value,
                    Type = x.Type
                }));
            }

            if (changeset.Modify != null)
            {
                this.AddOrUpdate(changeset.Modify);
            }

            if (changeset.Create != null)
            {
                this.AddOrUpdate(changeset.Create);
            }
        }
        private async Task UpdatePointsOfInterest(OsmChange changes)
        {
            var deleteTasks            = new List <Task>();
            var relevantTagsDictionary = _tagsHelper.GetAllTags();

            foreach (var poiToRemove in changes.Delete)
            {
                var task = _elasticSearchGateway.DeletePointOfInterestById(poiToRemove.Id.ToString(), poiToRemove.Type.ToString().ToLower());
                deleteTasks.Add(task);
            }
            await Task.WhenAll(deleteTasks);

            var updateTasks = new List <Task <ICompleteOsmGeo> >();

            foreach (var poiToUpdate in changes.Modify
                     .Concat(changes.Create)
                     .Where(o => IsRelevantPointOfInterest(o, relevantTagsDictionary)))
            {
                var task = _osmGateway.GetElement(poiToUpdate.Id.ToString(), poiToUpdate.Type.ToString().ToLower());
                updateTasks.Add(task);
            }
            var allElemets = await Task.WhenAll(updateTasks);

            var osmNamesDictionary     = allElemets.GroupBy(e => e.Tags.GetName()).ToDictionary(g => g.Key, g => g.ToList());
            var geoJsonNamesDictionary = _osmGeoJsonPreprocessorExecutor.Preprocess(osmNamesDictionary);

            await _elasticSearchGateway.UpdatePointsOfInterestData(geoJsonNamesDictionary.Values.SelectMany(v => v).ToList());
        }
        /// <inheritdoc />
        public async Task Update(OsmChange changes)
        {
            _logger.LogInformation("Staring updating from OSM change file");
            await Updatehighways(changes);
            await UpdatePointsOfInterest(changes);

            _logger.LogInformation("Finished updating from OSM change file");
        }
Exemplo n.º 7
0
        public void TestSerialize()
        {
            var osmChange = new OsmChange()
            {
                Version   = 0.6,
                Generator = "OsmSharp",
                Create    = new OsmGeo[]
                {
                    new Node()
                    {
                        Id = 1
                    },
                    new Way()
                    {
                        Id = 10
                    },
                    new Relation()
                    {
                        Id = 100
                    }
                },
                Modify = new OsmGeo[]
                {
                    new Node()
                    {
                        Id = 2
                    },
                    new Way()
                    {
                        Id = 20
                    },
                    new Relation()
                    {
                        Id = 200
                    }
                },
                Delete = new OsmGeo[]
                {
                    new Node()
                    {
                        Id = 3
                    },
                    new Way()
                    {
                        Id = 30
                    },
                    new Relation()
                    {
                        Id = 300
                    }
                }
            };

            var result = osmChange.SerializeToXml();

            Assert.AreEqual("<osmChange generator=\"OsmSharp\" version=\"0.6\"><create><node id=\"1\" /><way id=\"10\" /><relation id=\"100\" /></create><modify><node id=\"2\" /><way id=\"20\" /><relation id=\"200\" /></modify><delete><node id=\"3\" /><way id=\"30\" /><relation id=\"300\" /></delete></osmChange>",
                            result);
        }
Exemplo n.º 8
0
        public DiffResult Upload(OsmChange item)
        {
            // Won't need this cast after updating OsmApiClient
            var changesetId = Client.CreateChangeset((TagsCollection)Tags).Result;
            var diffResult  = Client.UploadChangeset(changesetId, item).Result;

            Client.CloseChangeset(changesetId).Wait();
            return(diffResult);
        }
Exemplo n.º 9
0
        public void TestSquashDeleteModifiedCreation()
        {
            var changeset1 = new OsmChange()
            {
                Create = new OsmGeo[]
                {
                    new Node()
                    {
                        Id      = 1,
                        Version = 1
                    }
                },
                Generator = "OsmSharp",
                Version   = 6
            };
            var changeset2 = new OsmChange()
            {
                Modify = new OsmGeo[]
                {
                    new Node()
                    {
                        Id      = 1,
                        Version = 3
                    }
                },
                Generator = "OsmSharp",
                Version   = 6
            };
            var changeset3 = new OsmChange()
            {
                Delete = new OsmGeo[]
                {
                    new Node()
                    {
                        Id      = 1,
                        Version = 3
                    }
                },
                Generator = "OsmSharp",
                Version   = 6
            };

            // doing the squashing, should undo the creation that was modified.
            var squashed = new[] { changeset1, changeset2, changeset3 }.Squash();

            Assert.IsNotNull(squashed.Create);
            Assert.AreEqual(0, squashed.Create.Length);
            Assert.IsNotNull(squashed.Delete);
            Assert.AreEqual(0, squashed.Delete.Length);
            Assert.IsNotNull(squashed.Modify);
            Assert.AreEqual(0, squashed.Modify.Length);

            Assert.AreEqual("OsmSharp", squashed.Generator);
            Assert.AreEqual(6, squashed.Version);
        }
        /// <summary>
        /// Adds changes.
        /// </summary>
        public void AddChanges(long id, OsmChange changes)
        {
            Tuple <Changeset, List <OsmChange> > existing;

            if (!_changesets.TryGetValue(id, out existing) ||
                existing.Item1.ClosedAt.HasValue)
            {
                throw new Exception("Cannot add changes to a non-existing or closed changetset.");
            }
            existing.Item2.Add(changes);
        }
Exemplo n.º 11
0
        private async Task <Stream> CreateStream(OsmChange changes)
        {
            await Task.Delay(100);

            Stream stream     = new MemoryStream();
            var    serializer = new XmlSerializer(typeof(OsmChange));

            serializer.Serialize(stream, changes);
            stream.Seek(0, SeekOrigin.Begin);
            return(stream);
        }
Exemplo n.º 12
0
        public void PutUpdateData_Local_ShouldUpdate()
        {
            var changes = new OsmChange {
                Create = new OsmGeo[] { new Node() }
            };

            _osmLatestFileFetcherExecutor.GetUpdates().Returns(CreateStream(changes));
            SetupContext(IPAddress.Parse("1.2.3.4"), IPAddress.Loopback);

            _controller.PutUpdateData().Wait();

            _databasesUpdaterService.Received(1).Update(Arg.Is <OsmChange>(x => x.Create.Length == changes.Create.Length));
        }
Exemplo n.º 13
0
        public static OsmChange[] GetChangesFromChangesets(params long[] changeIds)
        {
            var changes = new List <OsmChange>();

            foreach (var changeId in changeIds)
            {
                OsmChange change = FileSerializer.ReadXmlCacheOrSource(@"CachesChanges\" + changeId + ".osc",
                                                                       () => { Thread.Sleep(15000); return(OsmApiClient.GetChangesetDownload(changeId).Result); });
                changes.Add(change);
            }

            return(changes.ToArray());
        }
Exemplo n.º 14
0
        public static void FixImportedNames()
        {
            var nameIndex = OneOffs.GetAllChangeElements(e => e.Tags != null && e.Tags.ContainsKey("addr:unit"))
                            .GroupBy(e => e.Tags["addr:unit"])
                            .ToDictionary(g => g.Key, g => g.ToArray());

            Console.Write(string.Join(Environment.NewLine,
                                      nameIndex.OrderByDescending(kvp => kvp.Value.Length).Select(kvp => kvp.Value.Length + "x: " + kvp.Key + "\texample: " + kvp.Value.First().Type + " " + kvp.Value.First().Id)));
            var nameDestinations = new Dictionary <string, string>
            {
            };
            var toUpdate = new List <OsmGeo>();

            var currentKeys = nameDestinations.Keys.SelectMany(n => nameIndex[n].Select(e => new OsmGeoKey(e))).Distinct().ToArray();
            var allCurrents = GetCurrentVersionOfElements(currentKeys).ToDictionary(e => new OsmGeoKey(e));
            var missing     = currentKeys.Except(allCurrents.Keys).Select(k => k.Type + " " + k.Id).ToArray();

            foreach (var name in nameDestinations)
            {
                var keys = nameIndex[name.Key].Select(e => new OsmGeoKey(e)).ToArray();

                var currents = keys
                               .Where(k => allCurrents.ContainsKey(k))
                               .Select(k => allCurrents[k])
                               .Where(e => e.Visible == true && e.Tags != null && e.Tags.Contains("addr:unit", name.Key))
                               .ToArray();

                foreach (var element in currents)
                {
                    if (name.Value == null)
                    {
                        element.Tags.RemoveKey("addr:unit");
                    }
                    else
                    {
                        element.Tags.AddOrReplace("addr:unit", name.Value);
                    }

                    toUpdate.Add(element);
                }
            }

            var fix = new OsmChange()
            {
                Modify = toUpdate.ToArray()
            };

            FileSerializer.WriteXml("temp change.osc", fix);
            var changesetTags = GetCommitTags($"Fixing bad addr:unit previously imported.");
            var fixIds        = Subjects.UploadChange(fix, changesetTags, @"FIX Offices\Uploaded\").Result;
        }
Exemplo n.º 15
0
        /// <summary>
        /// Adds the given changeset.
        /// </summary>
        public void Add(Changeset meta, OsmChange changes)
        {
            if (meta == null)
            {
                throw new ArgumentNullException(nameof(meta));
            }
            if (changes == null)
            {
                throw new ArgumentNullException(nameof(changes));
            }

            _db.AddOrUpdate(meta);
            _db.AddChanges(meta.Id.Value, changes);
        }
Exemplo n.º 16
0
        public void PutUpdateData_FromTwoThreads_ShouldUpdateTwice()
        {
            var changes = new OsmChange {
                Create = new OsmGeo[] { new Node() }
            };

            _osmLatestFileFetcherExecutor.GetUpdates().Returns(CreateStream(changes), CreateStream(changes));
            SetupContext(IPAddress.Parse("1.2.3.4"), IPAddress.Loopback);

            _controller.PutUpdateData().ContinueWith((t) => { });
            _controller.PutUpdateData().Wait();

            _elasticSearchUpdaterService.Received(2).Update(Arg.Is <OsmChange>(x => x.Create.Length == changes.Create.Length));
        }
Exemplo n.º 17
0
        /// <inheritdoc />
        public async Task <DiffResult> UploadChangeset(long changesetId, OsmChange osmChange)
        {
            var elements = new OsmGeo[][] { osmChange.Create, osmChange.Modify, osmChange.Delete }
            .Where(c => c != null).SelectMany(c => c);

            foreach (var osmGeo in elements)
            {
                osmGeo.ChangeSetId = changesetId;
            }

            var address = BaseAddress + $"0.6/changeset/{changesetId}/upload";
            var request = new StringContent(osmChange.SerializeToXml());

            return(await Post <DiffResult>(address, request));
        }
Exemplo n.º 18
0
        private static async Task <long> UploadChangePart(this OsmChange part,
                                                          TagsCollection tags, BasicAuthClient client, string pathForFiles)
        {
            var changeSetId = await client.CreateChangeset(tags);

            Log.LogDebug($"Creating ChangeSet {changeSetId}");
            FileSerializer.WriteXml(Path.Combine(pathForFiles, $"{changeSetId}-Conflated.osc"), part);
            var diffResult = await client.UploadChangeset(changeSetId, part);

            FileSerializer.WriteXml(Path.Combine(pathForFiles, $"{changeSetId}-DiffResult.diff"), diffResult);
            await client.CloseChangeset(changeSetId);

            Log.LogDebug($"Closing ChangeSet {changeSetId}");
            return(changeSetId);
        }
        private async Task UpdatePointsOfInterest(OsmChange changes)
        {
            var deleteTasks            = new List <Task>();
            var relevantTagsDictionary = _tagsHelper.GetAllTags();

            foreach (var poiToRemove in changes.Delete)
            {
                var task = _elasticSearchGateway.DeleteOsmPointOfInterestById(poiToRemove.Type.ToString().ToLower() + "_" + poiToRemove.Id);
                deleteTasks.Add(task);
            }
            await Task.WhenAll(deleteTasks);

            var updateTasks = new List <Task <ICompleteOsmGeo> >();

            foreach (var poiToUpdate in changes.Modify
                     .Concat(changes.Create)
                     .Where(o => IsRelevantPointOfInterest(o, relevantTagsDictionary)))
            {
                var task = _osmGateway.GetCompleteElement(poiToUpdate.Id.Value, poiToUpdate.Type);
                updateTasks.Add(task);
            }
            var allElemets = await Task.WhenAll(updateTasks);

            var osmNamesDictionary = allElemets.GroupBy(e => e.Tags.GetName()).ToDictionary(g => g.Key, g => g.ToList());
            var features           = _osmGeoJsonPreprocessorExecutor.Preprocess(osmNamesDictionary);

            foreach (var poiToUpdate in changes.Modify
                     .Where(o => IsRelevantPointOfInterest(o, relevantTagsDictionary)))
            {
                var featureFromDb = await _elasticSearchGateway.GetPointOfInterestById(poiToUpdate.Type.ToString().ToLower() + "_" + poiToUpdate.Id, Sources.OSM);

                if (featureFromDb == null)
                {
                    continue;
                }
                var featureToUpdate = features.First(f => f.GetId().Equals(featureFromDb.GetId()));
                foreach (var attributeKey in featureFromDb.Attributes.GetNames().Where(n => n.StartsWith(FeatureAttributes.POI_PREFIX)))
                {
                    featureToUpdate.Attributes.AddOrUpdate(attributeKey, featureFromDb.Attributes[attributeKey]);
                }
                if (featureToUpdate.Geometry.OgcGeometryType == OgcGeometryType.Point &&
                    featureFromDb.Geometry.OgcGeometryType != OgcGeometryType.Point)
                {
                    featureToUpdate.Geometry = featureFromDb.Geometry;
                }
            }
            await _elasticSearchGateway.UpdatePointsOfInterestData(features);
        }
Exemplo n.º 20
0
        public void TestSquashOneSet()
        {
            var changeset = new OsmChange()
            {
                Create = new OsmGeo[]
                {
                    new Node()
                    {
                        Id      = 1,
                        Version = 1
                    }
                },
                Delete = new OsmGeo[]
                {
                    new Way()
                    {
                        Id      = 1,
                        Version = 1
                    }
                },
                Modify = new OsmGeo[]
                {
                    new Relation()
                    {
                        Id      = 1,
                        Version = 2
                    }
                },
                Generator = "OsmSharp",
                Version   = 6
            };

            // doing the squashing, nothing should happen.
            var squashed = new[] { changeset }.Squash();

            Assert.IsNotNull(squashed.Create);
            Assert.AreEqual(1, squashed.Create.Length);
            Assert.AreEqual(OsmGeoType.Node, squashed.Create[0].Type);
            Assert.IsNotNull(squashed.Delete);
            Assert.AreEqual(1, squashed.Delete.Length);
            Assert.AreEqual(OsmGeoType.Way, squashed.Delete[0].Type);
            Assert.IsNotNull(squashed.Modify);
            Assert.AreEqual(1, squashed.Modify.Length);
            Assert.AreEqual(OsmGeoType.Relation, squashed.Modify[0].Type);

            Assert.AreEqual("OsmSharp", squashed.Generator);
            Assert.AreEqual(6, squashed.Version);
        }
Exemplo n.º 21
0
        public static OsmGeo[] GetElementsFromChanges(params long[] changeIds)
        {
            var elements = new List <OsmGeo>();
            int i        = 0;

            foreach (var changeId in changeIds)
            {
                Console.WriteLine(++i + "/" + changeIds.Length + ": " + changeId);
                OsmChange fullChange = FileSerializer.ReadXmlCacheOrSource(@"CachesChanges\" + changeId + ".osc",
                                                                           () => { Thread.Sleep(10000); return(OsmApiClient.GetChangesetDownload(changeId).Result); });
                var newElements = fullChange.GetElements();
                elements.AddRange(newElements);
            }

            return(elements.ToArray());
        }
Exemplo n.º 22
0
        public void PutUpdateData_WhileRebuildIsRunning_ShouldNotUpdate()
        {
            var changes = new OsmChange {
                Create = new OsmGeo[] { new Node() }
            };

            _osmLatestFileFetcherExecutor.Update().Returns(Task.Delay(100));
            _osmLatestFileFetcherExecutor.GetUpdates().Returns(CreateStream(changes));
            SetupContext(IPAddress.Parse("1.2.3.4"), IPAddress.Loopback);

            _controller.PostUpdateData(new UpdateRequest()).ContinueWith((t) => { });
            var results = _controller.PutUpdateData().Result as BadRequestObjectResult;

            _databasesUpdaterService.DidNotReceive().Update(Arg.Is <OsmChange>(x => x.Create.Length == changes.Create.Length));
            Assert.IsNotNull(results);
        }
Exemplo n.º 23
0
        public void TestUpdate_OsmChangeFileWithModification_ShouldUpdateDatabaseUsingPoiPrefixFromDatabase()
        {
            var way = new CompleteWay()
            {
                Id   = 1,
                Tags = new TagsCollection {
                    { "highway", "track" }, { "route", "bicycle" }
                },
                Nodes = new Node[0]
            };
            var changes = new OsmChange
            {
                Create = new OsmGeo[0],
                Modify = new OsmGeo[] { way.ToSimple() },
                Delete = new OsmGeo[0]
            };
            var wayFeature = new Feature(new LineString(new Coordinate[0]), new AttributesTable {
                { FeatureAttributes.ID, "1" },
                { FeatureAttributes.POI_SOURCE, Sources.OSM }
            });

            wayFeature.SetId();
            var wayFeatureInDatabase = new Feature(new LineString(new Coordinate[0]), new AttributesTable {
                { FeatureAttributes.ID, "1" },
                { FeatureAttributes.POI_CATEGORY, Categories.HISTORIC },
                { FeatureAttributes.POI_SOURCE, Sources.OSM }
            });

            wayFeatureInDatabase.SetId();
            var list = new List <Feature> {
                wayFeature
            };

            _geoJsonPreprocessorExecutor
            .Preprocess(Arg.Is <Dictionary <string, List <ICompleteOsmGeo> > >(x => x.Values.Count == 1))
            .Returns(list);
            _geoJsonPreprocessorExecutor
            .Preprocess(Arg.Is <List <CompleteWay> >(x => x.Count == 1))
            .Returns(list);
            _osmGateway.GetCompleteWay(1).Returns(way);
            _elasticSearchGateway.GetPointOfInterestById("way_1", Sources.OSM).Returns(wayFeatureInDatabase);

            _service.Update(changes).Wait();

            _elasticSearchGateway.Received(1).UpdatePointsOfInterestData(Arg.Is <List <Feature> >(x => x.Count == 1 && x.First().Attributes.Exists(FeatureAttributes.POI_CATEGORY)));
        }
Exemplo n.º 24
0
        public void TestSquashModifyCreation()
        {
            var changeset1 = new OsmChange()
            {
                Create = new OsmGeo[]
                {
                    new Node()
                    {
                        Id      = 1,
                        Version = 1
                    }
                },
                Generator = "OsmSharp",
                Version   = 6
            };
            var changeset2 = new OsmChange()
            {
                Modify = new OsmGeo[]
                {
                    new Node()
                    {
                        Id      = 1,
                        Version = 3
                    }
                },
                Generator = "OsmSharp",
                Version   = 6
            };

            // doing the squashing, should modify the creation.
            var squashed = new[] { changeset1, changeset2 }.Squash();

            Assert.IsNotNull(squashed.Create);
            Assert.AreEqual(1, squashed.Create.Length);
            Assert.AreEqual(OsmGeoType.Node, squashed.Create[0].Type);
            Assert.AreEqual(1, squashed.Create[0].Id);
            Assert.AreEqual(3, squashed.Create[0].Version);
            Assert.IsNotNull(squashed.Delete);
            Assert.AreEqual(0, squashed.Delete.Length);
            Assert.IsNotNull(squashed.Modify);
            Assert.AreEqual(0, squashed.Modify.Length);

            Assert.AreEqual("OsmSharp", squashed.Generator);
            Assert.AreEqual(6, squashed.Version);
        }
        public void TestUpdate_EmptyOsmChangeFile_ShouldNotUpdateAnything()
        {
            var changes = new OsmChange {
                Create = new OsmGeo[0], Modify = new OsmGeo[0], Delete = new OsmGeo[0]
            };

            _geoJsonPreprocessorExecutor
            .Preprocess(Arg.Is <Dictionary <string, List <ICompleteOsmGeo> > >(x => x.Values.Count == 0))
            .Returns(new List <Feature>());
            _geoJsonPreprocessorExecutor
            .Preprocess(Arg.Is <List <CompleteWay> >(x => x.Count == 0))
            .Returns(new List <Feature>());

            _service.Update(changes).Wait();

            _elasticSearchGateway.Received(1).UpdatePointsOfInterestData(Arg.Is <List <Feature> >(x => x.Count == 0));
            _elasticSearchGateway.Received(1).UpdateHighwaysData(Arg.Is <List <Feature> >(x => x.Count == 0));
        }
Exemplo n.º 26
0
        public async Task <DiffResult> UploadChangeset(string changesetId, OsmChange osmChange)
        {
            using (var client = new HttpClient())
            {
                foreach (var osmGeo in osmChange.Create.Concat(osmChange.Modify).Concat(osmChange.Delete))
                {
                    osmGeo.ChangeSetId = long.Parse(changesetId);
                }
                var address = _uploadChangesetAddress.Replace(":id", changesetId);
                UpdateHeaders(client, address, "POST");
                var response = await client.PostAsync(address, new StringContent(osmChange.SerializeToXml()));

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    var message = await response.Content.ReadAsStringAsync();

                    throw new Exception($"Unable to upload changeset: {message}");
                }
                var serializer = new XmlSerializer(typeof(DiffResult));
                return(serializer.Deserialize(await response.Content.ReadAsStreamAsync()) as DiffResult);
            }
        }
Exemplo n.º 27
0
        public static async Task <long[]> UploadChange(OsmChange change, TagsCollection changeTags, string pathForFiles)
        {
            Log.LogInformation("Uploading change to OSM");
            var osmApiClient = new BasicAuthClient(Static.HttpClient,
                                                   Static.LogFactory.CreateLogger <BasicAuthClient>(), Static.Config["OsmApiUrl"],
                                                   Static.Config["OsmUsername"], Static.Config["OsmPassword"]);
            var changeParts = change.SplitByCount().ToArray();
            var result      = new long[changeParts.Length];
            int i           = 0;

            foreach (var part in changeParts)
            {
                if (changeParts.Length > 1)
                {
                    changeTags.AddOrReplace("change-part", $"part {i + 1} of {changeParts.Length}");
                }
                result[i] = await UploadChangePart(part, changeTags, osmApiClient, pathForFiles);

                i++;
            }

            return(result);
        }
Exemplo n.º 28
0
 public static IEnumerable <OsmGeo> GetElements(this OsmChange change)
 {
     return(new OsmGeo[][] { change.Create, change.Modify, change.Delete }
            .Where(a => a != null)
            .SelectMany(a => a));
 }
Exemplo n.º 29
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.º 30
0
 /// <summary>
 /// Adds the given changeset.
 /// </summary>
 public void Add(Changeset meta, OsmChange changes)
 {
     _db.AddOrUpdate(meta);
     _db.AddChanges(meta.Id.Value, changes);
 }