示例#1
0
        public async Task <string> CreateChangeset(string comment)
        {
            using (var client = new HttpClient())
            {
                UpdateHeaders(client, _createChangesetAddress, "PUT");
                var changeSet = new Osm
                {
                    Changesets = new[]
                    {
                        new Changeset
                        {
                            Tags = new TagsCollection
                            {
                                new Tag {
                                    Key = "created_by", Value = "IsraelHiking.osm.org.il"
                                },
                                new Tag {
                                    Key = "comment", Value = comment
                                }
                            }
                        }
                    }
                };
                var response = await client.PutAsync(_createChangesetAddress, new StringContent(changeSet.SerializeToXml()));

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

                    throw new Exception($"Unable to create changeset: {message}");
                }
                return(await response.Content.ReadAsStringAsync());
            }
        }
示例#2
0
        public void TestSerialize()
        {
            var osm = new Osm
            {
                Version   = 0.6,
                Generator = "OpenStreetMap server",
                GpxFiles  = new [] { new GpxFile
                                     {
                                         Id          = 1,
                                         Name        = "Name",
                                         Lat         = 1.1,
                                         Lon         = 2.2,
                                         User        = "******",
                                         Visibility  = Visibility.Private,
                                         Pending     = false,
                                         TimeStamp   = new DateTime(1947, 11, 29, 12, 0, 0, DateTimeKind.Utc),
                                         Description = "Description",
                                         Tags        = new [] { "tag1", "tag2" },
                                     } }
            };
            var osmString = osm.SerializeToXml();

            Assert.AreEqual(
                "<osm version=\"0.6\" generator=\"OpenStreetMap server\"><gpx_file id=\"1\" name=\"Name\" lat=\"1.1\" lon=\"2.2\" user=\"User\" visibility=\"private\" pending=\"False\" timestamp=\"1947-11-29T12:00:00Z\"><description>Description</description><tag>tag1</tag><tag>tag2</tag></gpx_file></osm>",
                osmString);
        }
示例#3
0
        public async Task UpdateTrace(OsmTrace trace)
        {
            using (var client = new HttpClient())
            {
                var traceAddress = _traceAddress.Replace(":id", trace.Id);
                UpdateHeaders(client, traceAddress, "PUT");

                var osmRequest = new Osm
                {
                    GpxFiles = new[]
                    {
                        new GpxFile
                        {
                            Name        = trace.Name,
                            Description = trace.Description,
                            Visibility  = trace.Visibility,
                            Id          = int.Parse(trace.Id),
                            Lat         = trace.LatLng.lat,
                            Lon         = trace.LatLng.lng,
                            Tags        = trace.Tags.ToArray()
                        }
                    }
                };
                var response = await client.PutAsync(traceAddress, new StringContent(osmRequest.SerializeToXml()));

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    throw new Exception("Unable to update OSM trace");
                }
            }
        }
 /// <summary>
 /// Adds a node.
 /// </summary>
 public override void AddNode(Osm.Node node)
 {
     _currentEntities.Add(node);
     if (_currentEntities.Count > 8000)
     {
         this.FlushBlock();
     }
 }
示例#5
0
        public static async Task <Osm> Fetch(string scopeName, Func <Feature, bool> filter = null)
        {
            TagTree.Reload();

            Log = Log ?? Static.LogFactory.CreateLogger(typeof(References));
            Log.LogInformation("Fetching Reference material from Maine E911 API");

            // Fetch GIS
            var stateGis = await FileSerializer.ReadJsonCacheOrSource(
                scopeName + "/ReferenceRaw.GeoJson", () => GeoJsonAPISource.FetchMunicipality(scopeName));

            var gisFeatures = stateGis.Features.Where(f => filter == null || filter(f)).ToArray();

            if (IsFeatureSchemaOld(gisFeatures[0]))
            {
                gisFeatures = gisFeatures.Select(UpdateFeatureSchema).ToArray();
            }
            Log.LogInformation("Validating Reference material");
            Validate(gisFeatures);

            // Fetch the list of objectIDs with known errors to omit.
            var blacklist = Static.Municipalities[scopeName].BlackList.ToHashSet();

            Log.LogInformation("Translating Reference material");
            // Convert
            var nodes = gisFeatures
                        .Where(f => !blacklist.Contains((long)f.Properties[KEYS.OBJECTID]))
                        .Select(Convert)
                        .Where(n => n.Tags.ContainsKey("addr:housenumber"))
                        .ToArray();

            if (!nodes.Any())
            {
                return(null);
            }
            nodes = HandleStacks(nodes);
            HandleBlackTags(nodes, Static.Municipalities[scopeName].BlackTags);

            foreach (var node in nodes.Where(n => n.Tags.ContainsKey("addr:unit")))
            {
                var newUnit = RemoveTokens(ReplaceTokens(node.Tags["addr:unit"], UNITs), Tags.UnitOmmisionable);
                if (newUnit == "")
                {
                    node.Tags.RemoveKey("addr:unit");
                }
                else
                {
                    node.Tags["addr:unit"] = newUnit;
                }
            }

            var filtered = new Osm()
            {
                Nodes = nodes, Version = .6, Bounds = nodes.AsBounds()
            };

            return(filtered);
        }
