3 * Copyright (c) 2008 Paolo Molaro lupus@oddwiz.org
4 * License: MIT/X11, see the MIT.X11 file.
11 using System
.Collections
.Generic
;
13 namespace OpenStreetMap
{
15 public class DataBase
{
17 static readonly string BaseUrl
= "http://api.openstreetmap.org/api/0.5/";
20 public DataBase () : this (BaseUrl
) {
23 public DataBase (string base_url
) {
27 static bool ParseBool (string v
)
33 throw new Exception ("Invalid boolean values: " + v
);
36 public static List
<OsmObject
> Load (string filename
)
38 return Load (File
.OpenRead (filename
));
41 public static List
<OsmObject
> Load (Stream stream
)
43 List
<OsmObject
> list
= new List
<OsmObject
> ();
44 foreach (OsmObject obj
in LoadObjects (stream
))
49 public static IEnumerable
<OsmObject
> LoadObjects (string filename
)
51 return LoadObjects (File
.OpenRead (filename
));
54 public static IEnumerable
<OsmObject
> LoadObjects (Stream stream
)
56 //XmlTextReader reader = new XmlTextReader (stream);
57 XmlTextReader reader
= XmlTextReader
.Create (stream
) as XmlTextReader
;
60 Relation relation
= null;
61 OsmObject bobject
= null;
62 List
<long> nodelist
= null;
63 List
<RelationMember
> members
= null;
64 bool do_yield
= false;
66 while (reader
.Read ()) {
67 if (reader
.NodeType
== XmlNodeType
.Element
) {
68 string name
= reader
.Name
;
70 bobject
= node
= new Node ();
71 do_yield
= reader
.IsEmptyElement
;
72 } else if (name
== "way") {
73 bobject
= way
= new Way ();
74 do_yield
= reader
.IsEmptyElement
;
75 } else if (name
== "relation") {
76 bobject
= relation
= new Relation ();
77 do_yield
= reader
.IsEmptyElement
;
78 } else if (name
== "osm" || name
== "bounds") {
80 } else if (name
== "member") {
85 members
= new List
<RelationMember
> ();
86 for (int i
= 0; i
< reader
.AttributeCount
; ++i
) {
87 reader
.MoveToAttribute (i
);
88 if (reader
.Name
== "ref")
89 refid
= long.Parse (reader
.Value
);
90 else if (reader
.Name
== "role")
92 else if (reader
.Name
== "type")
95 throw new Exception ("Invalid member attribute: " + reader
.Name
);
97 members
.Add (new RelationMember (relation
, type
, role
, refid
));
99 } else if (name
== "nd") {
100 if (nodelist
== null)
101 nodelist
= new List
<long> ();
102 for (int i
= 0; i
< reader
.AttributeCount
; ++i
) {
103 reader
.MoveToAttribute (i
);
104 if (reader
.Name
== "ref")
105 nodelist
.Add (long.Parse (reader
.Value
));
107 throw new Exception ("Invalid nd attribute: " + reader
.Name
);
110 } else if (name
== "tag") {
111 string k
= null, v
= null;
112 for (int i
= 0; i
< reader
.AttributeCount
; ++i
) {
113 reader
.MoveToAttribute (i
);
114 if (reader
.Name
== "k")
116 else if (reader
.Name
== "v")
119 throw new Exception ("Invalid tag attribute: " + reader
.Name
);
121 if (k
== null | v
== null)
122 throw new Exception ("Invalid tag");
126 //Console.WriteLine ("element: {0}", name);
129 for (int i
= 0; i
< reader
.AttributeCount
; ++i
) {
130 reader
.MoveToAttribute (i
);
133 bobject
.ID
= long.Parse (reader
.Value
);
134 } else if (name
== "user") {
135 bobject
.User
= reader
.Value
;
136 } else if (name
== "timestamp") {
137 bobject
.TimeStamp
= reader
.Value
;
138 } else if (name
== "visible") {
139 bobject
.Visible
= ParseBool (reader
.Value
);
140 } else if (name
== "lon") {
141 node
.Longitude
= double.Parse (reader
.Value
);
142 } else if (name
== "lat") {
143 node
.Latitude
= double.Parse (reader
.Value
);
147 } else if (reader
.NodeType
== XmlNodeType
.EndElement
) {
148 string name
= reader
.Name
;
149 if (name
== "way" || name
== "node" || name
== "relation")
153 if (bobject
!= null) {
154 do_yield
= reader
.IsEmptyElement
;
155 if (bobject
is Way
&& nodelist
!= null) {
156 way
.Nodes
= nodelist
.ToArray ();
158 } else if (bobject
is Relation
&& members
!= null) {
159 relation
.Members
= members
.ToArray ();
162 yield return bobject
;
171 public OsmObject
LoadObject (string type
, long id
)
173 HttpWebRequest req
= WebRequest
.Create (string.Format (url
+ "{0}/{1}", type
, id
)) as HttpWebRequest
;
175 HttpWebResponse res
= req
.GetResponse () as HttpWebResponse
;
176 //Console.WriteLine ("{0}: {1}", res.StatusCode, res.StatusDescription);
177 Stream s
= res
.GetResponseStream ();
178 List
<OsmObject
> list
= Load (s
);
183 public OsmObject
LoadWay (long id
)
185 return LoadObject ("way", id
);
188 public OsmObject
LoadNode (long id
)
190 return LoadObject ("node", id
);
193 public OsmObject
LoadRelation (long id
)
195 return LoadObject ("relation", id
);
198 public IEnumerable
<OsmObject
> LoadHistory (string type
, long id
)
200 HttpWebRequest req
= WebRequest
.Create (string.Format (url
+ "{0}/{1}/history", type
, id
)) as HttpWebRequest
;
201 HttpWebResponse res
= req
.GetResponse () as HttpWebResponse
;
202 //Console.WriteLine ("{0}: {1}", res.StatusCode, res.StatusDescription);
203 Stream s
= res
.GetResponseStream ();
204 List
<OsmObject
> list
= Load (s
);
209 public List
<OsmObject
> Load (double lon1
, double lat1
, double lon2
, double lat2
)
211 HttpWebRequest req
= WebRequest
.Create (string.Format (url
+ "map?bbox={0},{1},{2},{3}", lon1
, lat1
, lon2
, lat2
)) as HttpWebRequest
;
212 HttpWebResponse res
= req
.GetResponse () as HttpWebResponse
;
213 //Console.WriteLine ("{0}: {1}", res.StatusCode, res.StatusDescription);
214 Stream s
= res
.GetResponseStream ();
215 List
<OsmObject
> list
= Load (s
);
220 public bool UpLoad (OsmObject obj
, string username
, string password
)
224 //ServicePointManager.Expect100Continue = false;
225 CredentialCache creds
= new CredentialCache ();
226 creds
.Add (new Uri (url
), "Basic", new NetworkCredential (username
, password
));
227 HttpWebRequest req
= WebRequest
.Create (string.Format ("{0}{1}/{2}", url
, obj
.ObjectType
, obj
.ID
)) as HttpWebRequest
;
229 req
.Credentials
= creds
;
230 // stupid apps don't support Expect and it's used by default
231 req
.ServicePoint
.Expect100Continue
= false;
232 req
.ReadWriteTimeout
= 5000;
234 Stream s
= req
.GetRequestStream ();
235 XmlTextWriter xmlw
= new XmlTextWriter (s
, new UTF8Encoding (false, false));
236 xmlw
.Formatting
= Formatting
.Indented
;
237 xmlw
.WriteStartDocument ();
238 xmlw
.WriteStartElement ("osm");
239 xmlw
.WriteAttributeString ("version", "0.5");
240 xmlw
.WriteAttributeString ("creator", "osm-lupus-tools 0.1");
242 xmlw
.WriteEndElement ();
243 xmlw
.WriteEndDocument ();
246 HttpWebResponse res
= req
.GetResponse () as HttpWebResponse
;
247 // need to get the stream and close it to avoid deadlocks
248 s
= res
.GetResponseStream ();
250 //Console.WriteLine ("{0}: {1}", res.StatusCode, res.StatusDescription);