/// <summary>
        /// Returns true if any member of the relation is inside the filter.
        /// </summary>
        /// <param name="members"></param>
        /// <param name="nodes_inside"></param>
        /// <param name="ways_inside"></param>
        /// <returns></returns>
        private bool IsInsideBoxRelation(IList<SimpleRelationMember> members, HashSet<long> nodes_inside, HashSet<long> ways_inside)
        {
            // first do nodes.
            if (members != null)
            {
                foreach (SimpleRelationMember member in members)
                {
                    if (member.MemberType.HasValue)
                    {
                        if (member.MemberType.Value == SimpleRelationMemberType.Node)
                        {
                            // check known nodes.
                            if (nodes_inside.Contains(member.MemberId.Value))
                            {
                                return true;
                            }

                            // check unknown nodes.
                            OsmSharp.Osm.Node node = _data_source.GetNode(member.MemberId.Value);

                            if (node != null)
                            { // only if the node is found
                                if (_box.IsInsideAny(new OsmSharp.Tools.Math.PointF2D[] { node.Coordinate }))
                                {
                                    nodes_inside.Add(node.Id);
                                    return true;
                                }
                            }
                        }
                    }
                }

                // then do ways
                foreach (SimpleRelationMember member in members)
                {
                    if (member.MemberType.HasValue)
                    {
                        if (member.MemberType.Value == SimpleRelationMemberType.Way)
                        {
                            // check known ways.
                            if (ways_inside.Contains(member.MemberId.Value))
                            {
                                return true;
                            }

                            // check unknown ways.
                            OsmSharp.Osm.Way way = _data_source.GetWay(member.MemberId.Value);

                            if (way != null)
                            { // only if the node is found
                                foreach (Osm.Node node in way.Nodes)
                                {
                                    if (_box.IsInsideAny(new OsmSharp.Tools.Math.PointF2D[] { node.Coordinate }))
                                    {
                                        ways_inside.Add(way.Id);
                                        nodes_inside.Add(node.Id);
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                }

                // then do relations.
                foreach (SimpleRelationMember member in members)
                {
                    if (member.MemberType.HasValue)
                    {
                        if (member.MemberType.Value == SimpleRelationMemberType.Node)
                        {
                            if (!_tested_relations.Contains(member.MemberId.Value))
                            {
                                _tested_relations.Add(member.MemberId.Value);

                                // get the relation.
                                OsmSharp.Osm.Relation relation = _data_source.GetRelation(member.MemberId.Value);
                                if (relation != null)
                                {
                                    List<SimpleRelationMember> simple_members = new List<SimpleRelationMember>();
                                    foreach (Osm.RelationMember loaded_member in relation.Members)
                                    {
                                        SimpleRelationMember simple_member = new SimpleRelationMember();
                                        simple_member.MemberId = loaded_member.Member.Id;
                                        simple_member.MemberRole = loaded_member.Role;
                                        switch (loaded_member.Member.Type)
                                        {
                                            case OsmSharp.Osm.OsmType.Node:
                                                simple_member.MemberType = SimpleRelationMemberType.Node;
                                                break;
                                            case OsmSharp.Osm.OsmType.Way:
                                                simple_member.MemberType = SimpleRelationMemberType.Way;
                                                break;
                                            case OsmSharp.Osm.OsmType.Relation:
                                                simple_member.MemberType = SimpleRelationMemberType.Relation;
                                                break;
                                        }
                                        simple_members.Add(simple_member);
                                    }

                                    if (this.IsInsideBoxRelation(simple_members,nodes_inside,ways_inside))
                                    {
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return false;
        }
        private bool MoveNextRelation()
        {
            if (_relation_reader == null)
            {
                OracleCommand relation_command = new OracleCommand("select * from relation order by id");
                relation_command.Connection = _connection;
                _relation_reader = relation_command.ExecuteReader();
                if (!_relation_reader.Read())
                {
                    _relation_reader.Close();
                }
                OracleCommand relation_tag_command = new OracleCommand("select * from relation_tags order by relation_id");
                relation_tag_command.Connection = _connection;
                _relation_tag_reader = relation_tag_command.ExecuteReader();
                if (!_relation_tag_reader.IsClosed && !_relation_tag_reader.Read())
                {
                    _relation_tag_reader.Close();
                }
                OracleCommand relation_node_command = new OracleCommand("select * from relation_members order by relation_id,sequence_id");
                relation_node_command.Connection = _connection;
                _relation_member_reader = relation_node_command.ExecuteReader();
                if (!_relation_member_reader.IsClosed && !_relation_member_reader.Read())
                {
                    _relation_member_reader.Close();
                }
            }

            // read next relation.
            if (!_relation_reader.IsClosed)
            {
                // load/parse data.
                long id = _relation_reader.GetInt64(0);
                long changeset_id = _relation_reader.GetInt64(1);
                DateTime timestamp = _relation_reader.GetDateTime(2);
                bool visible = _relation_reader.GetInt64(3) == 1;
                long version = _relation_reader.GetInt64(4);
                string user = _relation_reader.GetString(5);
                long uid = _relation_reader.GetInt64(6);
                SimpleRelation relation = new SimpleRelation();
                relation.Id = id;
                relation.ChangeSetId = changeset_id;
                relation.TimeStamp = timestamp;
                relation.UserId = null;
                relation.UserName = null;
                relation.Version = (ulong)version;
                relation.Visible = visible;
                relation.UserName = user;
                relation.UserId = uid;

                if (!_relation_tag_reader.IsClosed)
                {
                    long returned_id = _relation_tag_reader.GetInt64(0);
                    while (returned_id == relation.Id.Value)
                    {
                        if (relation.Tags == null)
                        {
                            relation.Tags = new Dictionary<string, string>();
                        }
                        string key = _relation_tag_reader.GetString(1);
                        string value = _relation_tag_reader.GetString(2);

                        relation.Tags.Add(key, value);

                        if (!_relation_tag_reader.Read())
                        {
                            _relation_tag_reader.Close();
                            returned_id = -1;
                        }
                        else
                        {
                            returned_id = _relation_tag_reader.GetInt64(0);
                        }
                    }
                }
                if (!_relation_member_reader.IsClosed)
                {
                    long returned_id = _relation_member_reader.GetInt64(0);
                    while (returned_id == relation.Id.Value)
                    {
                        if (relation.Members == null)
                        {
                            relation.Members = new List<SimpleRelationMember>();
                        }
                        string member_type = _relation_member_reader.GetString(1);
                        long member_id = _relation_member_reader.GetInt64(2);
                        object member_role = _relation_member_reader.GetValue(3);

                        SimpleRelationMember member = new SimpleRelationMember();
                        member.MemberId = member_id;
                        if (member_role != DBNull.Value)
                        {
                            member.MemberRole = member_role as string;
                        }
                        switch (member_type)
                        {
                            case "Node":
                                member.MemberType = SimpleRelationMemberType.Node;
                                break;
                            case "Way":
                                member.MemberType = SimpleRelationMemberType.Way;
                                break;
                            case "Relation":
                                member.MemberType = SimpleRelationMemberType.Relation;
                                break;
                        }

                        relation.Members.Add(member);

                        if (!_relation_member_reader.Read())
                        {
                            _relation_member_reader.Close();
                            returned_id = -1;
                        }
                        else
                        {
                            returned_id = _relation_member_reader.GetInt64(0);
                        }
                    }
                }

                // set the current variable!
                _current = relation;

                // advance the reader(s).
                if (!_relation_reader.Read())
                {
                    _relation_reader.Close();
                }
                if (!_relation_tag_reader.IsClosed && !_relation_tag_reader.Read())
                {
                    _relation_tag_reader.Close();
                }
                if (!_relation_member_reader.IsClosed && !_relation_member_reader.Read())
                {
                    _relation_member_reader.Close();
                }
                return true;
            }
            else
            {
                _relation_reader.Close();
                _relation_reader.Dispose();
                _relation_reader = null;

                _relation_tag_reader.Close();
                _relation_tag_reader.Dispose();
                _relation_tag_reader = null;

                _current_type = SimpleOsmGeoType.Relation;

                return false;
            }
        }
        /// <summary>
        /// Converts simple primitives.
        /// </summary>
        /// <param name="pbf_primitive"></param>
        /// <returns></returns>
        internal SimpleOsmGeo Convert(KeyValuePair<PrimitiveBlock, object> pbf_primitive)
        {
            if (pbf_primitive.Value == null || pbf_primitive.Key == null)
            {
                throw new ArgumentNullException("pbf_primitive");
            }

            PrimitiveBlock block = pbf_primitive.Key; // get the block properties this object comes from.
            if (pbf_primitive.Value is Node)
            {
                Node node = (pbf_primitive.Value as Node);
                SimpleNode simple_node = new SimpleNode();
                simple_node.ChangeSetId = node.info.changeset;
                simple_node.Id = node.id;
                simple_node.Latitude = .000000001 * ((double)block.lat_offset
                    + ((double)block.granularity * (double)node.lat));
                simple_node.Longitude = .000000001 * ((double)block.lon_offset
                    + ((double)block.granularity * (double)node.lon));
                simple_node.Tags = new Dictionary<string, string>();
                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 (!simple_node.Tags.ContainsKey(key))
                    {
                        simple_node.Tags.Add(new KeyValuePair<string, string>(key, value));
                    }
                }
                simple_node.TimeStamp = OsmSharp.Tools.Utilities.FromUnixTime((long)node.info.timestamp *
                    (long)block.date_granularity);
                simple_node.Visible = true;
                simple_node.Version = (uint)node.info.version;
                simple_node.UserId = node.info.uid;
                simple_node.UserName = ASCIIEncoding.ASCII.GetString(block.stringtable.s[node.info.user_sid]);
                simple_node.Version = (ulong)node.info.version;
                simple_node.Visible = true;

                return simple_node;
            }
            else if (pbf_primitive.Value is Way)
            {
                Way way = (pbf_primitive.Value as Way);

                SimpleWay simple_way = new SimpleWay();
                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);
                }
                simple_way.Tags = new Dictionary<string, string>();
                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 KeyValuePair<string, string>(key, value));
                    }
                }
                if (way.info != null)
                { // add the metadata if any.
                    simple_way.ChangeSetId = way.info.changeset;
                    simple_way.TimeStamp = OsmSharp.Tools.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 (pbf_primitive.Value is Relation)
            {
                Relation relation = (pbf_primitive.Value as Relation);

                SimpleRelation simple_relation = new SimpleRelation();
                simple_relation.Id = relation.id;
                simple_relation.Members = new List<SimpleRelationMember>();
                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]]);
                    SimpleRelationMember member = new SimpleRelationMember();
                    member.MemberId = member_id;
                    member.MemberRole = role;
                    switch(relation.types[member_idx])
                    {
                        case Relation.MemberType.NODE:
                            member.MemberType = SimpleRelationMemberType.Node;
                            break;
                        case Relation.MemberType.WAY:
                            member.MemberType = SimpleRelationMemberType.Way;
                            break;
                        case Relation.MemberType.RELATION:
                            member.MemberType = SimpleRelationMemberType.Relation;
                            break;
                    }

                    simple_relation.Members.Add(member);
                }
                simple_relation.Tags = new Dictionary<string, string>();
                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 KeyValuePair<string, string>(key, value));
                    }
                }
                if (relation.info != null)
                { // read metadata if any.
                    simple_relation.ChangeSetId = relation.info.changeset;
                    simple_relation.TimeStamp = OsmSharp.Tools.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!",
                pbf_primitive.GetType().ToString()));
        }
Example #4
0
        internal static SimpleRelation ConvertToSimple(Osm.Xml.v0_6.relation re)
        {
            SimpleRelation relation = new SimpleRelation();

            // set id
            if (re.idSpecified)
            {
                relation.Id = re.id;
            }

            // set changeset.
            if (re.changesetSpecified)
            {
                relation.ChangeSetId = re.changeset;
            }

            // set visible.
            if (re.visibleSpecified)
            {
                relation.Visible = re.visible;
            }
            else
            { // if visible is not specified it is default true.
                relation.Visible = true;
            }

            // set timestamp.
            if (re.timestampSpecified)
            {
                relation.TimeStamp = re.timestamp;
            }

            // set uid
            if (re.uidSpecified)
            {
                relation.UserId = re.uid;
            }

            // set version
            if (re.versionSpecified)
            {
                relation.Version = re.version;
            }

            // set user
            relation.UserName = re.user;

            // set tags.
            relation.Tags = XmlSimpleConverter.ConvertToTags(re.tag);

            // set members.
            if (re.member != null && re.member.Length > 0)
            {
                relation.Members = new List<SimpleRelationMember>();
                for (int idx = 0; idx < re.member.Length; idx++)
                {
                    OsmSharp.Osm.Xml.v0_6.member mem = re.member[idx];
                    SimpleRelationMember relation_member = new SimpleRelationMember();
                    // set memberid
                    if (mem.refSpecified)
                    {
                        relation_member.MemberId = mem.@ref;
                    }

                    // set role.
                    relation_member.MemberRole = mem.role;

                    // set type.
                    if (mem.typeSpecified)
                    {
                        switch (mem.type)
                        {
                            case OsmSharp.Osm.Xml.v0_6.memberType.node:
                                relation_member.MemberType = SimpleRelationMemberType.Node;
                                break;
                            case OsmSharp.Osm.Xml.v0_6.memberType.way:
                                relation_member.MemberType = SimpleRelationMemberType.Way;
                                break;
                            case OsmSharp.Osm.Xml.v0_6.memberType.relation:
                                relation_member.MemberType = SimpleRelationMemberType.Relation;
                                break;
                        }
                    }

                    relation.Members.Add(relation_member);
                }
            }

            return relation;
        }
Example #5
0
        /// <summary>
        /// Converts this relation into it's simple counterpart.
        /// </summary>
        /// <returns></returns>
        public override SimpleOsmGeo ToSimple()
        {
            SimpleRelation relation = new SimpleRelation();
            relation.Id = this.Id;
            relation.ChangeSetId = this.ChangeSetId;
            relation.Tags = this.Tags;
            relation.TimeStamp = this.TimeStamp;
            relation.UserId = this.UserId;
            relation.UserName = this.User;
            relation.Version = (ulong?)this.Version;
            relation.Visible = this.Visible;

            relation.Members = new List<SimpleRelationMember>();
            foreach (RelationMember member in this.Members)
            {
                SimpleRelationMember simple_member = new SimpleRelationMember();
                simple_member.MemberId = member.Member.Id;
                simple_member.MemberRole = member.Role;
                switch(member.Member.Type)
                {
                    case OsmType.Node:
                        simple_member.MemberType = SimpleRelationMemberType.Node;
                        break;
                    case OsmType.Relation:
                        simple_member.MemberType = SimpleRelationMemberType.Relation;
                        break;
                    case OsmType.Way:
                        simple_member.MemberType = SimpleRelationMemberType.Way;
                        break;
                }
                relation.Members.Add(simple_member);
            }
            return relation;
        }