Example #1
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);
        }
Example #2
0
        /// <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()));
        }
Example #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;
        }
Example #5
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;
        }
Example #6
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);
        }