示例#6
0
        public static Osm[] SliceRecusive(Osm osm, int maxElementsPerslice)
        {
            var index        = OsmSharp.Db.Impl.Extensions.CreateSnapshotDb(new MemorySnapshotDb(osm.GetElements()));
            var completeWays = index.GetComplete().OfType <CompleteWay>().ToArray();
            var slices       = completeWays.SliceRecusive(maxElementsPerslice).ToDictionary();
            var simpleSlices = slices.Select(kvp => kvp.Value.Select(e => e.ToSimple()).WithChildren(index).AsOsm(null, .6, kvp.Key)).ToArray();

            return(simpleSlices);
        }
示例#7
0
文件: OsmTests.cs 项目: OsmSharp/core
        public void Osm_ToJson_Complete_ShouldWriteCompleteJson()
        {
            var osm = new Osm()
            {
                Version   = 0.6,
                Generator = "OsmSharp",
                Nodes     = new [] { new Node
                                     {
                                         Id          = 100000,
                                         Latitude    = 58.4215544,
                                         Longitude   = 15.6182983,
                                         TimeStamp   = new DateTime(2017, 04, 17, 18, 31, 21, DateTimeKind.Utc),
                                         Version     = 3,
                                         ChangeSetId = 47881103,
                                         UserName    = "******",
                                         UserId      = 83501,
                                         Tags        = new TagsCollection(new Tag("highway", "residential"))
                                     } },
                Ways = new [] { new Way()
                                {
                                    Id        = 1,
                                    Version   = 1,
                                    UserName  = "******",
                                    UserId    = 1,
                                    TimeStamp = new System.DateTime(2008, 09, 12, 21, 37, 45),
                                    Tags      = new TagsCollection(
                                        new Tag("amenity", "something"),
                                        new Tag("key", "some_value")),
                                    Nodes = new long[]
                                    {
                                        1, 2, 3
                                    }
                                } },
                Relations = new [] { new Relation()
                                     {
                                         Id        = 1,
                                         Version   = 1,
                                         UserName  = "******",
                                         UserId    = 1,
                                         TimeStamp = new System.DateTime(2008, 09, 12, 21, 37, 45),
                                         Tags      = new TagsCollection(
                                             new Tag("amenity", "something"),
                                             new Tag("key", "some_value")),
                                         Members = new RelationMember[]
                                         {
                                             new RelationMember(1, "role1", OsmGeoType.Node),
                                             new RelationMember(10, "role2", OsmGeoType.Way),
                                             new RelationMember(100, "role3", OsmGeoType.Relation)
                                         }
                                     } }
            };

            var serialized = JsonSerializer.Serialize(osm);

            Assert.AreEqual("{\"version\":0.6,\"generator\":\"OsmSharp\",\"elements\":[{\"type\":\"node\",\"lat\":58.4215544,\"lon\":15.6182983,\"id\":100000,\"tags\":{\"highway\":\"residential\"},\"timestamp\":\"2017-04-17T18:31:21Z\",\"version\":3,\"changeset\":47881103,\"user\":\"riiga\",\"uid\":83501},{\"type\":\"way\",\"nodes\":[1,2,3],\"id\":1,\"tags\":{\"amenity\":\"something\",\"key\":\"some_value\"},\"timestamp\":\"2008-09-12T21:37:45\",\"version\":1,\"user\":\"ben\",\"uid\":1},{\"type\":\"relation\",\"members\":[{\"type\":\"node\",\"ref\":1,\"role\":\"role1\"},{\"type\":\"way\",\"ref\":10,\"role\":\"role2\"},{\"type\":\"relation\",\"ref\":100,\"role\":\"role3\"}],\"id\":1,\"tags\":{\"amenity\":\"something\",\"key\":\"some_value\"},\"timestamp\":\"2008-09-12T21:37:45\",\"version\":1,\"user\":\"ben\",\"uid\":1}]}",
                            serialized);
        }
示例#8
0
        /// <inheritdoc />
        public async Task UpdateTrace(GpxFile trace)
        {
            var address = BaseAddress + $"0.6/gpx/{trace.Id}";
            var osm     = new Osm {
                GpxFiles = new[] { trace }
            };
            var content = new StringContent(osm.SerializeToXml());

            await SendAuthRequest(HttpMethod.Put, address, content);
        }
        /// <summary>
        /// Filters data according to the given filters.
        /// </summary>
        /// <param name="nodesFilter"></param>
        /// <param name="waysFilter"></param>
        /// <param name="relationsFilter"></param>
        public OsmStreamFilterTags(Osm.Filters.Filter nodesFilter, Osm.Filters.Filter waysFilter,
                                       Osm.Filters.Filter relationsFilter)
        {
            _nodesFilter = nodesFilter;
            _waysFilter = waysFilter;
            _relationsFilter = relationsFilter;

            _wayKeepNodes = false;
            _relationKeepObjects = false;
        }
示例#10
0
        /// <inheritdoc />
        public async Task SetUserPreferences(Preferences preferences)
        {
            var address = BaseAddress + "0.6/user/preferences";
            var osm     = new Osm()
            {
                Preferences = preferences
            };
            var content = new StringContent(osm.SerializeToXml());

            await SendAuthRequest(HttpMethod.Put, address, content);
        }
示例#11
0
 private static CompleteWay[] Translate(Osm osm)
 {
     using (var translator = new OsmTagsTranslator.Translator(osm.GetElements()))
     {
         translator.AddLookup(@"Directions.json");
         translator.AddLookup(@"StreetSuffixes.json");
         translator.AddLookup(@"RoadClasses.json");
         translator.AddLookup(@"RoutePrefixes.json");
         var sql = File.ReadAllText(@"E911RoadsToOsmSchema.sql");
         return(translator.QueryElementsWithChildren(sql)
                .ToComplete().OfType <CompleteWay>().ToArray());
     };
 }
