Esempio n. 1
0
 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);
 }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
 void IPBFOsmPrimitiveConsumer.ProcessRelation(PrimitiveBlock block, OsmSharp.Osm.PBF.Relation relation)
 {
     this.QueuePrimitive(block, (object)relation);
 }
Esempio n. 6
0
        /// <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;
        }
Esempio n. 7
0
        /// <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);
        }
Esempio n. 8
0
        /// <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);
        }