public static void Encode(this PrimitiveBlock block, Dictionary <string, int> reverseStringTable, List <OsmGeo> osmGeos) { int index1 = 0; int index2 = 0; int index3 = 0; if (block.stringtable != null && block.stringtable.s != null) { block.stringtable.s.Clear(); } while (index2 < osmGeos.Count) { PrimitiveGroup primitiveGroup; if (index1 < block.primitivegroup.Count) { primitiveGroup = block.primitivegroup[index1] ?? new PrimitiveGroup(); if (primitiveGroup.dense != null) { if (primitiveGroup.dense.denseinfo != null) { if (primitiveGroup.dense.denseinfo.changeset != null) { primitiveGroup.dense.denseinfo.changeset.Clear(); } if (primitiveGroup.dense.denseinfo.timestamp != null) { primitiveGroup.dense.denseinfo.timestamp.Clear(); } if (primitiveGroup.dense.denseinfo.uid != null) { primitiveGroup.dense.denseinfo.uid.Clear(); } if (primitiveGroup.dense.denseinfo.user_sid != null) { primitiveGroup.dense.denseinfo.user_sid.Clear(); } if (primitiveGroup.dense.denseinfo.version != null) { primitiveGroup.dense.denseinfo.version.Clear(); } } if (primitiveGroup.dense.id != null) { primitiveGroup.dense.id.Clear(); } if (primitiveGroup.dense.keys_vals != null) { primitiveGroup.dense.keys_vals.Clear(); } if (primitiveGroup.dense.lat != null) { primitiveGroup.dense.lat.Clear(); } if (primitiveGroup.dense.lon != null) { primitiveGroup.dense.lon.Clear(); } } if (primitiveGroup.changesets != null) { primitiveGroup.changesets.Clear(); } if (primitiveGroup.ways != null) { primitiveGroup.ways.Clear(); } if (primitiveGroup.relations != null) { primitiveGroup.relations.Clear(); } } else { primitiveGroup = new PrimitiveGroup(); block.primitivegroup.Add(primitiveGroup); } OsmGeoType type = osmGeos[index2].Type; OsmGeo osmGeo = osmGeos[index2]; for (; index2 < osmGeos.Count && osmGeos[index2].Type == type; ++index2) { switch (type) { case OsmGeoType.Node: if (primitiveGroup.nodes.Count > index3) { Encoder.EncodeNode(block, reverseStringTable, primitiveGroup.nodes[index3], osmGeos[index2] as OsmSharp.Osm.Node); } else { primitiveGroup.nodes.Add(Encoder.EncodeNode(block, reverseStringTable, osmGeos[index2] as OsmSharp.Osm.Node)); } ++index3; break; case OsmGeoType.Way: primitiveGroup.ways.Add(Encoder.EncodeWay(block, reverseStringTable, osmGeos[index2] as OsmSharp.Osm.Way)); break; case OsmGeoType.Relation: primitiveGroup.relations.Add(Encoder.EncodeRelation(block, reverseStringTable, osmGeos[index2] as OsmSharp.Osm.Relation)); break; } } if (primitiveGroup.nodes != null) { while (index3 < primitiveGroup.nodes.Count) { primitiveGroup.nodes.RemoveAt(index3); } } ++index1; } while (index1 < block.primitivegroup.Count) { block.primitivegroup.RemoveAt(index1); } }
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 = new OsmSharp.Osm.Relation(); Encoder.DecodeRelation(block, pbfRelation, relation); return(relation); }
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 static OsmSharp.Osm.Way DecodeWay(PrimitiveBlock block, Way pbfWay) { OsmSharp.Osm.Way way = new OsmSharp.Osm.Way(); Encoder.DecodeWay(block, pbfWay, way); return(way); }
public static OsmSharp.Osm.Node DecodeNode(PrimitiveBlock block, Node pbfNode) { OsmSharp.Osm.Node node = new OsmSharp.Osm.Node(); Encoder.DecodeNode(block, pbfNode, node); return(node); }