/// <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())); }
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; }
/// <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; }