示例#12
0
        /// <inheritdoc />
        public async Task <Changeset> UpdateChangeset(long changesetId, TagsCollectionBase tags)
        {
            Validate.ContainsTags(tags, "comment", "created_by");
            // TODO: Validate change meets OsmSharp.API.Capabilities?
            var address   = BaseAddress + $"0.6/changeset/{changesetId}";
            var changeSet = new Osm {
                Changesets = new[] { new Changeset {
                                         Tags = tags
                                     } }
            };
            var content = new StringContent(changeSet.SerializeToXml());
            var osm     = await Put <Osm>(address, content);

            return(osm.Changesets[0]);
        }
示例#13
0
        public void LoadHouses(OsmStreet street)
        {
            CancelLoading();

            logger.Info($"Запрос домов...");
            if (street.Districts != null)
            {
                CurrentLoadTask = Task.Run(() => Osm.GetHouseNumbers(street.CityId, street.Name, street.Districts), cancelTokenSource.Token);
            }
            else
            {
                CurrentLoadTask = Task.Run(() => Osm.GetHouseNumbersWithoutDistrict(street.CityId, street.Name), cancelTokenSource.Token);
            }
            CurrentLoadTask.ContinueWith(SaveHouses, cancelTokenSource.Token, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Default);
            CurrentLoadTask.ContinueWith((arg) => logger.Error("Ошибка при загрузке домов", arg.Exception), TaskContinuationOptions.OnlyOnFaulted);
        }
示例#14
0
        /// <inheritdoc />
        public async Task <long> CreateChangeset(TagsCollectionBase tags)
        {
            Validate.ContainsTags(tags, "comment", "created_by");
            var address   = BaseAddress + "0.6/changeset/create";
            var changeSet = new Osm {
                Changesets = new[] { new Changeset {
                                         Tags = tags
                                     } }
            };
            var content       = new StringContent(changeSet.SerializeToXml());
            var resultContent = await SendAuthRequest(HttpMethod.Put, address, content);

            var id = await resultContent.ReadAsStringAsync();

            return(long.Parse(id));
        }
示例#15
0
        // When matching, consider pulling capitalization and punctuation from local names.

        public static Osm FindMissingRoads(Osm subject, CompleteWay[] reference)
        {
            var missing   = new List <CompleteWay>();
            var misShapen = new List <CompleteWay>();

            var keysToIndex = new Dictionary <string, Func <string, string[]> >()
            {
                { "name", Tags.WithOrWithoutPunctuation }
            };
            var subjectWays = subject.Ways
                              .Where(e => e.Tags != null && e.Tags.ContainsKey("name") && e.Tags.ContainsKey("highway"))
                              .ToArray();
            var subjectNodes        = subject.Nodes.ToDictionary(n => n.Id.Value);
            var subjectElementIndex = new ElementIndex(subjectWays, keysToIndex);

            foreach (var referenceRoad in reference)
            {
                var searchTags = new TagsCollection(new Tag("name", referenceRoad.Tags["name"]));
                if (subjectElementIndex.TryGetMatchingElements(searchTags, out var candidates))
                {
                    var candidateNodes = candidates.OfType <Way>().SelectMany(c => c.Nodes.Select(n => subjectNodes[n]));

                    var byLat = new SortedList <double, Node[]>(candidateNodes.GroupBy(n => n.Latitude.Value).ToDictionary(g => g.Key, g => g.ToArray()));
                    var byLon = new SortedList <double, Node[]>(candidateNodes.GroupBy(n => n.Longitude.Value).ToDictionary(g => g.Key, g => g.ToArray()));

                    var near = referenceRoad.Nodes.RatioWhere(n => BoundsExtentions.FastNodesInBounds(n.AsBounds().ExpandBy(30), byLat, byLon).Any());

                    if (near == 0)
                    {
                        missing.Add(referenceRoad);
                    }
                    else if (near < 1)
                    {
                        // This needs to be defined better, maybe closeness to the line, vs closeness to a point.
                        misShapen.Add(referenceRoad);
                    }
                }
                else
                {
                    missing.Add(referenceRoad);
                }
            }

            return(missing.AsOsm());
        }
示例#16
0
        public void TestSerialize()
        {
            var osm = new Osm
            {
                Version   = 0.6,
                Generator = "OpenStreetMap server",
                User      = new User()
                {
                    Id             = 1,
                    AccountCreated = new DateTime(2000, 1, 1),
                    ChangeSetCount = 2,
                    DisplayName    = "DisplayName",
                    Description    = "Description",
                    Home           = new Home {
                        Latitude = 3, Longitude = 4, Zoom = 5.5f
                    },
                    Image                        = "Image",
                    TraceCount                   = 6,
                    ContributorTermsAgreed       = false,
                    ContributorTermsPublicDomain = true,
                    BlocksReceived               = new[]
                    {
                        new Block
                        {
                            Active = 7,
                            Count  = 8
                        }
                    },
                    Languages = new []
                    {
                        "en-US"
                    },
                    Messages = new Messages
                    {
                        Received = 9,
                        Unread   = 10,
                        Sent     = 11
                    }
                }
            };
            var osmString = osm.SerializeToXml();

            Assert.AreEqual("<osm version=\"0.6\" generator=\"OpenStreetMap server\"><user id=\"1\" display_name=\"DisplayName\" account_created=\"2000-01-01T00:00:00Z\"><description>Description</description><contributor-terms agreed=\"false\" pd=\"true\" /><img href=\"Image\" /><roles></roles><changesets count=\"2\" /><traces count=\"6\" /><blocks><received count=\"8\" active=\"7\" /></blocks><home lat=\"3\" lon=\"4\" zoom=\"5.5\" /><languages><lang>en-US</lang></languages><messages><received count=\"9\" unread=\"10\" /><sent count=\"11\" /></messages></user></osm>",
                            osmString);
        }
