/// <summary> /// Converts a PBF way into an OsmSharp-relation. /// </summary> /// <returns></returns> public static OsmSharp.Osm.Relation DecodeRelation(PrimitiveBlock block, OsmSharp.Osm.PBF.Relation pbfRelation) { var relation = new OsmSharp.Osm.Relation(); Encoder.DecodeRelation(block, pbfRelation, relation); return(relation); }
/// <summary> /// Converts a PBF way into an OsmSharp-relation. /// </summary> /// <param name="block"></param> /// <param name="relation"></param> /// <returns></returns> internal OsmSharp.Osm.Relation ConvertRelation(PrimitiveBlock block, OsmSharp.Osm.PBF.Relation relation) { var simpleRelation = new OsmSharp.Osm.Relation(); simpleRelation.Id = relation.id; if (relation.types.Count > 0) { simpleRelation.Members = new List <OsmSharp.Osm.RelationMember>(); long member_id = 0; for (int member_idx = 0; member_idx < relation.types.Count; member_idx++) { member_id = member_id + relation.memids[member_idx]; string role = Encoding.UTF8.GetString( block.stringtable.s[relation.roles_sid[member_idx]]); var member = new OsmSharp.Osm.RelationMember(); member.MemberId = member_id; member.MemberRole = role; switch (relation.types[member_idx]) { case Relation.MemberType.NODE: member.MemberType = OsmSharp.Osm.OsmGeoType.Node; break; case Relation.MemberType.WAY: member.MemberType = OsmSharp.Osm.OsmGeoType.Way; break; case Relation.MemberType.RELATION: member.MemberType = OsmSharp.Osm.OsmGeoType.Relation; break; } simpleRelation.Members.Add(member); } } simpleRelation.Tags = new TagsCollection(relation.keys.Count); if (relation.keys.Count > 0) { for (int tag_idx = 0; tag_idx < relation.keys.Count; tag_idx++) { string key = Encoding.UTF8.GetString(block.stringtable.s[(int)relation.keys[tag_idx]]); string value = Encoding.UTF8.GetString(block.stringtable.s[(int)relation.vals[tag_idx]]); simpleRelation.Tags.Add(new Tag(key, value)); } } if (relation.info != null) { // read metadata if any. simpleRelation.ChangeSetId = relation.info.changeset; simpleRelation.TimeStamp = Utilities.FromUnixTime((long)relation.info.timestamp * (long)block.date_granularity); simpleRelation.UserId = relation.info.uid; simpleRelation.UserName = Encoding.UTF8.GetString(block.stringtable.s[relation.info.user_sid]); simpleRelation.Version = (ulong)relation.info.version; } simpleRelation.Visible = true; return(simpleRelation); }
public override void AddRelation(OsmSharp.Osm.Relation relation) { this._currentEntities.Add((OsmGeo)relation); if (this._currentEntities.Count <= 8000) { return; } this.FlushBlock(); }
/// <summary> /// Converts simple primitives. /// </summary> /// <param name="pbfPrimitive"></param> /// <returns></returns> internal OsmSharp.Osm.OsmGeo Convert(KeyValuePair<PrimitiveBlock, object> pbfPrimitive) { if (pbfPrimitive.Value == null || pbfPrimitive.Key == null) { throw new ArgumentNullException("pbfPrimitive"); } PrimitiveBlock block = pbfPrimitive.Key; // get the block properties this object comes from. if (pbfPrimitive.Value is OsmSharp.Osm.PBF.Node) { var node = (pbfPrimitive.Value as OsmSharp.Osm.PBF.Node); var simpleNode = new OsmSharp.Osm.Node(); simpleNode.ChangeSetId = node.info.changeset; simpleNode.Id = node.id; simpleNode.Latitude = .000000001 * ((double)block.lat_offset + ((double)block.granularity * (double)node.lat)); simpleNode.Longitude = .000000001 * ((double)block.lon_offset + ((double)block.granularity * (double)node.lon)); if (node.keys.Count > 0) { simpleNode.Tags = new TagsCollection(); for (int tag_idx = 0; tag_idx < node.keys.Count; tag_idx++) { string key = Encoding.UTF8.GetString(block.stringtable.s[(int)node.keys[tag_idx]]); string value = Encoding.UTF8.GetString(block.stringtable.s[(int)node.vals[tag_idx]]); if (!simpleNode.Tags.ContainsKey(key)) { simpleNode.Tags.Add(new Tag() { Key = key, Value = value }); } } } simpleNode.TimeStamp = Utilities.FromUnixTime((long)node.info.timestamp * (long)block.date_granularity); simpleNode.Visible = true; simpleNode.Version = (uint)node.info.version; simpleNode.UserId = node.info.uid; simpleNode.UserName = Encoding.UTF8.GetString(block.stringtable.s[node.info.user_sid]); simpleNode.Version = (ulong)node.info.version; simpleNode.Visible = true; return simpleNode; } else if (pbfPrimitive.Value is OsmSharp.Osm.PBF.Way) { var way = (pbfPrimitive.Value as OsmSharp.Osm.PBF.Way); var simple_way = new OsmSharp.Osm.Way(); simple_way.Id = way.id; simple_way.Nodes = new List<long>(way.refs.Count); long node_id = 0; for (int node_idx = 0; node_idx < way.refs.Count; node_idx++) { node_id = node_id + way.refs[node_idx]; simple_way.Nodes.Add(node_id); } if (way.keys.Count > 0) { simple_way.Tags = new TagsCollection(); for (int tag_idx = 0; tag_idx < way.keys.Count; tag_idx++) { string key = Encoding.UTF8.GetString(block.stringtable.s[(int)way.keys[tag_idx]]); string value = Encoding.UTF8.GetString(block.stringtable.s[(int)way.vals[tag_idx]]); if (!simple_way.Tags.ContainsKey(key)) { simple_way.Tags.Add(new Tag(key, value)); } } } if (way.info != null) { // add the metadata if any. simple_way.ChangeSetId = way.info.changeset; simple_way.TimeStamp = Utilities.FromUnixTime((long)way.info.timestamp * (long)block.date_granularity); simple_way.UserId = way.info.uid; simple_way.UserName = Encoding.UTF8.GetString(block.stringtable.s[way.info.user_sid]); simple_way.Version = (ulong)way.info.version; } simple_way.Visible = true; return simple_way; } else if (pbfPrimitive.Value is OsmSharp.Osm.PBF.Relation) { var relation = (pbfPrimitive.Value as OsmSharp.Osm.PBF.Relation); var simple_relation = new OsmSharp.Osm.Relation(); simple_relation.Id = relation.id; if (relation.types.Count > 0) { simple_relation.Members = new List<OsmSharp.Osm.RelationMember>(); long member_id = 0; for (int member_idx = 0; member_idx < relation.types.Count; member_idx++) { member_id = member_id + relation.memids[member_idx]; string role = Encoding.UTF8.GetString( block.stringtable.s[relation.roles_sid[member_idx]]); var member = new OsmSharp.Osm.RelationMember(); member.MemberId = member_id; member.MemberRole = role; switch (relation.types[member_idx]) { case Relation.MemberType.NODE: member.MemberType = OsmSharp.Osm.OsmGeoType.Node; break; case Relation.MemberType.WAY: member.MemberType = OsmSharp.Osm.OsmGeoType.Way; break; case Relation.MemberType.RELATION: member.MemberType = OsmSharp.Osm.OsmGeoType.Relation; break; } simple_relation.Members.Add(member); } } if (relation.keys.Count > 0) { simple_relation.Tags = new TagsCollection(); for (int tag_idx = 0; tag_idx < relation.keys.Count; tag_idx++) { string key = Encoding.UTF8.GetString(block.stringtable.s[(int)relation.keys[tag_idx]]); string value = Encoding.UTF8.GetString(block.stringtable.s[(int)relation.vals[tag_idx]]); if (!simple_relation.Tags.ContainsKey(key)) { simple_relation.Tags.Add(new Tag(key, value)); } } } if (relation.info != null) { // read metadata if any. simple_relation.ChangeSetId = relation.info.changeset; simple_relation.TimeStamp = Utilities.FromUnixTime((long)relation.info.timestamp * (long)block.date_granularity); simple_relation.UserId = relation.info.uid; simple_relation.UserName = Encoding.UTF8.GetString(block.stringtable.s[relation.info.user_sid]); simple_relation.Version = (ulong)relation.info.version; } simple_relation.Visible = true; return simple_relation; } throw new Exception(string.Format("PBF primitive with type {0} not supported!", pbfPrimitive.GetType().ToString())); }
/// <summary> /// Converts simple primitives. /// </summary> /// <param name="pbfPrimitive"></param> /// <returns></returns> internal OsmSharp.Osm.OsmGeo Convert(KeyValuePair <PrimitiveBlock, object> pbfPrimitive) { if (pbfPrimitive.Value == null || pbfPrimitive.Key == null) { throw new ArgumentNullException("pbfPrimitive"); } PrimitiveBlock block = pbfPrimitive.Key; // get the block properties this object comes from. if (pbfPrimitive.Value is OsmSharp.Osm.Data.PBF.Node) { var node = (pbfPrimitive.Value as OsmSharp.Osm.Data.PBF.Node); var simpleNode = new OsmSharp.Osm.Node(); simpleNode.ChangeSetId = node.info.changeset; simpleNode.Id = node.id; simpleNode.Latitude = .000000001 * ((double)block.lat_offset + ((double)block.granularity * (double)node.lat)); simpleNode.Longitude = .000000001 * ((double)block.lon_offset + ((double)block.granularity * (double)node.lon)); if (node.keys.Count > 0) { simpleNode.Tags = new SimpleTagsCollection(); for (int tag_idx = 0; tag_idx < node.keys.Count; tag_idx++) { string key = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)node.keys[tag_idx]]); string value = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)node.vals[tag_idx]]); if (!simpleNode.Tags.ContainsKey(key)) { simpleNode.Tags.Add(new Tag() { Key = key, Value = value }); } } } simpleNode.TimeStamp = Utilities.FromUnixTime((long)node.info.timestamp * (long)block.date_granularity); simpleNode.Visible = true; simpleNode.Version = (uint)node.info.version; simpleNode.UserId = node.info.uid; simpleNode.UserName = ASCIIEncoding.ASCII.GetString(block.stringtable.s[node.info.user_sid]); simpleNode.Version = (ulong)node.info.version; simpleNode.Visible = true; return(simpleNode); } else if (pbfPrimitive.Value is OsmSharp.Osm.Data.PBF.Way) { var way = (pbfPrimitive.Value as OsmSharp.Osm.Data.PBF.Way); var simple_way = new OsmSharp.Osm.Way(); simple_way.Id = way.id; simple_way.Nodes = new List <long>(way.refs.Count); long node_id = 0; for (int node_idx = 0; node_idx < way.refs.Count; node_idx++) { node_id = node_id + way.refs[node_idx]; simple_way.Nodes.Add(node_id); } if (way.keys.Count > 0) { simple_way.Tags = new SimpleTagsCollection(); for (int tag_idx = 0; tag_idx < way.keys.Count; tag_idx++) { string key = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)way.keys[tag_idx]]); string value = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)way.vals[tag_idx]]); if (!simple_way.Tags.ContainsKey(key)) { simple_way.Tags.Add(new Tag(key, value)); } } } if (way.info != null) { // add the metadata if any. simple_way.ChangeSetId = way.info.changeset; simple_way.TimeStamp = Utilities.FromUnixTime((long)way.info.timestamp * (long)block.date_granularity); simple_way.UserId = way.info.uid; simple_way.UserName = ASCIIEncoding.ASCII.GetString(block.stringtable.s[way.info.user_sid]); simple_way.Version = (ulong)way.info.version; } simple_way.Visible = true; return(simple_way); } else if (pbfPrimitive.Value is OsmSharp.Osm.Data.PBF.Relation) { var relation = (pbfPrimitive.Value as OsmSharp.Osm.Data.PBF.Relation); var simple_relation = new OsmSharp.Osm.Relation(); simple_relation.Id = relation.id; if (relation.types.Count > 0) { simple_relation.Members = new List <OsmSharp.Osm.RelationMember>(); long member_id = 0; for (int member_idx = 0; member_idx < relation.types.Count; member_idx++) { member_id = member_id + relation.memids[member_idx]; string role = ASCIIEncoding.ASCII.GetString( block.stringtable.s[relation.roles_sid[member_idx]]); var member = new OsmSharp.Osm.RelationMember(); member.MemberId = member_id; member.MemberRole = role; switch (relation.types[member_idx]) { case Relation.MemberType.NODE: member.MemberType = OsmSharp.Osm.OsmGeoType.Node; break; case Relation.MemberType.WAY: member.MemberType = OsmSharp.Osm.OsmGeoType.Way; break; case Relation.MemberType.RELATION: member.MemberType = OsmSharp.Osm.OsmGeoType.Relation; break; } simple_relation.Members.Add(member); } } if (relation.keys.Count > 0) { simple_relation.Tags = new SimpleTagsCollection(); for (int tag_idx = 0; tag_idx < relation.keys.Count; tag_idx++) { string key = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)relation.keys[tag_idx]]); string value = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)relation.vals[tag_idx]]); if (!simple_relation.Tags.ContainsKey(key)) { simple_relation.Tags.Add(new Tag(key, value)); } } } if (relation.info != null) { // read metadata if any. simple_relation.ChangeSetId = relation.info.changeset; simple_relation.TimeStamp = Utilities.FromUnixTime((long)relation.info.timestamp * (long)block.date_granularity); simple_relation.UserId = relation.info.uid; simple_relation.UserName = ASCIIEncoding.ASCII.GetString(block.stringtable.s[relation.info.user_sid]); simple_relation.Version = (ulong)relation.info.version; } simple_relation.Visible = true; return(simple_relation); } throw new Exception(string.Format("PBF primitive with type {0} not supported!", pbfPrimitive.GetType().ToString())); }
/// <summary> /// Converts a PBF way into an OsmSharp-relation. /// </summary> /// <param name="block"></param> /// <param name="relation"></param> /// <returns></returns> internal OsmSharp.Osm.Relation ConvertRelation(PrimitiveBlock block, OsmSharp.Osm.PBF.Relation relation) { var simpleRelation = new OsmSharp.Osm.Relation(); simpleRelation.Id = relation.id; if (relation.types.Count > 0) { simpleRelation.Members = new List<OsmSharp.Osm.RelationMember>(); long member_id = 0; for (int member_idx = 0; member_idx < relation.types.Count; member_idx++) { member_id = member_id + relation.memids[member_idx]; string role = Encoding.UTF8.GetString( block.stringtable.s[relation.roles_sid[member_idx]]); var member = new OsmSharp.Osm.RelationMember(); member.MemberId = member_id; member.MemberRole = role; switch (relation.types[member_idx]) { case Relation.MemberType.NODE: member.MemberType = OsmSharp.Osm.OsmGeoType.Node; break; case Relation.MemberType.WAY: member.MemberType = OsmSharp.Osm.OsmGeoType.Way; break; case Relation.MemberType.RELATION: member.MemberType = OsmSharp.Osm.OsmGeoType.Relation; break; } simpleRelation.Members.Add(member); } } simpleRelation.Tags = new TagsCollection(relation.keys.Count); if (relation.keys.Count > 0) { for (int tag_idx = 0; tag_idx < relation.keys.Count; tag_idx++) { string key = Encoding.UTF8.GetString(block.stringtable.s[(int)relation.keys[tag_idx]]); string value = Encoding.UTF8.GetString(block.stringtable.s[(int)relation.vals[tag_idx]]); simpleRelation.Tags.Add(new Tag(key, value)); } } if (relation.info != null) { // read metadata if any. simpleRelation.ChangeSetId = relation.info.changeset; simpleRelation.TimeStamp = Utilities.FromUnixTime((long)relation.info.timestamp * (long)block.date_granularity); simpleRelation.UserId = relation.info.uid; simpleRelation.UserName = Encoding.UTF8.GetString(block.stringtable.s[relation.info.user_sid]); simpleRelation.Version = (ulong)relation.info.version; } simpleRelation.Visible = true; return simpleRelation; }
/// <summary> /// Converts a PBF way into an OsmSharp-relation. /// </summary> /// <returns></returns> public static OsmSharp.Osm.Relation DecodeRelation(PrimitiveBlock block, OsmSharp.Osm.PBF.Relation pbfRelation) { var relation = new OsmSharp.Osm.Relation(); Encoder.DecodeRelation(block, pbfRelation, relation); return relation; }
/// <summary> /// Converts a PBF way into an OsmSharp-relation. /// </summary> /// <returns></returns> public static OsmSharp.Osm.Relation DecodeRelation(PrimitiveBlock block, OsmSharp.Osm.PBF.Relation pbfRelation, OsmSharp.Osm.Relation relation) { // make sure old data is gone. if (relation.Members != null && relation.Members.Count > 0) { // clear nodes list. relation.Members.Clear(); } if (relation.Tags != null) { // clear the tags collection. relation.Tags.Clear(); } if (relation.Members == null) { // create nodes list. relation.Members = new List <OsmSharp.Osm.RelationMember>(pbfRelation.memids.Count); } if (relation.Tags == null) { // create tags collection. relation.Tags = new TagsCollection(pbfRelation.keys.Count); } // add nex stuff. relation.Id = pbfRelation.id; long memberId = 0; for (var i = 0; i < pbfRelation.types.Count; i++) { memberId = memberId + pbfRelation.memids[i]; var role = System.Text.Encoding.UTF8.GetString( block.stringtable.s[pbfRelation.roles_sid[i]]); var member = new OsmSharp.Osm.RelationMember(); member.MemberId = memberId; member.MemberRole = role; switch (pbfRelation.types[i]) { case Relation.MemberType.NODE: member.MemberType = OsmSharp.Osm.OsmGeoType.Node; break; case Relation.MemberType.WAY: member.MemberType = OsmSharp.Osm.OsmGeoType.Way; break; case Relation.MemberType.RELATION: member.MemberType = OsmSharp.Osm.OsmGeoType.Relation; break; } relation.Members.Add(member); } for (int i = 0; i < pbfRelation.keys.Count; i++) { string key = System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.keys[i]]); string value = System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.vals[i]]); relation.Tags.Add(new Tag(key, value)); } if (pbfRelation.info != null) { // read metadata if any. relation.ChangeSetId = pbfRelation.info.changeset; relation.TimeStamp = Encoder.DecodeTimestamp(pbfRelation.info.timestamp, block.date_granularity); relation.UserId = pbfRelation.info.uid; relation.UserName = null; if (block.stringtable != null) { relation.UserName = System.Text.Encoding.UTF8.GetString(block.stringtable.s[pbfRelation.info.user_sid]); } relation.Version = (ulong)pbfRelation.info.version; } relation.Visible = true; return(relation); }
public void TestEncodeRelation() { var block = new PrimitiveBlock(); block.date_granularity = 1000; block.granularity = 100; block.lat_offset = 0; block.lon_offset = 0; block.stringtable = new StringTable(); block.stringtable.s.Add(System.Text.Encoding.UTF8.GetBytes(string.Empty)); // always encode empty string as '0'. block.stringtable.s.Add(System.Text.Encoding.UTF8.GetBytes("highway")); block.stringtable.s.Add(System.Text.Encoding.UTF8.GetBytes("residential")); block.stringtable.s.Add(System.Text.Encoding.UTF8.GetBytes("Ben")); var relation = new OsmSharp.Osm.Relation(); relation.Id = 1; relation.ChangeSetId = 1; relation.Tags = new OsmSharp.Collections.Tags.TagsCollection(); relation.Tags.Add("name", "Ben"); relation.TimeStamp = DateTime.Now; relation.UserId = 1; relation.UserName = "******"; relation.Version = 1; relation.Visible = true; relation.Members = new List<OsmSharp.Osm.RelationMember>(); relation.Members.Add(new OsmSharp.Osm.RelationMember() { MemberId = 1, MemberRole = "fake role1", MemberType = OsmSharp.Osm.OsmGeoType.Node }); relation.Members.Add(new OsmSharp.Osm.RelationMember() { MemberId = 2, MemberRole = "fake role2", MemberType = OsmSharp.Osm.OsmGeoType.Relation }); var pbfRelation = Encoder.EncodeRelation(block, new Dictionary<string, int>(), relation); Assert.IsNotNull(pbfRelation); Assert.AreEqual(1, pbfRelation.id); Assert.AreEqual(2, pbfRelation.memids.Count); Assert.AreEqual(1, pbfRelation.memids[0]); Assert.AreEqual(1, pbfRelation.memids[1]); Assert.AreEqual(2, pbfRelation.roles_sid.Count); Assert.AreEqual("fake role1", System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.roles_sid[0]])); Assert.AreEqual("fake role2", System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.roles_sid[1]])); Assert.AreEqual(2, pbfRelation.types.Count); Assert.AreEqual(Relation.MemberType.NODE, pbfRelation.types[0]); Assert.AreEqual(Relation.MemberType.RELATION, pbfRelation.types[1]); Assert.AreEqual(1, pbfRelation.info.changeset); Assert.AreEqual(Encoder.EncodeTimestamp(relation.TimeStamp.Value, block.date_granularity), pbfRelation.info.timestamp); Assert.AreEqual(1, pbfRelation.info.uid); Assert.AreEqual("Ben", System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.info.user_sid])); Assert.AreEqual(1, pbfRelation.info.version); Assert.AreEqual(1, pbfRelation.keys.Count); Assert.AreEqual("name", System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.keys[0]])); Assert.AreEqual(1, pbfRelation.vals.Count); Assert.AreEqual("Ben", System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.vals[0]])); }
public static Relation EncodeRelation(PrimitiveBlock block, Dictionary <string, int> reverseStringTable, OsmSharp.Osm.Relation relation) { Relation relation1 = new Relation(); relation1.id = relation.Id.Value; relation1.info = new Info(); long?nullable; if (relation.ChangeSetId.HasValue) { Info info = relation1.info; nullable = relation.ChangeSetId; long num = nullable.Value; info.changeset = num; } if (relation.TimeStamp.HasValue) { relation1.info.timestamp = Encoder.EncodeTimestamp(relation.TimeStamp.Value, (long)block.date_granularity); } nullable = relation.UserId; if (nullable.HasValue) { Info info = relation1.info; nullable = relation.UserId; int num = (int)nullable.Value; info.uid = num; } relation1.info.user_sid = Encoder.EncodeString(block, reverseStringTable, relation.UserName); relation1.info.version = 0; if (relation.Version.HasValue) { relation1.info.version = (int)relation.Version.Value; } if (relation.Tags != null) { foreach (Tag tag in relation.Tags) { relation1.keys.Add((uint)Encoder.EncodeString(block, reverseStringTable, tag.Key)); relation1.vals.Add((uint)Encoder.EncodeString(block, reverseStringTable, tag.Value)); } } if (relation.Members != null && relation.Members.Count > 0) { List <long> memids1 = relation1.memids; nullable = relation.Members[0].MemberId; long num1 = nullable.Value; memids1.Add(num1); relation1.roles_sid.Add(Encoder.EncodeString(block, reverseStringTable, relation.Members[0].MemberRole)); OsmGeoType?memberType = relation.Members[0].MemberType; switch (memberType.Value) { case OsmGeoType.Node: relation1.types.Add(Relation.MemberType.NODE); break; case OsmGeoType.Way: relation1.types.Add(Relation.MemberType.WAY); break; case OsmGeoType.Relation: relation1.types.Add(Relation.MemberType.RELATION); break; } for (int index = 1; index < relation.Members.Count; ++index) { List <long> memids2 = relation1.memids; nullable = relation.Members[index].MemberId; long num2 = nullable.Value; nullable = relation.Members[index - 1].MemberId; long num3 = nullable.Value; long num4 = num2 - num3; memids2.Add(num4); relation1.roles_sid.Add(Encoder.EncodeString(block, reverseStringTable, relation.Members[index].MemberRole)); memberType = relation.Members[index].MemberType; switch (memberType.Value) { case OsmGeoType.Node: relation1.types.Add(Relation.MemberType.NODE); break; case OsmGeoType.Way: relation1.types.Add(Relation.MemberType.WAY); break; case OsmGeoType.Relation: relation1.types.Add(Relation.MemberType.RELATION); break; } } } return(relation1); }
public static OsmSharp.Osm.Relation DecodeRelation(PrimitiveBlock block, Relation pbfRelation, OsmSharp.Osm.Relation relation) { if (relation.Members != null && relation.Members.Count > 0) { relation.Members.Clear(); } if (relation.Tags != null) { relation.Tags.Clear(); } if (relation.Members == null) { relation.Members = new List <RelationMember>(pbfRelation.memids.Count); } if (relation.Tags == null) { relation.Tags = (TagsCollectionBase) new TagsCollection(pbfRelation.keys.Count); } relation.Id = new long?(pbfRelation.id); long num = 0; for (int index = 0; index < pbfRelation.types.Count; ++index) { num += pbfRelation.memids[index]; string str = Encoding.UTF8.GetString(block.stringtable.s[pbfRelation.roles_sid[index]]); RelationMember relationMember = new RelationMember(); relationMember.MemberId = new long?(num); relationMember.MemberRole = str; switch (pbfRelation.types[index]) { case Relation.MemberType.NODE: relationMember.MemberType = new OsmGeoType?(OsmGeoType.Node); break; case Relation.MemberType.WAY: relationMember.MemberType = new OsmGeoType?(OsmGeoType.Way); break; case Relation.MemberType.RELATION: relationMember.MemberType = new OsmGeoType?(OsmGeoType.Relation); break; } relation.Members.Add(relationMember); } for (int index = 0; index < pbfRelation.keys.Count; ++index) { string key = Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.keys[index]]); string str = Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.vals[index]]); relation.Tags.Add(new Tag(key, str)); } if (pbfRelation.info != null) { relation.ChangeSetId = new long?(pbfRelation.info.changeset); relation.TimeStamp = new DateTime?(Encoder.DecodeTimestamp(pbfRelation.info.timestamp, (long)block.date_granularity)); relation.UserId = new long?((long)pbfRelation.info.uid); relation.UserName = (string)null; if (block.stringtable != null) { relation.UserName = Encoding.UTF8.GetString(block.stringtable.s[pbfRelation.info.user_sid]); } relation.Version = new ulong?((ulong)pbfRelation.info.version); } relation.Visible = new bool?(true); return(relation); }
public void TestEncodeRelation() { var block = new PrimitiveBlock(); block.date_granularity = 1000; block.granularity = 100; block.lat_offset = 0; block.lon_offset = 0; block.stringtable = new StringTable(); block.stringtable.s.Add(System.Text.Encoding.UTF8.GetBytes(string.Empty)); // always encode empty string as '0'. block.stringtable.s.Add(System.Text.Encoding.UTF8.GetBytes("highway")); block.stringtable.s.Add(System.Text.Encoding.UTF8.GetBytes("residential")); block.stringtable.s.Add(System.Text.Encoding.UTF8.GetBytes("Ben")); var relation = new OsmSharp.Osm.Relation(); relation.Id = 1; relation.ChangeSetId = 1; relation.Tags = new OsmSharp.Collections.Tags.TagsCollection(); relation.Tags.Add("name", "Ben"); relation.TimeStamp = DateTime.Now; relation.UserId = 1; relation.UserName = "******"; relation.Version = 1; relation.Visible = true; relation.Members = new List <OsmSharp.Osm.RelationMember>(); relation.Members.Add(new OsmSharp.Osm.RelationMember() { MemberId = 1, MemberRole = "fake role1", MemberType = OsmSharp.Osm.OsmGeoType.Node }); relation.Members.Add(new OsmSharp.Osm.RelationMember() { MemberId = 2, MemberRole = "fake role2", MemberType = OsmSharp.Osm.OsmGeoType.Relation }); var pbfRelation = Encoder.EncodeRelation(block, new Dictionary <string, int>(), relation); Assert.IsNotNull(pbfRelation); Assert.AreEqual(1, pbfRelation.id); Assert.AreEqual(2, pbfRelation.memids.Count); Assert.AreEqual(1, pbfRelation.memids[0]); Assert.AreEqual(1, pbfRelation.memids[1]); Assert.AreEqual(2, pbfRelation.roles_sid.Count); Assert.AreEqual("fake role1", System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.roles_sid[0]])); Assert.AreEqual("fake role2", System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.roles_sid[1]])); Assert.AreEqual(2, pbfRelation.types.Count); Assert.AreEqual(Relation.MemberType.NODE, pbfRelation.types[0]); Assert.AreEqual(Relation.MemberType.RELATION, pbfRelation.types[1]); Assert.AreEqual(1, pbfRelation.info.changeset); Assert.AreEqual(Encoder.EncodeTimestamp(relation.TimeStamp.Value, block.date_granularity), pbfRelation.info.timestamp); Assert.AreEqual(1, pbfRelation.info.uid); Assert.AreEqual("Ben", System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.info.user_sid])); Assert.AreEqual(1, pbfRelation.info.version); Assert.AreEqual(1, pbfRelation.keys.Count); Assert.AreEqual("name", System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.keys[0]])); Assert.AreEqual(1, pbfRelation.vals.Count); Assert.AreEqual("Ben", System.Text.Encoding.UTF8.GetString(block.stringtable.s[(int)pbfRelation.vals[0]])); }