public override bool MoveNext(bool ignoreNodes, bool ignoreWays, bool ignoreRelations) { for (KeyValuePair <PrimitiveBlock, object> nextPrimitive = this.MoveToNextPrimitive(ignoreNodes, ignoreWays, ignoreRelations); nextPrimitive.Value != null; nextPrimitive = this.MoveToNextPrimitive(ignoreNodes, ignoreWays, ignoreRelations)) { OsmSharp.Osm.PBF.Node pbfNode = nextPrimitive.Value as OsmSharp.Osm.PBF.Node; if (pbfNode != null && !ignoreNodes) { this._current = (OsmGeo)Encoder.DecodeNode(nextPrimitive.Key, pbfNode); return(true); } OsmSharp.Osm.PBF.Way pbfWay = nextPrimitive.Value as OsmSharp.Osm.PBF.Way; if (pbfWay != null && !ignoreWays) { this._current = (OsmGeo)Encoder.DecodeWay(nextPrimitive.Key, pbfWay); return(true); } OsmSharp.Osm.PBF.Relation pbfRelation = nextPrimitive.Value as OsmSharp.Osm.PBF.Relation; if (pbfRelation != null && !ignoreRelations) { this._current = (OsmGeo)Encoder.DecodeRelation(nextPrimitive.Key, pbfRelation); return(true); } } return(false); }
/// <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> /// Move to the next item in the stream. /// </summary> /// <param name="ignoreNodes">Makes this source skip all nodes.</param> /// <param name="ignoreWays">Makes this source skip all ways.</param> /// <param name="ignoreRelations">Makes this source skip all relations.</param> /// <returns></returns> public override bool MoveNext(bool ignoreNodes, bool ignoreWays, bool ignoreRelations) { var nextPBFPrimitive = this.MoveToNextPrimitive(ignoreNodes, ignoreWays, ignoreRelations); while (nextPBFPrimitive.Value != null) { OsmSharp.Osm.PBF.Node node = (nextPBFPrimitive.Value as OsmSharp.Osm.PBF.Node); if (node != null && !ignoreNodes) { // next primitve is a node. _current = this.ConvertNode(nextPBFPrimitive.Key, node); return(true); } OsmSharp.Osm.PBF.Way way = (nextPBFPrimitive.Value as OsmSharp.Osm.PBF.Way); if (way != null && !ignoreWays) { // next primitive is a way. _current = this.ConvertWay(nextPBFPrimitive.Key, way); return(true); } OsmSharp.Osm.PBF.Relation relation = (nextPBFPrimitive.Value as OsmSharp.Osm.PBF.Relation); if (relation != null && !ignoreRelations) { // next primitive is a relation. _current = this.ConvertRelation(nextPBFPrimitive.Key, relation); return(true); } nextPBFPrimitive = this.MoveToNextPrimitive(ignoreNodes, ignoreWays, ignoreRelations); } return(false); }
/// <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); }
void IPBFOsmPrimitiveConsumer.ProcessRelation(PrimitiveBlock block, OsmSharp.Osm.PBF.Relation relation) { this.QueuePrimitive(block, (object)relation); }
/// <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; }
/// <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); }
/// <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); }