source: subversion/applications/utils/Srtm2Osm/trunk/OsmUtils.Framework/OsmDatabase.cs @ 6526

Revision 6526, 11.1 KB checked in by breki, 6 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Text;
4using OsmUtils.OsmSchema;
5using Brejc.Geometry;
6
7namespace OsmUtils.Framework
8{
9    public class OsmDatabase
10    {
11        public IDictionary<int, OsmNode> Nodes
12        {
13            get { return nodes; }
14        }
15
16        public IDictionary<int, OsmWay> Ways
17        {
18            get { return ways; }
19        }
20
21        /// <summary>
22        /// Gets a dictionary of OSM relations in the OSM database.
23        /// </summary>
24        /// <value>A dictionary of OSM relations.</value>
25        public IDictionary<int, OsmRelation> Relations
26        {
27            get { return relations; }
28        }
29
30        public void AddNode (OsmNode node)
31        {
32            nodes.Add (node.ObjectId, node);
33        }
34
35        public void AddWay (OsmWay way)
36        {
37            ways.Add (way.ObjectId, way);
38        }
39
40        /// <summary>
41        /// Adds a specified OSM relation to the OSM database.
42        /// </summary>
43        /// <param name="relation">The OSM relation to add.</param>
44        public void AddRelation (OsmRelation relation)
45        {
46            relations.Add (relation.ObjectId, relation);
47        }
48
49        public void ImportData (osm osmData)
50        {
51            foreach (osmNode originalNode in osmData.Node)
52            {
53                OsmObjectAction objectAction = ParseOsmObjectAction (originalNode.Action);
54                if (objectAction == OsmObjectAction.Delete)
55                    continue;
56
57                OsmNode node = new OsmNode (originalNode.Id, originalNode.Lat, originalNode.Lon);
58                if (originalNode.Timestamp != null)
59                    node.Timestamp = DateTime.Parse (originalNode.Timestamp, System.Globalization.CultureInfo.InvariantCulture);
60                node.User = originalNode.User;
61                node.Visible = originalNode.Visible;
62                node.Action = objectAction;
63
64                foreach (tag tag in originalNode.Tag)
65                    node.SetTag (tag.K, tag.V);
66
67                //if (false == nodes.ContainsKey (node.ObjectId))
68                nodes.Add (node.ObjectId, node);
69            }
70
71            foreach (osmWay originalWay in osmData.Way)
72            {
73                OsmObjectAction objectAction = ParseOsmObjectAction (originalWay.Action);
74                if (objectAction == OsmObjectAction.Delete)
75                    continue;
76
77                OsmWay way = new OsmWay (originalWay.Id);
78                if (originalWay.Timestamp != null)
79                    way.Timestamp = DateTime.Parse (originalWay.Timestamp, System.Globalization.CultureInfo.InvariantCulture); ;
80                way.User = originalWay.User;
81                way.Visible = originalWay.Visible;
82                way.Action = objectAction;
83
84                foreach (osmWayND nd in originalWay.Nd)
85                    way.AddNode (nd.Ref);
86
87                foreach (tag tag in originalWay.Tag)
88                    way.SetTag (tag.K, tag.V);
89
90                //if (false == ways.ContainsKey (way.ObjectId))
91                ways.Add (way.ObjectId, way);
92            }
93
94            foreach (osmRelation originalRelation in osmData.Relation)
95            {
96                OsmObjectAction objectAction = ParseOsmObjectAction (originalRelation.Action);
97                if (objectAction == OsmObjectAction.Delete)
98                    continue;
99
100                if (originalRelation.Action == "delete")
101                    continue;
102
103                OsmRelation relation = new OsmRelation (originalRelation.Id);
104                if (originalRelation.Timestamp != null)
105                    relation.Timestamp = DateTime.Parse (originalRelation.Timestamp, System.Globalization.CultureInfo.InvariantCulture); ;
106                relation.User = originalRelation.User;
107                relation.Visible = originalRelation.Visible;
108                relation.Action = objectAction;
109
110                foreach (osmRelationMember member in originalRelation.Member)
111                {
112                    OsmReferenceType referenceType = ParseOsmReferenceType (member.Type);
113                    relation.AddMember (referenceType, member.Ref, member.Role);
114                }
115
116                foreach (tag tag in originalRelation.Tag)
117                    relation.SetTag (tag.K, tag.V);
118
119                //if (false == relations.ContainsKey (relation.ObjectId))
120                relations.Add (relation.ObjectId, relation);
121            }
122        }
123
124        public osm ExportData ()
125        {
126            osm osmData = new osm ();
127            osmData.Version = "0.5";
128            osmData.Generator = "OsmUtils";
129            osmData.Node = new List<osmNode> ();
130            osmData.Way = new List<osmWay> ();
131            osmData.Relation = new List<osmRelation> ();
132
133            foreach (OsmNode node in nodes.Values)
134            {
135                osmNode exportedNode = new osmNode ();
136                exportedNode.Id = node.ObjectId;
137                exportedNode.Lat = node.Latitude;
138                exportedNode.Lon = node.Longitude;
139                exportedNode.Timestamp = node.Timestamp.ToString ("s", System.Globalization.CultureInfo.InvariantCulture);
140                exportedNode.User = node.User;
141                exportedNode.Visible = node.Visible;
142                exportedNode.Action = FormatOsmObjectAction (node.Action);
143
144                exportedNode.Tag = new List<tag> ();
145                foreach (OsmTag tag in node.EnumerateTags ())
146                    exportedNode.Tag.Add (new tag (tag.Key, tag.Value));
147
148                osmData.Node.Add (exportedNode);
149            }
150
151            foreach (OsmWay way in ways.Values)
152            {
153                osmWay exportedWay = new osmWay ();
154                exportedWay.Id = way.ObjectId;
155                exportedWay.Timestamp = way.Timestamp.ToString ("s" , System.Globalization.CultureInfo.InvariantCulture);
156                exportedWay.User = way.User;
157                exportedWay.Visible = way.Visible;
158                exportedWay.Action = FormatOsmObjectAction (way.Action);
159
160                exportedWay.Nd = new List<osmWayND> ();
161                foreach (int nodeId in way.EnumerateNodesIds ())
162                {
163                    osmWayND wayNode = new osmWayND ();
164                    wayNode.Ref = nodeId;
165                    exportedWay.Nd.Add (wayNode);
166                }
167
168                exportedWay.Tag = new List<tag> ();
169                foreach (OsmTag tag in way.EnumerateTags ())
170                    exportedWay.Tag.Add (new tag (tag.Key, tag.Value));
171
172                osmData.Way.Add (exportedWay);
173            }
174
175            foreach (OsmRelation relation in relations.Values)
176            {
177                osmRelation exportedRelation = new osmRelation ();
178                exportedRelation.Id = relation.ObjectId;
179                exportedRelation.Timestamp = relation.Timestamp.ToString ("s", System.Globalization.CultureInfo.InvariantCulture);
180                exportedRelation.User = relation.User;
181                exportedRelation.Visible = relation.Visible;
182                exportedRelation.Action = FormatOsmObjectAction (relation.Action);
183
184                exportedRelation.Member = new List<osmRelationMember> ();
185                foreach (OsmRelationMember member in relation.EnumerateMembers ())
186                {
187                    osmRelationMember exportedMember = new osmRelationMember ();
188                    exportedMember.Type = FormatOsmReferenceType (member.MemberReference.ReferenceType);
189                    exportedMember.Ref = member.MemberReference.ReferenceId;
190                    exportedMember.Role = member.Role;
191                    exportedRelation.Member.Add (exportedMember);
192                }
193
194                exportedRelation.Tag = new List<tag> ();
195                foreach (OsmTag tag in relation.EnumerateTags ())
196                    exportedRelation.Tag.Add (new tag (tag.Key, tag.Value));
197
198                osmData.Relation.Add (exportedRelation);
199            }
200
201            return osmData;
202        }
203
204        public Bounds2 CalculateBounds ()
205        {
206            Bounds2 bounds = new Bounds2 ();
207
208            foreach (OsmNode node in nodes.Values)
209                bounds.ExtendToCover (node.Longitude, node.Latitude);
210
211            return bounds;
212        }
213
214        /// <summary>
215        /// Parses the OSM reference type from a string and returns <see cref="OsmReferenceType"/> enumeration value.
216        /// </summary>
217        /// <param name="referenceType">OSM reference type in a string form. The method is case insensitive.</param>
218        /// <returns><see cref="OsmReferenceType"/> enumeration value.</returns>
219        /// <exception cref="ArgumentException">The value could not be parsed.</exception>
220        static public OsmReferenceType ParseOsmReferenceType (string referenceType)
221        {
222            return (OsmReferenceType) Enum.Parse (typeof (OsmReferenceType), referenceType, true);
223        }
224
225        /// <summary>
226        /// Formats a specified value of <see cref="OsmReferenceType"/> into a string.
227        /// </summary>
228        /// <param name="action">The OSM reference type value.</param>
229        /// <returns>The OSM reference type value in a string form.</returns>
230        static public string FormatOsmReferenceType (OsmReferenceType osmReferenceType)
231        {
232            return osmReferenceTypeStringConstants [(int)osmReferenceType];
233        }
234
235        /// <summary>
236        /// Parses the OSM object action from a string and returns <see cref="OsmReferenceType"/> enumeration value.
237        /// </summary>
238        /// <param name="referenceType">OSM object action in a string form. The method is case insensitive.</param>
239        /// <returns><see cref="OsmObjectAction"/> enumeration value.</returns>
240        /// <exception cref="ArgumentException">The value could not be parsed.</exception>
241        static public OsmObjectAction ParseOsmObjectAction (string action)
242        {
243            if (action == null)
244                return OsmObjectAction.None;
245
246            return (OsmObjectAction)Enum.Parse (typeof (OsmObjectAction), action, true);
247        }
248
249        /// <summary>
250        /// Formats a specified value of <see cref="OsmObjectAction"/> into a string.
251        /// </summary>
252        /// <param name="action">The OSM object action value.</param>
253        /// <returns>The OSM object action value in a string form.</returns>
254        static public string FormatOsmObjectAction (OsmObjectAction action)
255        {
256            return osmObjectActionStringConstants[(int)action];
257        }
258
259        private Dictionary<int, OsmNode> nodes = new Dictionary<int, OsmNode> ();
260        private Dictionary<int, OsmWay> ways = new Dictionary<int, OsmWay> ();
261        private Dictionary<int, OsmRelation> relations = new Dictionary<int, OsmRelation> ();
262
263        static private string[] osmObjectActionStringConstants = new string[] { null, "delete", "modify" };
264        static private string[] osmReferenceTypeStringConstants = new string[] { null, "node", "way", "relation" };
265    }
266}
Note: See TracBrowser for help on using the repository browser.