示例#17
0
        private static void SaveFile(Osm osm, string path)
        {
            var serializer = new System.Xml.Serialization.XmlSerializer(typeof(Osm));
            var settings   = new System.Xml.XmlWriterSettings();

            settings.OmitXmlDeclaration = true;
            settings.Indent             = false;
            settings.NewLineChars       = string.Empty;
            var emptyNamespace = new System.Xml.Serialization.XmlSerializerNamespaces();

            emptyNamespace.Add(string.Empty, string.Empty);

            using (var resultStream = new FileStream(path, FileMode.Create))
                using (var stringWriter = System.Xml.XmlWriter.Create(resultStream, settings))
                {
                    serializer.Serialize(stringWriter, osm, emptyNamespace);
                }
        }
        internal static ChangeSet ConvertToSimple(Osm.Xml.v0_6.delete delete)
        {
            // create change set record.
            OsmSharp.Osm.ChangeSet change_set = new OsmSharp.Osm.ChangeSet();

            // create change record.
            OsmSharp.Osm.Change change = new OsmSharp.Osm.Change();
            change.Type = OsmSharp.Osm.ChangeType.Delete;
            change.OsmGeo = new List<OsmGeo>();

            // add all relations to the list.
            if (delete.relation != null)
            {
                foreach (Osm.Xml.v0_6.relation osm_geo in delete.relation)
                {
                    change.OsmGeo.Add(XmlSimpleConverter.ConvertToSimple(osm_geo));
                }
            }

            // add all ways to the list.
            if (delete.way != null)
            {
                foreach (Osm.Xml.v0_6.way osm_geo in delete.way)
                {
                    change.OsmGeo.Add(XmlSimpleConverter.ConvertToSimple(osm_geo));
                }
            }

            // add all nodes to the list.
            if (delete.node != null)
            {
                foreach (Osm.Xml.v0_6.node osm_geo in delete.node)
                {
                    change.OsmGeo.Add(XmlSimpleConverter.ConvertToSimple(osm_geo));
                }
            }

            // add change to changeset
            change_set.Changes = new List<Change>();
            change_set.Changes.Add(change);

            return change_set;
        }
示例#19
0
        public void TestSerialize()
        {
            var osm = new Osm()
            {
                Api = new Capabilities()
                {
                    Version = new Version()
                    {
                        Maximum = 0.6,
                        Minimum = 0.6
                    },
                    Area = new Area()
                    {
                        Maximum = 0.25
                    },
                    Changesets = new OsmSharp.API.Changesets()
                    {
                        MaximumElements = 50000
                    },
                    Status = new Status()
                    {
                        Api      = "online",
                        Database = "online",
                        Gpx      = "online"
                    },
                    Timeout = new Timeout()
                    {
                        Seconds = 300
                    },
                    Tracepoints = new Tracepoints()
                    {
                        PerPage = 5000
                    },
                    WayNodes = new WayNodes()
                    {
                        Maximum = 2000
                    }
                }
            };

            Assert.AreEqual("<osm><api><version minimum=\"0.6\" maximum=\"0.6\" /><area maximum=\"0.25\" /><tracepoints per_page=\"5000\" /><waynodes maximum=\"2000\" /><changesets maximum_elements=\"50000\" /><timeout seconds=\"300\" /><status api=\"online\" database=\"online\" gpx=\"online\" /></api></osm>",
                            osm.SerializeToXml());
        }
示例#20
0
        public async Task UpdateTrace(GpxFile trace)
        {
            using (var client = new HttpClient())
            {
                var traceAddress = _traceAddress.Replace(":id", trace.Id.ToString());
                UpdateHeaders(client, traceAddress, "PUT");

                var osmRequest = new Osm
                {
                    GpxFiles = new[] { trace }
                };
                var response = await client.PutAsync(traceAddress, new StringContent(osmRequest.SerializeToXml()));

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    throw new Exception("Unable to update OSM trace");
                }
            }
        }
示例#21
0
        internal static SimpleChangeSet ConvertToSimple(Osm.Xml.v0_6.modify modify)
        {
            // create change set record.
            SimpleChangeSet change_set = new SimpleChangeSet();

            // create change record.
            SimpleChange change = new SimpleChange();
            change.Type = SimpleChangeType.Modify;
            change.OsmGeo = new List<SimpleOsmGeo>();

            // add all relations to the list.
            if (modify.relation != null)
            {
                foreach (Osm.Xml.v0_6.relation osm_geo in modify.relation)
                {
                    change.OsmGeo.Add(XmlSimpleConverter.ConvertToSimple(osm_geo));
                }
            }

            // add all ways to the list.
            if (modify.way != null)
            {
                foreach (Osm.Xml.v0_6.way osm_geo in modify.way)
                {
                    change.OsmGeo.Add(XmlSimpleConverter.ConvertToSimple(osm_geo));
                }
            }

            // add all nodes to the list.
            if (modify.node != null)
            {
                foreach (Osm.Xml.v0_6.node osm_geo in modify.node)
                {
                    change.OsmGeo.Add(XmlSimpleConverter.ConvertToSimple(osm_geo));
                }
            }

            // add change to changeset
            change_set.Changes = new List<SimpleChange>();
            change_set.Changes.Add(change);

            return change_set;
        }
