/// <summary> /// Creates a new relation member. /// </summary> /// <param name="memberId"></param> /// <param name="memberRole"></param> /// <param name="memberType"></param> /// <returns></returns> public static RelationMember Create(int memberId, string memberRole, OsmGeoType memberType) { RelationMember member = new RelationMember(); member.MemberId = memberId; member.MemberRole = memberRole; member.MemberType = memberType; return member; }
/// <summary> /// Convests the polygon to osm objects. /// </summary> /// <param name="polygon"></param> /// <returns></returns> private OsmGeo ConvertPolygon(OsmSharp.Tools.Xml.Kml.v2_1.PolygonType polygon) { Relation relation = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); relation.Visible = true; relation.Tags.Add("kml_type", "PolygonType"); OsmGeo inner = this.ConvertBoundary(polygon.innerBoundaryIs); if (inner != null) { RelationMember member = new RelationMember(); member.Member = inner; member.Role = "inner"; relation.Members.Add(member); } OsmGeo outer = this.ConvertLinearRing(polygon.outerBoundaryIs.LinearRing); if (outer != null) { RelationMember member = new RelationMember(); member.Member = outer; member.Role = "outer"; relation.Members.Add(member); } return relation; }
/// <summary> /// Converts a polygon. /// </summary> /// <param name="polygon"></param> /// <returns></returns> private OsmGeo ConvertPolygon(OsmSharp.Tools.Xml.Kml.v2_0_response.Polygon polygon) { Relation relation = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); OsmGeo inner = this.ConvertLinearRing(polygon.innerBoundaryIs.LinearRing); if (inner != null) { RelationMember member = new RelationMember(); member.Member = inner; member.Role = "inner"; relation.Members.Add(member); } OsmGeo outer = this.ConvertLinearRing(polygon.outerBoundaryIs.LinearRing); if (outer != null) { RelationMember member = new RelationMember(); member.Member = outer; member.Role = "outer"; relation.Members.Add(member); } return relation; }
/// <summary> /// Converts a placemark into an osm object. /// </summary> /// <param name="placemark"></param> /// <returns></returns> private OsmGeo ConvertPlacemark(OsmSharp.Tools.Xml.Kml.v2_0_response.Placemark placemark) { Relation relation = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); relation.Tags.Add("kml_type", "Response"); for(int idx = 0;idx < placemark.Items.Length;idx++) { RelationMember member; switch (placemark.ItemsElementName[idx]) { case OsmSharp.Tools.Xml.Kml.v2_0_response.ItemsChoiceType1.LineString: member = new RelationMember(); member.Member = this.ConvertLineString(placemark.Items[idx] as OsmSharp.Tools.Xml.Kml.v2_0_response.LineString); member.Role = ""; relation.Members.Add(member); break; case OsmSharp.Tools.Xml.Kml.v2_0_response.ItemsChoiceType1.MultiGeometry: member = new RelationMember(); member.Member = this.ConvertMultiGeometry(placemark.Items[idx] as OsmSharp.Tools.Xml.Kml.v2_0_response.MultiGeometry); member.Role = ""; relation.Members.Add(member); break; case OsmSharp.Tools.Xml.Kml.v2_0_response.ItemsChoiceType1.MultiLineString: member = new RelationMember(); member.Member = this.ConvertMultiLineString(placemark.Items[idx] as OsmSharp.Tools.Xml.Kml.v2_0_response.MultiLineString); member.Role = ""; relation.Members.Add(member); break; case OsmSharp.Tools.Xml.Kml.v2_0_response.ItemsChoiceType1.MultiPoint: member = new RelationMember(); member.Member = this.ConvertMultiPoint(placemark.Items[idx] as OsmSharp.Tools.Xml.Kml.v2_0_response.MultiPoint); member.Role = ""; relation.Members.Add(member); break; case OsmSharp.Tools.Xml.Kml.v2_0_response.ItemsChoiceType1.MultiPolygon: member = new RelationMember(); member.Member = this.ConvertMultiPolygon(placemark.Items[idx] as OsmSharp.Tools.Xml.Kml.v2_0_response.MultiPolygon); member.Role = ""; relation.Members.Add(member); break; case OsmSharp.Tools.Xml.Kml.v2_0_response.ItemsChoiceType1.Point: member = new RelationMember(); member.Member = this.ConvertPoint(placemark.Items[idx] as OsmSharp.Tools.Xml.Kml.v2_0_response.Point); member.Role = ""; relation.Members.Add(member); break; case OsmSharp.Tools.Xml.Kml.v2_0_response.ItemsChoiceType1.Polygon: member = new RelationMember(); member.Member = this.ConvertPolygon(placemark.Items[idx] as OsmSharp.Tools.Xml.Kml.v2_0_response.Polygon); member.Role = ""; relation.Members.Add(member); break; } } return relation; }
/// <summary> /// Converts the multi geometry to multi osm objects. /// </summary> /// <param name="multiGeometry"></param> /// <returns></returns> private OsmGeo ConvertMultiGeometry(OsmSharp.Tools.Xml.Kml.v2_1.MultiGeometryType multiGeometry) { Relation relation = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); relation.Visible = true; relation.Tags.Add("kml_type", "MultiGeometryType"); foreach (OsmSharp.Tools.Xml.Kml.v2_1.GeometryType geo in multiGeometry.Items) { OsmGeo geo_osm = this.ConvertGeometry(geo); if (geo_osm != null) { RelationMember member = new RelationMember(); member.Member = geo_osm; relation.Members.Add(member); } } return relation; }
/// <summary> /// Converts a gpx track into osm objects. /// </summary> /// <param name="trk"></param> /// <returns></returns> private OsmGeo ConvertGpxTrk(OsmSharp.Tools.Xml.Gpx.v1_1.trkType trk) { Relation relation = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); relation.Tags.Add("name", trk.name); relation.Tags.Add("number", trk.number); relation.Tags.Add("description", trk.desc); relation.Tags.Add("type", trk.type); foreach (OsmSharp.Tools.Xml.Gpx.v1_1.trksegType seg in trk.trkseg) { OsmGeo seg_geo = this.ConvertTrkSegType(seg); if (seg_geo != null) { RelationMember member = new RelationMember(); member.Member = seg_geo; member.Role = ""; relation.Members.Add(member); } } return relation; }
/// <summary> /// Returns the relations for the given ids. /// </summary> /// <param name="ids"></param> /// <returns></returns> public override IList<Relation> GetRelations(IList<long> ids) { if (ids.Count > 0) { SQLiteConnection con = this.CreateConnection(); // STEP2: Load ways. Dictionary<long, Relation> relations = new Dictionary<long, Relation>(); string sql; SQLiteCommand com; SQLiteDataReader reader; for (int idx_1000 = 0; idx_1000 <= ids.Count / 1000; idx_1000++) { int start_idx = idx_1000 * 1000; int stop_idx = System.Math.Min((idx_1000 + 1) * 1000, ids.Count); sql = "SELECT id, changeset_id, visible, timestamp, version, usr, usr_id FROM relation WHERE (id IN ({0})) "; string ids_string = this.ConstructIdList(ids, start_idx, stop_idx); if (ids_string.Length > 0) { sql = string.Format(sql, ids_string); com = new SQLiteCommand(sql); com.Connection = con; reader = ExecuteReader(com); Relation relation; while (reader.Read()) { long id = reader.GetInt64(0); long? changeset_id = reader.IsDBNull(1) ? null : (long?)reader.GetInt64(1); bool? visible = reader.IsDBNull(2) ? null : (bool?)reader.GetBoolean(2); DateTime? timestamp = reader.IsDBNull(3) ? null : (DateTime?)this.ConvertDateTime(reader.GetInt64(3)); ulong? version = reader.IsDBNull(4) ? null : (ulong?)reader.GetInt64(4); string user = reader.IsDBNull(5) ? null : reader.GetString(5); long? user_id = reader.IsDBNull(6) ? null : (long?)reader.GetInt64(6); // create way. relation = new Relation(); relation.Id = id; relation.Version = version; relation.UserName = user; relation.UserId = user_id; relation.Visible = visible; relation.TimeStamp = timestamp; relation.ChangeSetId = changeset_id; relations.Add(relation.Id.Value, relation); } reader.Close(); } } //STEP3: Load all relation-member relations List<long> missing_node_ids = new List<long>(); for (int idx_1000 = 0; idx_1000 <= ids.Count / 1000; idx_1000++) { int start_idx = idx_1000 * 1000; int stop_idx = System.Math.Min((idx_1000 + 1) * 1000, ids.Count); sql = "SELECT relation_id, member_type, member_id, member_role, sequence_id FROM relation_members WHERE (relation_id IN ({0})) ORDER BY sequence_id"; string ids_string = this.ConstructIdList(ids, start_idx, stop_idx); if (ids_string.Length > 0) { sql = string.Format(sql, ids_string); com = new SQLiteCommand(sql); com.Connection = con; reader = ExecuteReader(com); while (reader.Read()) { long relation_id = reader.GetInt64(0); long member_type = reader.GetInt64(1); long? member_id = reader.IsDBNull(2) ? null : (long?)reader.GetInt64(2); string member_role = reader.IsDBNull(3) ? null : reader.GetString(3); Relation relation; if (relations.TryGetValue(relation_id, out relation)) { if (relation.Members == null) { relation.Members = new List<RelationMember>(); } RelationMember member = new RelationMember(); member.MemberId = member_id; member.MemberRole = member_role; member.MemberType = this.ConvertMemberType(member_type); relation.Members.Add(member); } } reader.Close(); } } //STEP4: Load all tags. for (int idx_1000 = 0; idx_1000 <= ids.Count / 1000; idx_1000++) { int start_idx = idx_1000 * 1000; int stop_idx = System.Math.Min((idx_1000 + 1) * 1000, ids.Count); sql = "SELECT * FROM relation_tags WHERE (relation_id IN ({0})) "; string ids_string = this.ConstructIdList(ids, start_idx, stop_idx); if (ids_string.Length > 0) { sql = string.Format(sql, ids_string); com = new SQLiteCommand(sql); com.Connection = con; reader = ExecuteReader(com); while (reader.Read()) { long id = reader.GetInt64(0); string key = reader.GetString(1); object value_object = reader[2]; string value = string.Empty; if (value_object != null && value_object != DBNull.Value) { value = (string)value_object; } Relation relation; if (relations.TryGetValue(id, out relation)) { if (relation.Tags == null) { relation.Tags = new TagsCollection(); } relation.Tags.Add(key, value); } } reader.Close(); } } return relations.Values.ToList<Relation>(); } return new List<Relation>(); }
/// <summary> /// Converts a container and it's contents to osm elements. /// </summary> /// <param name="container"></param> private Relation ConvertContainer(OsmSharp.Tools.Xml.Kml.v2_1.ContainerType container) { // get the features. if (container is OsmSharp.Tools.Xml.Kml.v2_1.FolderType) { OsmSharp.Tools.Xml.Kml.v2_1.FolderType folder = (container as OsmSharp.Tools.Xml.Kml.v2_1.FolderType); // items1 are the features. IList<OsmGeo> created_features = this.ConvertFeatures(folder.Items1); // create the relation for this folder. Relation relation = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); relation.Tags.Add("name", folder.name); relation.Visible = folder.visibility; relation.Tags.Add("description", folder.description); relation.Tags.Add("kml_folder", "yes"); foreach (OsmGeo geo in created_features) { RelationMember member = new RelationMember(); member.Member = geo; member.Role = ""; relation.Members.Add(member); } return relation; } else if(container is OsmSharp.Tools.Xml.Kml.v2_1.DocumentType) { OsmSharp.Tools.Xml.Kml.v2_1.DocumentType document = (container as OsmSharp.Tools.Xml.Kml.v2_1.DocumentType); // items1 are the features. IList<OsmGeo> created_features = this.ConvertFeatures(document.Items1); // create the relation for this folder. Relation relation = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); relation.Tags.Add("name", document.name); relation.Visible = document.visibility; relation.Tags.Add("description", document.description); relation.Tags.Add("kml_folder", "yes"); foreach (OsmGeo geo in created_features) { RelationMember members = new RelationMember(); members.Member = geo; members.Role = ""; } return relation; } return null; }
/// <summary> /// Converts an Xml relation to an Osm domain model relation. /// </summary> /// <param name="xml_obj"></param> /// <returns></returns> public static Relation ConvertFrom(this relation xml_obj) { // create a new node and immidiately set the id. Relation new_obj = new Relation(); new_obj.Id = xml_obj.id; // set the members new_obj.Members = new List<RelationMember>(xml_obj.member.Length); for (int idx = 0; idx < xml_obj.member.Length; idx++) { member member = xml_obj.member[idx]; RelationMember simpleMember = new RelationMember(); simpleMember.MemberId = member.@ref; simpleMember.MemberRole = member.role; if (member.refSpecified && member.typeSpecified) { switch (member.type) { case memberType.node: simpleMember.MemberType = OsmGeoType.Node; break; case memberType.relation: simpleMember.MemberType = OsmGeoType.Relation; break; case memberType.way: simpleMember.MemberType = OsmGeoType.Way; break; } } else { // way cannot be converted; member could not be created! return null; } new_obj.Members.Add(simpleMember); } // set the tags. if (xml_obj.tag != null) { foreach (Osm.Xml.v0_6.tag tag in xml_obj.tag) { new_obj.Tags.Add(tag.k, tag.v); } } // set the user info. if (xml_obj.uidSpecified) { new_obj.UserId = xml_obj.uid; } new_obj.UserName = xml_obj.user; // set the changeset info. if (xml_obj.changesetSpecified) { new_obj.ChangeSetId = xml_obj.changeset; } // set the timestamp flag. if (xml_obj.timestampSpecified) { new_obj.TimeStamp = xml_obj.timestamp; } // set the visible flag. new_obj.Visible = xml_obj.visible; return new_obj; }
/// <summary> /// Converts an Xml relation to an Osm domain model relation. /// </summary> /// <returns></returns> public static Relation ConvertFrom(this relation xmlRelation) { // create a new node and immidiately set the id. var relation = new Relation(); relation.Id = xmlRelation.id; // set the members relation.Members = new List<RelationMember>(xmlRelation.member.Length); for (var i = 0; i < xmlRelation.member.Length; i++) { var xmlMember = xmlRelation.member[i]; var member = new RelationMember(); member.MemberId = xmlMember.@ref; member.MemberRole = xmlMember.role; if (xmlMember.refSpecified && xmlMember.typeSpecified) { switch (xmlMember.type) { case memberType.node: member.MemberType = OsmGeoType.Node; break; case memberType.relation: member.MemberType = OsmGeoType.Relation; break; case memberType.way: member.MemberType = OsmGeoType.Way; break; } } else { // way cannot be converted; member could not be created! return null; } relation.Members.Add(member); } // set the tags. if (xmlRelation.tag != null) { foreach (var tag in xmlRelation.tag) { relation.Tags.Add(tag.k, tag.v); } } // set the user info. if (xmlRelation.uidSpecified) { relation.UserId = xmlRelation.uid; } relation.UserName = xmlRelation.user; // set the changeset info. if (xmlRelation.changesetSpecified) { relation.ChangeSetId = xmlRelation.changeset; } // set the timestamp flag. if (xmlRelation.timestampSpecified) { relation.TimeStamp = xmlRelation.timestamp; } // set the visible flag. relation.Visible = xmlRelation.visible; return relation; }
/// <summary> /// Converts an Xml relation to an Osm domain model relation. /// </summary> /// <param name="xml_obj"></param> /// <param name="node_source"></param> /// <param name="way_source"></param> /// <param name="relation_source"></param> /// <returns></returns> public static Relation ConvertFrom(this relation xml_obj, INodeSource node_source, IWaySource way_source, IRelationSource relation_source) { // create a new node and immidiately set the id. Relation new_obj = OsmBaseFactory.CreateRelation(xml_obj.id); // set the members for (int idx = 0; idx < xml_obj.member.Length; idx++) { member member = xml_obj.member[idx]; if (member.refSpecified && member.typeSpecified) { switch (member.type) { case memberType.node: long node_id = member.@ref; Node member_node = node_source.GetNode(node_id); if (member_node != null) { RelationMember node_member = new RelationMember(); node_member.Member = member_node; node_member.Role = member.role; new_obj.Members.Add(node_member); } else { // relation cannot be converted; node was not found! return null; } break; case memberType.relation: long relation_id = member.@ref; Relation member_relation = relation_source.GetRelation(relation_id); if (member_relation != null) { RelationMember relation_member = new RelationMember(); relation_member.Member = member_relation; relation_member.Role = member.role; new_obj.Members.Add(relation_member); } else { // relation cannot be converted; relation was not found! return null; } break; case memberType.way: long way_id = member.@ref; Way member_way = way_source.GetWay(way_id); if (member_way != null) { RelationMember way_member = new RelationMember(); way_member.Member = member_way; way_member.Role = member.role; new_obj.Members.Add(way_member); } else { // relation cannot be converted; way was not found! return null; } break; } } else { // way cannot be converted; member could not be created! return null; } } // set the tags. if (xml_obj.tag != null) { foreach (Osm.Xml.v0_6.tag tag in xml_obj.tag) { new_obj.Tags.Add(tag.k, tag.v); } } // set the user info. if (xml_obj.uidSpecified) { new_obj.UserId = xml_obj.uid; } new_obj.User = xml_obj.user; // set the changeset info. if (xml_obj.changesetSpecified) { new_obj.ChangeSetId = xml_obj.changeset; } // set the timestamp flag. if (xml_obj.timestampSpecified) { new_obj.TimeStamp = xml_obj.timestamp; } // set the visible flag. new_obj.Visible = xml_obj.visible; return new_obj; }
private RelationMember ReadRelationMember(SQLiteDataReader reader) { var relation_member = new RelationMember(); relation_member.MemberType = SchemaTools.ConvertMemberType(reader.GetInt16(0)); relation_member.MemberId = reader.GetInt64(1); relation_member.MemberRole = reader.GetString(2); return relation_member; }
private Tuple<long, RelationMember> ReadRelationIdAndMember(SQLiteDataReader reader) { var relation_member = new RelationMember(); relation_member.MemberType = SchemaTools.ConvertMemberType(reader.GetInt16(1)); relation_member.MemberId = reader.GetInt64(2); relation_member.MemberRole = reader.GetString(3); return new Tuple<long, RelationMember>(reader.GetInt64(0), relation_member); }
/// <summary> /// Reads all the data from the osm document if needed. /// </summary> private void ReadFromDocument() { if (!_read) { _read = true; if (_document.Gpx == null) { // no data. return; } switch (_document.Version) { case GpxVersion.Gpxv1_0: OsmSharp.Tools.Xml.Gpx.v1_0.gpx gpx_v1_0 = _document.Gpx as OsmSharp.Tools.Xml.Gpx.v1_0.gpx; Relation relation_v1_0 = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); relation_v1_0.Tags.Add("name", gpx_v1_0.name); relation_v1_0.Tags.Add("description", gpx_v1_0.desc); relation_v1_0.Tags.Add("gpx_type", "gpx"); foreach (OsmSharp.Tools.Xml.Gpx.v1_0.gpxTrk trk in gpx_v1_0.trk) { OsmGeo trk_osm = this.ConvertGpxTrk(trk); if (trk_osm != null) { RelationMember member = new RelationMember(); member.Member = trk_osm; member.Role = ""; relation_v1_0.Members.Add(member); } } this.AddRelation(relation_v1_0); break; case GpxVersion.Gpxv1_1: OsmSharp.Tools.Xml.Gpx.v1_1.gpxType gpx_v1_1 = _document.Gpx as OsmSharp.Tools.Xml.Gpx.v1_1.gpxType; if (gpx_v1_1.metadata != null && !string.IsNullOrEmpty(gpx_v1_1.metadata.name)) { source_name = gpx_v1_1.metadata.name; } Relation relation_v1_1 = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); //relation_v1_1.Tags.Add("name", _document.Name); relation_v1_1.Tags.Add("description", "v1.1"); relation_v1_1.Tags.Add("gpx_type", "gpxType"); foreach (OsmSharp.Tools.Xml.Gpx.v1_1.trkType trk in gpx_v1_1.trk) { OsmGeo trk_osm = this.ConvertGpxTrk(trk); if (trk_osm != null) { RelationMember member = new RelationMember(); member.Member = trk_osm; member.Role = ""; relation_v1_1.Members.Add(member); } } foreach (OsmSharp.Tools.Xml.Gpx.v1_1.wptType wpt in gpx_v1_1.wpt) { Node n = this.ConvertWptType(wpt); n.Tags.Add("type", "wpt"); this.AddNode(n); } this.AddRelation(relation_v1_1); break; } } }
/// <summary> /// Converts a response into an osm object. /// </summary> /// <param name="response"></param> /// <returns></returns> private OsmGeo ConvertResponse(OsmSharp.Tools.Xml.Kml.v2_0_response.Response response) { Relation relation = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); relation.Tags.Add("kml_type", "Response"); foreach (object item in response.Items) { if (item is OsmSharp.Tools.Xml.Kml.v2_0_response.Document) { OsmGeo osm_geo = this.ConvertDocument(item as OsmSharp.Tools.Xml.Kml.v2_0_response.Document); RelationMember member = new RelationMember(); member.Member = osm_geo; member.Role = ""; relation.Members.Add(member); } else if (item is OsmSharp.Tools.Xml.Kml.v2_0_response.Folder) { OsmGeo osm_geo = this.ConvertFolder(item as OsmSharp.Tools.Xml.Kml.v2_0_response.Folder); RelationMember member = new RelationMember(); member.Member = osm_geo; member.Role = ""; relation.Members.Add(member); } else if (item is OsmSharp.Tools.Xml.Kml.v2_0_response.Placemark) { OsmGeo osm_geo = this.ConvertPlacemark(item as OsmSharp.Tools.Xml.Kml.v2_0_response.Placemark); RelationMember member = new RelationMember(); member.Member = osm_geo; member.Role = ""; relation.Members.Add(member); } else if (item is OsmSharp.Tools.Xml.Kml.v2_0_response.Response) { OsmGeo osm_geo = this.ConvertResponse(item as OsmSharp.Tools.Xml.Kml.v2_0_response.Response); RelationMember member = new RelationMember(); member.Member = osm_geo; member.Role = ""; relation.Members.Add(member); } } return relation; }
/// <summary> /// Converts this relation into it's simple counterpart. /// </summary> /// <returns></returns> public override OsmGeo ToSimple() { var relation = new Relation(); 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<RelationMember>(); foreach (var member in this.Members) { var simpleMember = new RelationMember(); simpleMember.MemberId = member.Member.Id; simpleMember.MemberRole = member.Role; switch (member.Member.Type) { case CompleteOsmType.Node: simpleMember.MemberType = OsmGeoType.Node; break; case CompleteOsmType.Relation: simpleMember.MemberType = OsmGeoType.Relation; break; case CompleteOsmType.Way: simpleMember.MemberType = OsmGeoType.Way; break; } relation.Members.Add(simpleMember); } return relation; }
/// <summary> /// Converts boundary type into an osm object. /// </summary> /// <param name="boundary"></param> /// <returns></returns> private OsmGeo ConvertBoundary(OsmSharp.Tools.Xml.Kml.v2_1.boundaryType[] boundary) { Relation relation = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); relation.Visible = true; relation.Tags.Add("kml_type", "boundaryType[]"); foreach (OsmSharp.Tools.Xml.Kml.v2_1.boundaryType geo in boundary) { OsmGeo geo_osm = this.ConvertLinearRing(geo.LinearRing); if (geo_osm != null) { RelationMember member = new RelationMember(); member.Member = geo_osm; relation.Members.Add(member); } } return relation; }
private void CacheDependency(RelationMember relation_member) { if (relation_member.MemberType == OsmGeoType.Relation) { _required_relations.Add(relation_member.MemberId.Value); } else if (relation_member.MemberType == OsmGeoType.Way) { _required_ways.Add(relation_member.MemberId.Value); } else if (relation_member.MemberType == OsmGeoType.Node) { _required_nodes.Add(relation_member.MemberId.Value); } }
/// <summary> /// Converts a folder into an osm object. /// </summary> /// <param name="folder"></param> /// <returns></returns> private OsmGeo ConvertFolder(OsmSharp.Tools.Xml.Kml.v2_0_response.Folder folder) { Relation relation = OsmBaseFactory.CreateRelation(KeyGenerator.GenerateNew()); relation.Tags.Add("kml_type", "Folder"); for (int idx = 0; idx < folder.Items.Length; idx++) { RelationMember member; switch (folder.ItemsElementName[idx]) { case OsmSharp.Tools.Xml.Kml.v2_0_response.ItemsChoiceType2.Document: member = new RelationMember(); member.Member = this.ConvertDocument(folder.Items[idx] as OsmSharp.Tools.Xml.Kml.v2_0_response.Document); member.Role = ""; relation.Members.Add(member); break; case OsmSharp.Tools.Xml.Kml.v2_0_response.ItemsChoiceType2.Folder: member = new RelationMember(); member.Member = this.ConvertFolder(folder.Items[idx] as OsmSharp.Tools.Xml.Kml.v2_0_response.Folder); member.Role = ""; relation.Members.Add(member); break; case OsmSharp.Tools.Xml.Kml.v2_0_response.ItemsChoiceType2.Placemark: member = new RelationMember(); member.Member = this.ConvertPlacemark(folder.Items[idx] as OsmSharp.Tools.Xml.Kml.v2_0_response.Placemark); member.Role = ""; relation.Members.Add(member); break; } } return relation; }
/// <summary> /// Builds a redis key for the relation members relation list. /// </summary> /// <param name="member"></param> /// <returns></returns> public static string BuildMemberRelationListRedisKey(RelationMember member) { return PrimitiveExtensions.BuildMemberRelationListRedisKey(member.MemberType.Value, member.MemberId.Value); }
private bool DoMoveNextRelation() { if (_relation_reader == null) { var relationCommand = new SQLiteCommand("select * from relation order by id", _connection); _relation_reader = relationCommand.ExecuteReader(); if (!_relation_reader.Read()) { _relation_reader.Close(); } var relationTagCommand = new SQLiteCommand("select * from relation_tags order by relation_id", _connection); _relation_tag_reader = relationTagCommand.ExecuteReader(); if (!_relation_tag_reader.IsClosed && !_relation_tag_reader.Read()) { _relation_tag_reader.Close(); } var relationNodeCommand = new SQLiteCommand("select * from relation_members order by relation_id,sequence_id", _connection); _relation_member_reader = relationNodeCommand.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 changesetId = _relation_reader.GetInt64(1); bool visible = _relation_reader.GetInt64(2) == 1; DateTime timestamp = _relation_reader.IsDBNull(3) ? DateTime.MinValue : _relation_reader.GetDateTime(3); long version = _relation_reader.GetInt64(4); string user = _relation_reader.GetString(5); long uid = _relation_reader.GetInt64(6); var relation = new Relation { Id = id, ChangeSetId = changesetId, TimeStamp = timestamp, UserId = null, UserName = null, Version = (ulong)version, Visible = visible }; relation.UserName = user; relation.UserId = uid; if (!_relation_tag_reader.IsClosed) { long returnedId = _relation_tag_reader.GetInt64(0); while (returnedId == relation.Id.Value) { if (relation.Tags == null) { relation.Tags = new TagsCollection(); } 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(); returnedId = -1; } else { returnedId = _relation_tag_reader.GetInt64(0); } } } if (!_relation_member_reader.IsClosed) { long returnedId = _relation_member_reader.GetInt64(0); while (returnedId == relation.Id.Value) { if (relation.Members == null) { relation.Members = new List<RelationMember>(); } string memberType = _relation_member_reader.GetString(1); long memberId = _relation_member_reader.GetInt64(2); object memberRole = _relation_member_reader.GetValue(3); var member = new RelationMember(); member.MemberId = memberId; if (memberRole != DBNull.Value) { member.MemberRole = memberRole as string; } switch (memberType) { case "Node": member.MemberType = OsmGeoType.Node; break; case "Way": member.MemberType = OsmGeoType.Way; break; case "Relation": member.MemberType = OsmGeoType.Relation; break; } relation.Members.Add(member); if (!_relation_member_reader.Read()) { _relation_member_reader.Close(); returnedId = -1; } else { returnedId = _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 = OsmGeoType.Relation; return false; } }
/// <summary> /// Reads a relation member from the MySqlDataReader /// </summary> /// <param name="reader">The MySqlDataReader to attempt reading the relation member from</param> /// <returns>The relation member read from the MySqlReader</returns> private RelationMember ReadRelationMember(MySqlDataReader reader) { var relation_member = new RelationMember(); relation_member.MemberType = ConvertMemberType(reader.GetInt16(0)); relation_member.MemberId = reader.GetInt64(1); relation_member.MemberRole = reader.GetString(2); return relation_member; }