// est: since going from 6 to 10 took 1 minute, we might expect doing all 256 would take 256 minutes // if we break it up into quadrants using the same library, maybe it'll only take (4+1+1/16...) roughly 5.33 minutes? // actually took 8.673 mins (went from 450MB to 455MB) // estimated time to segment the whole 43.1 GB planet? 12/28/2018 = 8.673 * 43.1 / 8.05 * 47.7833 = 36.98 hours public static void BreakupFile(string filePath, ISector sector, int targetZoom) { if (sector.Zoom == targetZoom) { return; } List <ISector> quadrants = sector.GetChildrenAtLevel(sector.Zoom + 1); if (READ_BREAKUP_STEP <= CURRENT_BREAKUP_STEP) { foreach (var quadrant in quadrants) { String quadrantPath = OSMPaths.GetSectorPath(quadrant); if (File.Exists(quadrantPath)) { File.Delete(quadrantPath); // we're assuming it's corrupted } if (!Directory.Exists(Path.GetDirectoryName(quadrantPath))) { Directory.CreateDirectory(Path.GetDirectoryName(quadrantPath)); } var fInfo = new FileInfo(filePath); using (var fileInfoStream = fInfo.OpenRead()) { using (var source = new PBFOsmStreamSource(fileInfoStream)) { var filtered = source.FilterNodes(x => x.Longitude.HasValue && x.Latitude.HasValue && quadrant.ContainsLongLat(new LongLat(x.Longitude.Value * Math.PI / 180, x.Latitude.Value * Math.PI / 180)), true); using (var stream = new FileInfo(quadrantPath).Open(FileMode.Create, FileAccess.ReadWrite)) { var target = new PBFOsmStreamTarget(stream, true); target.RegisterSource(filtered); target.Pull(); target.Close(); } } } } if (Path.GetFileName(filePath).ToLower() != Path.GetFileName(OSMPaths.GetPlanetPath()).ToLower()) { File.Delete(filePath); } } BreakupStepDone(); foreach (var quadrant in quadrants) { String quadrantPath = OSMPaths.GetSectorPath(quadrant); BreakupFile(quadrantPath, quadrant, targetZoom); } }
public void TestReadWriteCompressedRead_ShouldSucceed() { var source = new PBFOsmStreamSource( Assembly.GetExecutingAssembly().GetManifestResourceStream( "OsmSharp.Test.data.pbf.api.osm.pbf")); using (var memoryStream = new MemoryStream()) { var target = new PBFOsmStreamTarget(memoryStream, true); target.RegisterSource(source); target.Pull(); memoryStream.Seek(0, 0); Assert.AreEqual(1715, new PBFOsmStreamSource(memoryStream).Count(n => n is Node)); } }
static int READ_BREAKUP_STEP = 0; // easy way to allow continuation, should usually equal (#filesThatArenttoplevel)/3 public static void SegmentOSMPlanet() { READ_BREAKUP_STEP = int.Parse(File.ReadAllText(OSMPaths.GetPlanetStepPath()).Split(',')[0]); // file should contain the number of physical breakups that were finished List <ISector> quadrants = ZCoords.GetSectorManager().GetTopmostOSMSectors(); if (READ_BREAKUP_STEP <= CURRENT_BREAKUP_STEP) { foreach (var quadrant in quadrants) { String quadrantPath = OSMPaths.GetSectorPath(quadrant); if (File.Exists(quadrantPath)) { File.Delete(quadrantPath); // we're assuming it's corrupted } if (!Directory.Exists(Path.GetDirectoryName(quadrantPath))) { Directory.CreateDirectory(Path.GetDirectoryName(quadrantPath)); } var fInfo = new FileInfo(OSMPaths.GetPlanetPath()); using (var fileInfoStream = fInfo.OpenRead()) { using (var source = new PBFOsmStreamSource(fileInfoStream)) { var filtered = source.FilterNodes(x => x.Longitude.HasValue && x.Latitude.HasValue && quadrant.ContainsLongLat(new LongLat(x.Longitude.Value * Math.PI / 180, x.Latitude.Value * Math.PI / 180)), true); using (var stream = new FileInfo(quadrantPath).Open(FileMode.Create, FileAccess.ReadWrite)) { var target = new PBFOsmStreamTarget(stream, true); target.RegisterSource(filtered); target.Pull(); target.Close(); } } } } } BreakupStepDone(); foreach (var quadrant in quadrants) { String quadrantPath = OSMPaths.GetSectorPath(quadrant); BreakupFile(quadrantPath, quadrant, ZCoords.GetSectorManager().GetHighestOSMZoom()); } }
public void TestWriteMix() { var sourceNode = Node.Create(1, 1.1, 1.2); sourceNode.Tags = new TagsCollection(); sourceNode.Tags.Add("highway", "residential"); sourceNode.ChangeSetId = 1; sourceNode.TimeStamp = DateTime.Now; sourceNode.UserId = 1; sourceNode.UserName = "******"; sourceNode.Version = 3; sourceNode.Visible = true; var sourceWay = Way.Create(1, 1, 2); sourceWay.Tags = new TagsCollection(); sourceWay.Tags.Add("highway", "residential"); sourceWay.ChangeSetId = 1; sourceWay.TimeStamp = DateTime.Now; sourceWay.UserId = 1; sourceWay.UserName = "******"; sourceWay.Version = 3; sourceWay.Visible = true; var sourceRelation = Relation.Create(1, new RelationMember() { MemberId = 1, MemberRole = "fake role", MemberType = OsmGeoType.Node }, new RelationMember() { MemberId = 1, MemberRole = "fake role", MemberType = OsmGeoType.Way }); sourceRelation.Tags = new TagsCollection(); sourceRelation.Tags.Add("highway", "residential"); sourceRelation.ChangeSetId = 1; sourceRelation.TimeStamp = DateTime.Now; sourceRelation.UserId = 1; sourceRelation.UserName = "******"; sourceRelation.Version = 3; sourceRelation.Visible = true; var sourceObjects = new OsmGeo[] { sourceNode, sourceWay, sourceRelation }; // build pfb stream target. using (var stream = new MemoryStream()) { var target = new PBFOsmStreamTarget(stream); target.RegisterSource(sourceObjects.ToOsmStreamSource()); target.Pull(); stream.Seek(0, SeekOrigin.Begin); var resultObjects = new List <OsmGeo>(new PBFOsmStreamSource(stream)); Assert.IsNotNull(resultObjects); Assert.AreEqual(3, resultObjects.Count); Assert.AreEqual(sourceObjects[0].Id, resultObjects[0].Id); Assert.AreEqual(sourceObjects[0].ChangeSetId, resultObjects[0].ChangeSetId); Assert.AreEqual(sourceObjects[0].TimeStamp.Value.Ticks, resultObjects[0].TimeStamp.Value.Ticks, 10000000); Assert.AreEqual(sourceObjects[0].UserId, resultObjects[0].UserId); Assert.AreEqual(sourceObjects[0].UserName, resultObjects[0].UserName); Assert.AreEqual(sourceObjects[0].Version, resultObjects[0].Version); Assert.AreEqual(sourceObjects[0].Tags.Count, resultObjects[0].Tags.Count); Assert.IsTrue(resultObjects[0].Tags.Contains(sourceObjects[0].Tags.First <Tag>())); var resultNode = resultObjects[0] as Node; Assert.AreEqual(sourceNode.Latitude.Value, resultNode.Latitude.Value, .0001f); Assert.AreEqual(sourceNode.Longitude.Value, resultNode.Longitude.Value, .0001f); Assert.AreEqual(sourceObjects[1].Id, resultObjects[1].Id); Assert.AreEqual(sourceObjects[1].ChangeSetId, resultObjects[1].ChangeSetId); Assert.AreEqual(sourceObjects[1].TimeStamp.Value.Ticks, resultObjects[1].TimeStamp.Value.Ticks, 10000000); Assert.AreEqual(sourceObjects[1].UserId, resultObjects[1].UserId); Assert.AreEqual(sourceObjects[1].UserName, resultObjects[1].UserName); Assert.AreEqual(sourceObjects[1].Version, resultObjects[1].Version); Assert.AreEqual(sourceObjects[1].Tags.Count, resultObjects[1].Tags.Count); Assert.IsTrue(resultObjects[1].Tags.Contains(sourceObjects[1].Tags.First <Tag>())); var resultWay = resultObjects[1] as Way; Assert.AreEqual(sourceWay.Nodes.Count, resultWay.Nodes.Count); Assert.AreEqual(sourceWay.Nodes[0], resultWay.Nodes[0]); Assert.AreEqual(sourceWay.Nodes[1], resultWay.Nodes[1]); Assert.AreEqual(sourceObjects[2].Id, resultObjects[2].Id); Assert.AreEqual(sourceObjects[2].ChangeSetId, resultObjects[2].ChangeSetId); Assert.AreEqual(sourceObjects[2].TimeStamp.Value.Ticks, resultObjects[2].TimeStamp.Value.Ticks, 10000000); Assert.AreEqual(sourceObjects[2].UserId, resultObjects[2].UserId); Assert.AreEqual(sourceObjects[2].UserName, resultObjects[2].UserName); Assert.AreEqual(sourceObjects[2].Version, resultObjects[2].Version); Assert.AreEqual(sourceObjects[2].Tags.Count, resultObjects[2].Tags.Count); Assert.IsTrue(resultObjects[2].Tags.Contains(sourceObjects[2].Tags.First <Tag>())); var resultRelation = resultObjects[2] as Relation; Assert.AreEqual(sourceRelation.Members.Count, resultRelation.Members.Count); Assert.AreEqual(sourceRelation.Members[0].MemberId, resultRelation.Members[0].MemberId); Assert.AreEqual(sourceRelation.Members[0].MemberRole, resultRelation.Members[0].MemberRole); Assert.AreEqual(sourceRelation.Members[0].MemberType, resultRelation.Members[0].MemberType); Assert.AreEqual(sourceRelation.Members[1].MemberId, resultRelation.Members[1].MemberId); Assert.AreEqual(sourceRelation.Members[1].MemberRole, resultRelation.Members[1].MemberRole); Assert.AreEqual(sourceRelation.Members[1].MemberType, resultRelation.Members[1].MemberType); } }
public void TestWriteNode() { // build source stream. var sourceNode = Node.Create(1, 1.1, 1.2); var sourceObjects = new OsmGeo[] { sourceNode }; var source = sourceObjects.ToOsmStreamSource(); // build pfb stream target. using (var stream = new MemoryStream()) { var target = new PBFOsmStreamTarget(stream); target.RegisterSource(source); target.Pull(); stream.Seek(0, SeekOrigin.Begin); var resultObjects = new List <OsmGeo>(new PBFOsmStreamSource(stream)); Assert.IsNotNull(resultObjects); Assert.AreEqual(1, resultObjects.Count); Assert.AreEqual(sourceObjects[0].Id, resultObjects[0].Id); Assert.AreEqual(0, resultObjects[0].ChangeSetId); Assert.AreEqual(Utilities.FromUnixTime(0), resultObjects[0].TimeStamp); Assert.AreEqual(0, resultObjects[0].UserId); Assert.AreEqual(sourceObjects[0].UserName, resultObjects[0].UserName); Assert.AreEqual(0, resultObjects[0].Version); var resultNode = resultObjects[0] as Node; Assert.AreEqual(sourceNode.Latitude.Value, resultNode.Latitude.Value, .0001f); Assert.AreEqual(sourceNode.Longitude.Value, resultNode.Longitude.Value, .0001f); } // build source stream. sourceNode = Node.Create(1, 1.1, 1.2); sourceNode.Tags = new TagsCollection(); sourceNode.Tags.Add("highway", "residential"); sourceObjects = new OsmGeo[] { sourceNode }; source = sourceObjects.ToOsmStreamSource(); // build pfb stream target. using (var stream = new MemoryStream()) { var target = new PBFOsmStreamTarget(stream); target.RegisterSource(source); target.Pull(); stream.Seek(0, SeekOrigin.Begin); var resultObjects = new List <OsmGeo>(new PBFOsmStreamSource(stream)); Assert.IsNotNull(resultObjects); Assert.AreEqual(1, resultObjects.Count); Assert.AreEqual(sourceObjects[0].Id, resultObjects[0].Id); Assert.AreEqual(0, resultObjects[0].ChangeSetId); Assert.AreEqual(Utilities.FromUnixTime(0), resultObjects[0].TimeStamp); Assert.AreEqual(0, resultObjects[0].UserId); Assert.AreEqual(string.Empty, resultObjects[0].UserName); Assert.AreEqual(0, resultObjects[0].Version); Assert.AreEqual(sourceObjects[0].Tags.Count, resultObjects[0].Tags.Count); Assert.IsTrue(resultObjects[0].Tags.Contains(sourceObjects[0].Tags.First <Tag>())); var resultNode = resultObjects[0] as Node; Assert.AreEqual(sourceNode.Latitude.Value, resultNode.Latitude.Value, .0001f); Assert.AreEqual(sourceNode.Longitude.Value, resultNode.Longitude.Value, .0001f); } // build source stream. sourceNode = Node.Create(1, 1.1, 1.2); sourceNode.Tags = new TagsCollection(); sourceNode.Tags.Add("highway", "residential"); sourceNode.ChangeSetId = 1; sourceNode.TimeStamp = DateTime.Now; sourceNode.UserId = 1; sourceNode.UserName = "******"; sourceNode.Version = 3; sourceNode.Visible = true; sourceObjects = new OsmGeo[] { sourceNode }; source = sourceObjects.ToOsmStreamSource(); // build pfb stream target. using (var stream = new MemoryStream()) { var target = new PBFOsmStreamTarget(stream); target.RegisterSource(source); target.Pull(); stream.Seek(0, SeekOrigin.Begin); var resultObjects = new List <OsmGeo>(new PBFOsmStreamSource(stream)); Assert.IsNotNull(resultObjects); Assert.AreEqual(1, resultObjects.Count); Assert.AreEqual(sourceObjects[0].Id, resultObjects[0].Id); Assert.AreEqual(sourceObjects[0].ChangeSetId, resultObjects[0].ChangeSetId); Assert.AreEqual(sourceObjects[0].TimeStamp.Value.Ticks, resultObjects[0].TimeStamp.Value.Ticks, 10000000); Assert.AreEqual(sourceObjects[0].UserId, resultObjects[0].UserId); Assert.AreEqual(sourceObjects[0].UserName, resultObjects[0].UserName); Assert.AreEqual(sourceObjects[0].Version, resultObjects[0].Version); Assert.AreEqual(sourceObjects[0].Tags.Count, resultObjects[0].Tags.Count); Assert.IsTrue(resultObjects[0].Tags.Contains(sourceObjects[0].Tags.First <Tag>())); var resultNode = resultObjects[0] as Node; Assert.AreEqual(sourceNode.Latitude.Value, resultNode.Latitude.Value, .0001f); Assert.AreEqual(sourceNode.Longitude.Value, resultNode.Longitude.Value, .0001f); } }
public void TestWriteRelation() { // build source stream. var sourceRelation = Relation.Create(1, new RelationMember() { MemberId = 1, MemberRole = "fake role", MemberType = OsmGeoType.Node }, new RelationMember() { MemberId = 1, MemberRole = "fake role", MemberType = OsmGeoType.Way }); var sourceObjects = new OsmGeo[] { sourceRelation }; var source = sourceObjects.ToOsmStreamSource(); // build pfb stream target. using (var stream = new MemoryStream()) { var target = new PBFOsmStreamTarget(stream); target.RegisterSource(source); target.Pull(); stream.Seek(0, SeekOrigin.Begin); var resultObjects = new List <OsmGeo>(new PBFOsmStreamSource(stream)); Assert.IsNotNull(resultObjects); Assert.AreEqual(1, resultObjects.Count); Assert.AreEqual(sourceObjects[0].Id, resultObjects[0].Id); Assert.AreEqual(0, resultObjects[0].ChangeSetId); Assert.AreEqual(Utilities.FromUnixTime(0), resultObjects[0].TimeStamp); Assert.AreEqual(0, resultObjects[0].UserId); Assert.AreEqual(string.Empty, resultObjects[0].UserName); Assert.AreEqual(0, resultObjects[0].Version); var resultRelation = resultObjects[0] as Relation; Assert.AreEqual(sourceRelation.Members.Count, resultRelation.Members.Count); Assert.AreEqual(sourceRelation.Members[0].MemberId, resultRelation.Members[0].MemberId); Assert.AreEqual(sourceRelation.Members[0].MemberRole, resultRelation.Members[0].MemberRole); Assert.AreEqual(sourceRelation.Members[0].MemberType, resultRelation.Members[0].MemberType); Assert.AreEqual(sourceRelation.Members[1].MemberId, resultRelation.Members[1].MemberId); Assert.AreEqual(sourceRelation.Members[1].MemberRole, resultRelation.Members[1].MemberRole); Assert.AreEqual(sourceRelation.Members[1].MemberType, resultRelation.Members[1].MemberType); } // build source stream. sourceRelation = Relation.Create(1, new RelationMember() { MemberId = 1, MemberRole = "fake role", MemberType = OsmGeoType.Node }, new RelationMember() { MemberId = 1, MemberRole = "fake role", MemberType = OsmGeoType.Way }); sourceRelation.Tags = new TagsCollection(); sourceRelation.Tags.Add("highway", "residential"); sourceObjects = new OsmGeo[] { sourceRelation }; // build pfb stream target. using (var stream = new MemoryStream()) { var target = new PBFOsmStreamTarget(stream); target.RegisterSource(sourceObjects.ToOsmStreamSource()); target.Pull(); stream.Seek(0, SeekOrigin.Begin); var resultObjects = new List <OsmGeo>(new PBFOsmStreamSource(stream)); Assert.IsNotNull(resultObjects); Assert.AreEqual(1, resultObjects.Count); Assert.AreEqual(sourceObjects[0].Id, resultObjects[0].Id); Assert.AreEqual(0, resultObjects[0].ChangeSetId); Assert.AreEqual(Utilities.FromUnixTime(0), resultObjects[0].TimeStamp); Assert.AreEqual(0, resultObjects[0].UserId); Assert.AreEqual(string.Empty, resultObjects[0].UserName); Assert.AreEqual(0, resultObjects[0].Version); Assert.AreEqual(sourceObjects[0].Tags.Count, resultObjects[0].Tags.Count); Assert.IsTrue(resultObjects[0].Tags.Contains(sourceObjects[0].Tags.First <Tag>())); var resultRelation = resultObjects[0] as Relation; Assert.AreEqual(sourceRelation.Members.Count, resultRelation.Members.Count); Assert.AreEqual(sourceRelation.Members[0].MemberId, resultRelation.Members[0].MemberId); Assert.AreEqual(sourceRelation.Members[0].MemberRole, resultRelation.Members[0].MemberRole); Assert.AreEqual(sourceRelation.Members[0].MemberType, resultRelation.Members[0].MemberType); Assert.AreEqual(sourceRelation.Members[1].MemberId, resultRelation.Members[1].MemberId); Assert.AreEqual(sourceRelation.Members[1].MemberRole, resultRelation.Members[1].MemberRole); Assert.AreEqual(sourceRelation.Members[1].MemberType, resultRelation.Members[1].MemberType); } // build source stream. sourceRelation = Relation.Create(1, new RelationMember() { MemberId = 1, MemberRole = "fake role", MemberType = OsmGeoType.Node }, new RelationMember() { MemberId = 1, MemberRole = "fake role", MemberType = OsmGeoType.Way }); sourceRelation.Tags = new TagsCollection(); sourceRelation.Tags.Add("highway", "residential"); sourceRelation.ChangeSetId = 1; sourceRelation.TimeStamp = DateTime.Now; sourceRelation.UserId = 1; sourceRelation.UserName = "******"; sourceRelation.Version = 3; sourceRelation.Visible = true; sourceObjects = new OsmGeo[] { sourceRelation }; // build pfb stream target. using (var stream = new MemoryStream()) { var target = new PBFOsmStreamTarget(stream); target.RegisterSource(sourceObjects.ToOsmStreamSource()); target.Pull(); stream.Seek(0, SeekOrigin.Begin); var resultObjects = new List <OsmGeo>(new PBFOsmStreamSource(stream)); Assert.IsNotNull(resultObjects); Assert.AreEqual(1, resultObjects.Count); Assert.AreEqual(sourceObjects[0].Id, resultObjects[0].Id); Assert.AreEqual(sourceObjects[0].ChangeSetId, resultObjects[0].ChangeSetId); Assert.AreEqual(sourceObjects[0].TimeStamp.Value.Ticks, resultObjects[0].TimeStamp.Value.Ticks, 10000000); Assert.AreEqual(sourceObjects[0].UserId, resultObjects[0].UserId); Assert.AreEqual(sourceObjects[0].UserName, resultObjects[0].UserName); Assert.AreEqual(sourceObjects[0].Version, resultObjects[0].Version); Assert.AreEqual(sourceObjects[0].Tags.Count, resultObjects[0].Tags.Count); Assert.IsTrue(resultObjects[0].Tags.Contains(sourceObjects[0].Tags.First <Tag>())); var resultRelation = resultObjects[0] as Relation; Assert.AreEqual(sourceRelation.Members.Count, resultRelation.Members.Count); Assert.AreEqual(sourceRelation.Members[0].MemberId, resultRelation.Members[0].MemberId); Assert.AreEqual(sourceRelation.Members[0].MemberRole, resultRelation.Members[0].MemberRole); Assert.AreEqual(sourceRelation.Members[0].MemberType, resultRelation.Members[0].MemberType); Assert.AreEqual(sourceRelation.Members[1].MemberId, resultRelation.Members[1].MemberId); Assert.AreEqual(sourceRelation.Members[1].MemberRole, resultRelation.Members[1].MemberRole); Assert.AreEqual(sourceRelation.Members[1].MemberType, resultRelation.Members[1].MemberType); } }
public void TestWriteWay() { // build source stream. var sourceWay = new Way() { Id = 1, Nodes = new long[] { 1, 2 } }; var sourceObjects = new OsmGeo[] { sourceWay }; // build pfb stream target. using (var stream = new MemoryStream()) { var target = new PBFOsmStreamTarget(stream); target.RegisterSource(sourceObjects); target.Pull(); stream.Seek(0, SeekOrigin.Begin); var resultObjects = new List <OsmGeo>(new PBFOsmStreamSource(stream)); Assert.IsNotNull(resultObjects); Assert.AreEqual(1, resultObjects.Count); Assert.AreEqual(sourceObjects[0].Id, resultObjects[0].Id); Assert.AreEqual(0, resultObjects[0].ChangeSetId); Assert.AreEqual(OsmSharp.IO.PBF.PBFExtensions.FromUnixTime(0), resultObjects[0].TimeStamp); Assert.AreEqual(0, resultObjects[0].UserId); Assert.AreEqual(sourceObjects[0].UserName, resultObjects[0].UserName); Assert.AreEqual(0, resultObjects[0].Version); var resultWay = resultObjects[0] as Way; Assert.AreEqual(sourceWay.Nodes.Length, resultWay.Nodes.Length); Assert.AreEqual(sourceWay.Nodes[0], resultWay.Nodes[0]); Assert.AreEqual(sourceWay.Nodes[1], resultWay.Nodes[1]); } // build source stream. sourceWay = new Way() { Id = 1, Nodes = new long[] { 1, 2 } }; sourceWay.Tags = new TagsCollection(); sourceWay.Tags.Add("highway", "residential"); sourceObjects = new OsmGeo[] { sourceWay }; // build pfb stream target. using (var stream = new MemoryStream()) { var target = new PBFOsmStreamTarget(stream); target.RegisterSource(sourceObjects); target.Pull(); stream.Seek(0, SeekOrigin.Begin); var resultObjects = new List <OsmGeo>(new PBFOsmStreamSource(stream)); Assert.IsNotNull(resultObjects); Assert.AreEqual(1, resultObjects.Count); Assert.AreEqual(sourceObjects[0].Id, resultObjects[0].Id); Assert.AreEqual(0, resultObjects[0].ChangeSetId); Assert.AreEqual(OsmSharp.IO.PBF.PBFExtensions.FromUnixTime(0), resultObjects[0].TimeStamp); Assert.AreEqual(0, resultObjects[0].UserId); Assert.AreEqual(string.Empty, resultObjects[0].UserName); Assert.AreEqual(0, resultObjects[0].Version); Assert.AreEqual(sourceObjects[0].Tags.Count, resultObjects[0].Tags.Count); Assert.IsTrue(resultObjects[0].Tags.Contains(sourceObjects[0].Tags.First <Tag>())); var resultWay = resultObjects[0] as Way; Assert.AreEqual(sourceWay.Nodes.Length, resultWay.Nodes.Length); Assert.AreEqual(sourceWay.Nodes[0], resultWay.Nodes[0]); Assert.AreEqual(sourceWay.Nodes[1], resultWay.Nodes[1]); } // build source stream. sourceWay = new Way() { Id = 1, Nodes = new long[] { 1, 2 } }; sourceWay.Tags = new TagsCollection(); sourceWay.Tags.Add("highway", "residential"); sourceWay.ChangeSetId = 1; sourceWay.TimeStamp = DateTime.Now; sourceWay.UserId = 1; sourceWay.UserName = "******"; sourceWay.Version = 3; sourceWay.Visible = true; sourceObjects = new OsmGeo[] { sourceWay }; // build pfb stream target. using (var stream = new MemoryStream()) { var target = new PBFOsmStreamTarget(stream); target.RegisterSource(sourceObjects); target.Pull(); stream.Seek(0, SeekOrigin.Begin); var resultObjects = new List <OsmGeo>(new PBFOsmStreamSource(stream)); Assert.IsNotNull(resultObjects); Assert.AreEqual(1, resultObjects.Count); Assert.AreEqual(sourceObjects[0].Id, resultObjects[0].Id); Assert.AreEqual(sourceObjects[0].ChangeSetId, resultObjects[0].ChangeSetId); Assert.AreEqual(sourceObjects[0].TimeStamp.Value.Ticks, resultObjects[0].TimeStamp.Value.Ticks, 10000000); Assert.AreEqual(sourceObjects[0].UserId, resultObjects[0].UserId); Assert.AreEqual(sourceObjects[0].UserName, resultObjects[0].UserName); Assert.AreEqual(sourceObjects[0].Version, resultObjects[0].Version); Assert.AreEqual(sourceObjects[0].Tags.Count, resultObjects[0].Tags.Count); Assert.IsTrue(resultObjects[0].Tags.Contains(sourceObjects[0].Tags.First <Tag>())); var resultWay = resultObjects[0] as Way; Assert.AreEqual(sourceWay.Nodes.Length, resultWay.Nodes.Length); Assert.AreEqual(sourceWay.Nodes[0], resultWay.Nodes[0]); Assert.AreEqual(sourceWay.Nodes[1], resultWay.Nodes[1]); } }