示例#22
0
 protected List <OsmStreet> GetOsmStreets(long cityId, string searchString, int limit, CancellationToken token)
 {
     try
     {
         Task.Delay(Delay, token).Wait();
         logger.Info($"Запрос улиц... Строка поиска : {searchString} , Кол-во записей {limit}");
         return(Osm.GetStreetsByCriteria(cityId, searchString, limit));
     } catch (AggregateException ae)
     {
         ae.Handle(ex =>
         {
             if (ex is TaskCanceledException)
             {
                 logger.Info("Запрос улиц отменен");
             }
             return(ex is TaskCanceledException);
         });
         return(new List <OsmStreet>());
     }
 }
示例#23
0
        protected Osm GetOsmRequest(long changesetId, OsmGeo osmGeo)
        {
            osmGeo.ChangeSetId = changesetId;
            var osm = new Osm();

            switch (osmGeo.Type)
            {
            case OsmGeoType.Node:
                osm.Nodes = new[] { osmGeo as Node };
                break;

            case OsmGeoType.Way:
                osm.Ways = new[] { osmGeo as Way };
                break;

            case OsmGeoType.Relation:
                osm.Relations = new[] { osmGeo as Relation };
                break;
            }
            return(osm);
        }
示例#24
0
        public static OsmChange Merge(Osm reference, Osm subject, string scopeName, GeoJsonAPISource.Municipality municipality)
        {
            Log = Log ?? Static.LogFactory.CreateLogger(typeof(Conflate));
            // Can blacklist subject elements also! Fixme: colisions between different element types with the same ID
            var           subjectElements     = subject.GetElements().Where(e => !municipality.BlackList.Contains(e.Id.Value));
            var           subjectElementIndex = new ElementIndex(subjectElements.ToArray());
            List <OsmGeo> create = new List <OsmGeo>(reference.Nodes);
            List <OsmGeo> modify = new List <OsmGeo>();
            List <OsmGeo> delete = new List <OsmGeo>();

            Log.LogInformation("Starting conflation, matching by tags");
            MergeNodesByTags(new[] { "addr:street", "addr:housenumber", "addr:unit" }, subjectElementIndex, municipality.WhiteList, create, modify);
            MergeNodesByTags(new[] { "addr:street", "addr:housenumber" }, subjectElementIndex, municipality.WhiteList, create, modify);
            MergeNodesByTags(new[] { "name" }, subjectElementIndex, municipality.WhiteList, create, modify);

            Log.LogInformation("Starting conflation, matching by geometry");
            MergeNodesByGeometry(subjectElementIndex, municipality.WhiteList, create, modify);

            ValidateNamesMatch(subjectElementIndex, create.Concat(modify), "highway", "addr:street",
                               (element, key) => ShouldStreetBeAPlace(element, subjectElementIndex));
            ValidateNamesMatch(subjectElementIndex, create.Concat(modify), "place", "addr:place");

            Log.LogInformation($"Writing {scopeName} review files");
            var review = GatherExceptions(municipality.WhiteList, municipality.IgnoreList, subjectElementIndex, create, delete, modify);

            WriteToFileWithChildrenIfAny(scopeName + "/Conflated.Review.osm", review, subjectElementIndex);
            WriteToFileWithChildrenIfAny(scopeName + "/Conflated.Create.osm", create, subjectElementIndex);
            WriteToFileWithChildrenIfAny(scopeName + "/Conflated.Delete.osm", delete, subjectElementIndex);
            WriteToFileWithChildrenIfAny(scopeName + "/Conflated.Modify.osm", modify, subjectElementIndex);

            RemoveReviewTags(create, delete, modify);
            var change = Changes.FromGeos(create, modify, delete, "OsmPipeline");

            LogSummary(change, review);

            return(change);
        }
示例#25
0
        private Osm GetOsmRequest(string changesetId, OsmGeo osmGeo)
        {
            var  osm         = new Osm();
            long changeSetId = long.Parse(changesetId);

            switch (osmGeo.Type)
            {
            case OsmGeoType.Node:
                osm.Nodes = new[] { osmGeo as Node };
                osm.Nodes.First().ChangeSetId = changeSetId;
                break;

            case OsmGeoType.Way:
                osm.Ways = new[] { osmGeo as Way };
                osm.Ways.First().ChangeSetId = changeSetId;
                break;

            case OsmGeoType.Relation:
                osm.Relations = new[] { osmGeo as Relation };
                osm.Relations.First().ChangeSetId = changeSetId;
                break;
            }
            return(osm);
        }
