Пример #1
0
        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);
            }
        }
Пример #2
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);
        }
Пример #3
0
 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);
 }
Пример #4
0
        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);
        }
Пример #5
0
 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);
 }
Пример #6
0
 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);
 }