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()); } }
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); }
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(); } }
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); }
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); }
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); }
/// <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; }
/// <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); }
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()); }; }
/// <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]); }
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); }
/// <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)); }
// 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()); }
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); }
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; }
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()); }
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"); } } }
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; }
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>()); } }
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); }
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); }
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); }
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(); } }
/// <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; }
/// <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; }
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(); }
/// <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; }
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; }
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; }
/// <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(); } }
public long GetCityId(string City, string CityDistrict, LocalityType localityType) { logger.Debug($"Запрос id для города {City}({CityDistrict})..."); return(Osm.GetCityId(City, CityDistrict, localityType.ToString()));; }
/// <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); }
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; }
/// <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>(); }
/// <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; }
/// <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; }
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>(); }