示例#26
0
        internal static SimpleRelation ConvertToSimple(Osm.Xml.v0_6.relation re)
        {
            SimpleRelation relation = new SimpleRelation();

            // set id
            if (re.idSpecified)
            {
                relation.Id = re.id;
            }

            // set changeset.
            if (re.changesetSpecified)
            {
                relation.ChangeSetId = re.changeset;
            }

            // set visible.
            if (re.visibleSpecified)
            {
                relation.Visible = re.visible;
            }
            else
            { // if visible is not specified it is default true.
                relation.Visible = true;
            }

            // set timestamp.
            if (re.timestampSpecified)
            {
                relation.TimeStamp = re.timestamp;
            }

            // set uid
            if (re.uidSpecified)
            {
                relation.UserId = re.uid;
            }

            // set version
            if (re.versionSpecified)
            {
                relation.Version = re.version;
            }

            // set user
            relation.UserName = re.user;

            // set tags.
            relation.Tags = XmlSimpleConverter.ConvertToTags(re.tag);

            // set members.
            if (re.member != null && re.member.Length > 0)
            {
                relation.Members = new List<SimpleRelationMember>();
                for (int idx = 0; idx < re.member.Length; idx++)
                {
                    OsmSharp.Osm.Xml.v0_6.member mem = re.member[idx];
                    SimpleRelationMember relation_member = new SimpleRelationMember();
                    // set memberid
                    if (mem.refSpecified)
                    {
                        relation_member.MemberId = mem.@ref;
                    }

                    // set role.
                    relation_member.MemberRole = mem.role;

                    // set type.
                    if (mem.typeSpecified)
                    {
                        switch (mem.type)
                        {
                            case OsmSharp.Osm.Xml.v0_6.memberType.node:
                                relation_member.MemberType = SimpleRelationMemberType.Node;
                                break;
                            case OsmSharp.Osm.Xml.v0_6.memberType.way:
                                relation_member.MemberType = SimpleRelationMemberType.Way;
                                break;
                            case OsmSharp.Osm.Xml.v0_6.memberType.relation:
                                relation_member.MemberType = SimpleRelationMemberType.Relation;
                                break;
                        }
                    }

                    relation.Members.Add(relation_member);
                }
            }

            return relation;
        }
 /// <summary>
 /// Adds a way.
 /// </summary>
 public override void AddWay(Osm.Way way)
 {
     _currentEntities.Add(way);
     if (_currentEntities.Count > 8000)
     {
         this.FlushBlock();
     }
 }
示例#28
0
        /// <summary>
        /// Encodes an OsmSharp-way into a PBF-way.
        /// </summary>
        /// <returns></returns>
        public static OsmSharp.Osm.PBF.Way EncodeWay(PrimitiveBlock block, Dictionary<string, int> reverseStringTable, Osm.Way way)
        {
            var pbfWay = new OsmSharp.Osm.PBF.Way();
            pbfWay.id = way.Id.Value;
            pbfWay.info = new Info();
            if (way.ChangeSetId.HasValue) { pbfWay.info.changeset = way.ChangeSetId.Value; }
            if (way.TimeStamp.HasValue)
            {
                pbfWay.info.timestamp = Encoder.EncodeTimestamp(way.TimeStamp.Value, block.date_granularity);
            }
            if (way.UserId.HasValue) { pbfWay.info.uid = (int)way.UserId.Value; }
            pbfWay.info.user_sid = Encoder.EncodeString(block, reverseStringTable, way.UserName);
            pbfWay.info.version = 0;
            if (way.Version.HasValue) { pbfWay.info.version = (int)way.Version.Value; }

            if (way.Tags != null)
            {
                foreach (var tag in way.Tags)
                {
                    pbfWay.keys.Add((uint)Encoder.EncodeString(block, reverseStringTable, tag.Key));
                    pbfWay.vals.Add((uint)Encoder.EncodeString(block, reverseStringTable, tag.Value));
                }
            }

            if(way.Nodes != null &&
                way.Nodes.Count > 0)
            {
                pbfWay.refs.Add(way.Nodes[0]);
                for(var i = 1; i < way.Nodes.Count; i++)
                {
                    pbfWay.refs.Add(way.Nodes[i] - way.Nodes[i - 1]);
                }
            }
            return pbfWay;
        }
示例#29
0
        /// <summary>
        /// Encodes an OsmSharp-relation into a PBF-relation.
        /// </summary>
        /// <returns></returns>
        public static OsmSharp.Osm.PBF.Relation EncodeRelation(PrimitiveBlock block, Dictionary<string, int> reverseStringTable, Osm.Relation relation)
        {
            var pbfRelation = new OsmSharp.Osm.PBF.Relation();
            pbfRelation.id = relation.Id.Value;
            pbfRelation.info = new Info();
            if (relation.ChangeSetId.HasValue) { pbfRelation.info.changeset = relation.ChangeSetId.Value; }
            if (relation.TimeStamp.HasValue) { pbfRelation.info.timestamp = Encoder.EncodeTimestamp(relation.TimeStamp.Value, block.date_granularity); }
            if (relation.UserId.HasValue) { pbfRelation.info.uid = (int)relation.UserId.Value; }
            pbfRelation.info.user_sid = Encoder.EncodeString(block, reverseStringTable, relation.UserName);
            pbfRelation.info.version = 0;
            if (relation.Version.HasValue) { pbfRelation.info.version = (int)relation.Version.Value; }

            if (relation.Tags != null)
            {
                foreach (var tag in relation.Tags)
                {
                    pbfRelation.keys.Add((uint)Encoder.EncodeString(block, reverseStringTable, tag.Key));
                    pbfRelation.vals.Add((uint)Encoder.EncodeString(block, reverseStringTable, tag.Value));
                }
            }

            if (relation.Members != null &&
                relation.Members.Count > 0)
            {
                pbfRelation.memids.Add(relation.Members[0].MemberId.Value);
                pbfRelation.roles_sid.Add(Encoder.EncodeString(block, reverseStringTable, relation.Members[0].MemberRole));
                switch (relation.Members[0].MemberType.Value)
                {
                    case OsmGeoType.Node:
                        pbfRelation.types.Add(Relation.MemberType.NODE);
                        break;
                    case OsmGeoType.Way:
                        pbfRelation.types.Add(Relation.MemberType.WAY);
                        break;
                    case OsmGeoType.Relation:
                        pbfRelation.types.Add(Relation.MemberType.RELATION);
                        break;
                }
                for (var i = 1; i < relation.Members.Count; i++)
                {
                    pbfRelation.memids.Add(relation.Members[i].MemberId.Value -
                        relation.Members[i - 1].MemberId.Value);
                    pbfRelation.roles_sid.Add(Encoder.EncodeString(block, reverseStringTable, relation.Members[i].MemberRole));
                    switch(relation.Members[i].MemberType.Value)
                    {
                        case OsmGeoType.Node:
                            pbfRelation.types.Add(Relation.MemberType.NODE);
                            break;
                        case OsmGeoType.Way:
                            pbfRelation.types.Add(Relation.MemberType.WAY);
                            break;
                        case OsmGeoType.Relation:
                            pbfRelation.types.Add(Relation.MemberType.RELATION);
                            break;
                    }
                }
            }
            return pbfRelation;
        }
 private static TagsCollection ConvertToTags(Osm.Xml.v0_6.tag[] tag)
 {
     TagsCollection tags = null;
     if (tag != null && tag.Length > 0)
     {
         tags = new SimpleTagsCollection();
         foreach (Osm.Xml.v0_6.tag t in tag)
         {
             tags.Add(t.k, t.v);
         }
     }
     return tags;
 }
