/// <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 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, 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; }
/// <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); }