示例#31
0
 public static long?GetHighestChangeSetId(this Osm osm)
 {
     return(osm.GetElements().Max(e => e.ChangeSetId));
 }
 /// <summary>
 /// Applies a changeset.
 /// </summary>
 /// <param name="change"></param>
 public override void ApplyChange(Osm.Simple.SimpleChangeSet change)
 {
     throw new NotImplementedException();
 }
示例#33
0
        /// <summary>
        /// Returns a list of ways for a given node.
        /// </summary>
        /// <param name="node"></param>
        /// <param name="cache"></param>
        /// <returns></returns>
        public IList<Osm.Way> GetWaysFor(Osm.Node node, bool cache)
        {
            // index the bb of this object.
            if (cache)
            {
                this.IndexObjectsInBox(node.BoundingBox);
            }

            IList<Way> ways = this.WaysPerNodeCacheTryGet(node.Id);
            if (ways == null)
            {
                ways = _source.GetWaysFor(node);
                this.WaysPerNodeCachePut(node.Id, new List<Way>(ways));
            }
            return ways;
        }
示例#34
0
        internal static SimpleWay ConvertToSimple(Osm.Xml.v0_6.way wa)
        {
            SimpleWay way = new SimpleWay();

            // set id
            if (wa.idSpecified)
            {
                way.Id = wa.id;
            }

            // set changeset.
            if (wa.changesetSpecified)
            {
                way.ChangeSetId = wa.changeset;
            }

            // set visible.
            if (wa.visibleSpecified)
            {
                way.Visible = wa.visible;
            }
            else
            { // if visible is not specified it is default true.
                way.Visible = true;
            }

            // set timestamp.
            if (wa.timestampSpecified)
            {
                way.TimeStamp = wa.timestamp;
            }

            // set uid
            if (wa.uidSpecified)
            {
                way.UserId = wa.uid;
            }

            // set version
            if (wa.versionSpecified)
            {
                way.Version = wa.version;
            }

            // set user
            way.UserName = wa.user;

            // set tags.
            way.Tags = XmlSimpleConverter.ConvertToTags(wa.tag);

            // set nodes.
            if (wa.nd != null && wa.nd.Length > 0)
            {
                way.Nodes = new List<long>();
                for (int idx = 0; idx < wa.nd.Length; idx++)
                {
                    way.Nodes.Add(wa.nd[idx].@ref);
                }
            }

            return way;
        }
示例#35
0
        internal static SimpleNode ConvertToSimple(Osm.Xml.v0_6.node nd)
        {
            SimpleNode node = new SimpleNode();

            // set id
            if (nd.idSpecified)
            {
                node.Id = nd.id;
            }

            // set changeset.
            if (nd.changesetSpecified)
            {
                node.ChangeSetId = nd.changeset;
            }

            // set visible.
            if (nd.visibleSpecified)
            {
                node.Visible = nd.visible;
            }
            else
            { // if visible is not specified it is default true.
                node.Visible = true;
            }

            // set timestamp.
            if (nd.timestampSpecified)
            {
                node.TimeStamp = nd.timestamp;
            }

            // set latitude.
            if (nd.latSpecified)
            {
                node.Latitude = nd.lat;
            }

            // set longitude.
            if (nd.lonSpecified)
            {
                node.Longitude = nd.lon;
            }

            // set uid
            if (nd.uidSpecified)
            {
                node.UserId = nd.uid;
            }

            // set version
            if (nd.versionSpecified)
            {
                node.Version = nd.version;
            }

            // set user
            node.UserName = nd.user;

            // set tags.
            node.Tags = XmlSimpleConverter.ConvertToTags(nd.tag);

            return node;
        }
示例#36
0
        /// <summary>
        /// Converts an API v6 xml node to a SimpleNode object.
        /// </summary>
        /// <param name="xml_node"></param>
        /// <returns></returns>
        private Node Convertv6XmlNode(Osm.Xml.v0_6.node xml_node)
        {
            Node node = new Node();
            node.Id = xml_node.id;
            node.Latitude = xml_node.lat;
            node.Longitude = xml_node.lon;

            if (xml_node.tag != null)
            {
                node.Tags = new TagsCollection();
                foreach (Osm.Xml.v0_6.tag xml_tag in xml_node.tag)
                {
                    node.Tags.Add(xml_tag.k, xml_tag.v);
                }
            }

            node.ChangeSetId = xml_node.changeset;
            node.TimeStamp = xml_node.timestamp;
            node.UserName = xml_node.user;
            node.UserId = xml_node.uid;
            node.Version = xml_node.version;
            node.Visible = xml_node.visible;

            return node;
        }
 /// <summary>
 /// Adds a relation.
 /// </summary>
 public override void AddRelation(Osm.Relation relation)
 {
     _currentEntities.Add(relation);
     if (_currentEntities.Count > 8000)
     {
         this.FlushBlock();
     }
 }
示例#38
0
 public long GetCityId(string City, string CityDistrict, LocalityType localityType)
 {
     logger.Debug($"Запрос id для города {City}({CityDistrict})...");
     return(Osm.GetCityId(City, CityDistrict, localityType.ToString()));;
 }
示例#39
0
 /// <summary>
 /// Returns a list of ways for a given node.
 /// </summary>
 /// <param name="node"></param>
 /// <returns></returns>
 public IList<Osm.Way> GetWaysFor(Osm.Node node)
 {
     return this.GetWaysFor(node,true);
 }
示例#40
0
 private static IDictionary<string, string> ConvertToTags(Osm.Xml.v0_6.tag[] tag)
 {
     Dictionary<string, string> tags = null;
     if (tag != null && tag.Length > 0)
     {
         tags = new Dictionary<string, string>();
         foreach (Osm.Xml.v0_6.tag t in tag)
         {
             tags.Add(t.k, t.v);
         }
     }
     return tags;
 }
示例#41
0
 /// <summary>
 /// Returns a list of relations for a given object.
 /// </summary>
 /// <param name="obj"></param>
 /// <returns></returns>
 public IList<Osm.Relation> GetRelationsFor(Osm.OsmBase obj)
 {
     // TODO: return cached version?
     //return _source.GetRelationsFor(obj);
     return new List<Osm.Relation>();
 }
示例#42
0
 /// <summary>
 /// Encodes an OsmSharp-node into a PBF-node.
 /// </summary>
 /// <returns></returns>
 public static OsmSharp.Osm.PBF.Node EncodeNode(PrimitiveBlock block, Dictionary<string, int> reverseStringTable, Osm.Node node)
 {
     var pbfNode = new OsmSharp.Osm.PBF.Node();
     Encoder.EncodeNode(block, reverseStringTable, pbfNode, node);
     return pbfNode;
 }
 /// <summary>
 /// Creates a new changeset filter.
 /// </summary>
 /// <param name="data_source"></param>
 /// <param name="box"></param>
 /// <param name="listener"></param>
 public DataProcessorChangeSetFilterBoundingBox(Osm.Data.IDataSourceReadOnly data_source, GeoCoordinateBox box, IChangeSetFilterListener listener)
     : base()
 {
     _box = box;
     _data_source = data_source;
     _listener = listener;
 }
示例#44
0
        /// <summary>
        /// Encodes an OsmSharp-node into a PBF-node.
        /// </summary>
        /// <returns></returns>
        public static OsmSharp.Osm.PBF.Node EncodeNode(PrimitiveBlock block, Dictionary<string, int> reverseStringTable,
            OsmSharp.Osm.PBF.Node pbfNode, Osm.Node node)
        {
            pbfNode.id = node.Id.Value;
            pbfNode.info = new Info();
            pbfNode.info.version = 0;
            if (node.ChangeSetId.HasValue)
            {
                pbfNode.info.changeset = node.ChangeSetId.Value;
            }
            else
            {
                pbfNode.info.changeset = 0;
            }
            if (node.TimeStamp.HasValue)
            {
                pbfNode.info.timestamp = Encoder.EncodeTimestamp(node.TimeStamp.Value, block.date_granularity);
            }
            else
            {
                pbfNode.info.timestamp = 0;
            }
            if (node.UserId.HasValue)
            {
                pbfNode.info.uid = (int)node.UserId.Value;
            }
            else
            {
                pbfNode.info.uid = 0;
            }
            pbfNode.info.user_sid = Encoder.EncodeString(block, reverseStringTable, node.UserName);
            if (node.Version.HasValue)
            {
                pbfNode.info.version = (int)node.Version.Value;
            }
            else
            {
                pbfNode.info.version = 0;
            }
            pbfNode.lat = Encoder.EncodeLatLon(node.Latitude.Value, block.lat_offset, block.granularity);
            pbfNode.lon = Encoder.EncodeLatLon(node.Longitude.Value, block.lon_offset, block.granularity);

            if(node.Tags != null)
            {
                foreach(var tag in node.Tags)
                {
                    pbfNode.keys.Add((uint)Encoder.EncodeString(block, reverseStringTable, tag.Key));
                    pbfNode.vals.Add((uint)Encoder.EncodeString(block, reverseStringTable, tag.Value));
                }
            }
            else
            {
                pbfNode.keys.Clear();
                pbfNode.vals.Clear();
            }
            return pbfNode;
        }
示例#45
0
 public static IEnumerable <OsmGeo> GetElements(this Osm osm)
 {
     return(new OsmGeo[][] { osm.Nodes, osm.Ways, osm.Relations }
            .Where(a => a != null)
            .SelectMany(a => a));
 }
 /// <summary>
 /// Returns all relation containing the given object.
 /// </summary>
 /// <param name="obj"></param>
 /// <returns></returns>
 public IList<Relation> GetRelationsFor(Osm.OsmBase obj)
 {
     // TODO: implement this
     return new List<Relation>();
 }