c# 采用XML的方式读取OSM文件
生活随笔
收集整理的這篇文章主要介紹了
c# 采用XML的方式读取OSM文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OSM文件類似于XML文件的格式,可以通過XML的方式讀取出來
1、OSM文件:
<?xml version='1.0' encoding='UTF-8'?> <osm version="0.6" generator="osmconvert 0.8.5"> <bounds minlat="-41.98399" minlon="-73.89404" maxlat="-32.84267" maxlon="-70.92773"/> <node id="13698430" lat="-34.2911861" lon="-71.3101819" version="2" timestamp="2010-11-27T14:02:18Z" changeset="6470051" uid="337684" user="felipeedwards"/> <node id="13698430" lat="-34.2911941" lon="-71.3101193" version="3" timestamp="2010-12-13T00:22:55Z" changeset="6643617" uid="337684" user="felipeedwards"/> <node id="50026147" lat="-33.0228196" lon="-71.5509851" version="3" timestamp="2008-03-16T03:48:24Z" changeset="330702" uid="30854" user="Zambelli Limitada"> <tag k="name" v="Vi?a del Mar"/> <tag k="is_in" v="Chile, Latin America"/> <tag k="place" v="city"/> <tag k="created_by" v="Potlatch 0.7b"/> </node> <node id="50026147" lat="-33.0244675" lon="-71.5515995" version="4" timestamp="2008-03-18T06:04:36Z" changeset="348809" uid="30854" user="Zambelli Limitada"> <tag k="name" v="Vi?a del Mar"/> <tag k="is_in" v="Chile, Latin America"/> <tag k="place" v="city"/> <tag k="created_by" v="Potlatch 0.7b"/> </node> <way id="23456524" version="1" timestamp="2008-03-26T02:18:52Z" changeset="397290" uid="30854" user="Zambelli Limitada"> <nd ref="254026575"/> <nd ref="254026576"/> <nd ref="254026577"/> <tag k="name" v="2 Oriente"/> <tag k="oneway" v="yes"/> <tag k="highway" v="residential"/> <tag k="created_by" v="Potlatch 0.8"/> </way> <way id="23456524" version="2" timestamp="2008-03-26T02:19:09Z" changeset="397290" uid="30854" user="Zambelli Limitada"> <nd ref="254026580"/> <nd ref="254026581"/> <nd ref="254026575"/> <nd ref="254026576"/> <nd ref="254026577"/> <tag k="name" v="2 Oriente"/> <tag k="oneway" v="yes"/> <tag k="highway" v="residential"/> <tag k="created_by" v="Potlatch 0.8"/> </way> <relation id="4296616" version="1" timestamp="2014-12-21T20:14:43Z" changeset="27617220" uid="695793" user="quadero"> <member type="way" ref="304321808" role="outer"/> <member type="way" ref="304279235" role="outer"/> <member type="way" ref="304279236" role="outer"/> <tag k="name" v="Universidad de La Frontera"/> <tag k="type" v="multipolygon"/> <tag k="amenity" v="university"/> <tag k="addr:city" v="Temuco"/> <tag k="addr:street" v="Francisco Salazar"/> <tag k="addr:housenumber" v="01145"/> </relation> <relation id="4296667" version="1" timestamp="2014-12-21T20:25:40Z" changeset="27617430" uid="695793" user="quadero"> <member type="way" ref="307633498" role="outer"/> <member type="way" ref="307633497" role="outer"/> <member type="way" ref="307633496" role="outer"/> <tag k="type" v="multipolygon"/> <tag k="amenity" v="parking"/> </relation> </osm>2、代碼:
public void XmlParse(XmlReader source) { string pointOsmId =""; string pointLat = ""; string pointLon = ""; string pointVersion = ""; string pointTimestamp = ""; string pointChangeset = ""; string pointUserid = ""; string pointUsername = ""; string wayOsmId = ""; string wayVersion = ""; string wayTimestamp = ""; string wayChangeset = ""; string wayUserid = ""; string wayUsername = ""; string reationOsmId = ""; string reationVersion = ""; string reationTimestamp = ""; string reationChangeset = ""; string reationUserid = ""; string reationUsername = ""; while (source.Read()) { if (source.NodeType == XmlNodeType.Element &&source.Name == "node") { pointOsmId = source.GetAttribute("id"); pointLat = source.GetAttribute("lat"); pointLon = source.GetAttribute("lon"); pointVersion = source.GetAttribute("version"); pointTimestamp = source.GetAttribute("timestamp"); pointChangeset = source.GetAttribute("changeset"); pointUserid = source.GetAttribute("uid"); pointUsername = source.GetAttribute("user"); string content = source.ReadInnerXml(); string tagFormated = string.Format("<tag>{0}</tag>", content); XElement element = XElement.Parse(tagFormated); int tagCount=element.Elements().Count(); string tags = ""; int count = tagCount; while (tagCount>0) { tags += "key=" + element.Elements().ElementAt(count - tagCount).Attribute("k").Value + ",value=" + element.Elements().ElementAt(count - tagCount).Attribute("v").Value + ";"; tagCount--; } Console.WriteLine("Node osmId:" + pointOsmId); Console.WriteLine("Node pointLat:" + pointLat); Console.WriteLine("Node pointLon:" + pointLon); Console.WriteLine("Node pointVersion:" + pointVersion); Console.WriteLine("Node pointTimestamp:" + pointTimestamp); Console.WriteLine("Node pointChangeset:" + pointChangeset); Console.WriteLine("Node pointUserid:" + pointUserid); Console.WriteLine("Node pointUsername:" + pointUsername); Console.WriteLine("Node tags:" + tags); } if (source.NodeType == XmlNodeType.Element && source.Name == "way") { wayOsmId = source.GetAttribute("id"); wayVersion = source.GetAttribute("version"); wayTimestamp = source.GetAttribute("timestamp"); wayChangeset = source.GetAttribute("changeset"); wayUserid = source.GetAttribute("uid"); wayUsername = source.GetAttribute("user"); string content = source.ReadInnerXml(); string Formated = string.Format("<way>{0}</way>", content); XElement element = XElement.Parse(Formated); string pointsId = ""; string tags = ""; XmlReader r=element.CreateReader(); while( r.Read()){ if (r.NodeType == XmlNodeType.Element && r.Name == "nd") { pointsId += r.GetAttribute("ref").ToString() + ","; } else if (r.NodeType == XmlNodeType.Element && r.Name == "tag") { tags += "key=" + r.GetAttribute("k").ToString() + ",value=" + r.GetAttribute("v").ToString()+ ";"; } } Console.WriteLine("Way osmId:" + wayOsmId); Console.WriteLine("Way pointVersion:" + wayVersion); Console.WriteLine("Way pointTimestamp:" + wayTimestamp); Console.WriteLine("Way pointChangeset:" + wayChangeset); Console.WriteLine("Way pointUserid:" + wayUserid); Console.WriteLine("Way pointUsername:" + wayUsername); Console.WriteLine("Way pointsId:" + pointsId); Console.WriteLine("Way tags:" + tags); } if (source.NodeType == XmlNodeType.Element && source.Name == "relation") { reationOsmId = source.GetAttribute("id"); reationVersion = source.GetAttribute("version"); reationTimestamp = source.GetAttribute("timestamp"); reationChangeset = source.GetAttribute("changeset"); reationUserid = source.GetAttribute("uid"); reationUsername = source.GetAttribute("user"); string content = source.ReadInnerXml(); string Formated = string.Format("<relation>{0}</relation>", content); XElement element = XElement.Parse(Formated); string member = ""; string tags = ""; XmlReader r=element.CreateReader(); while (r.Read()) { if (r.NodeType == XmlNodeType.Element && r.Name == "member") { member = r.GetAttribute("type").ToString() + "," + r.GetAttribute("ref").ToString() + "," + r.GetAttribute("role").ToString() + ";"; } else if (r.NodeType == XmlNodeType.Element && r.Name == "tag") { tags += "key=" + r.GetAttribute("k").ToString() + ",value=" + r.GetAttribute("v").ToString() + ";"; } } Console.WriteLine("relation osmId:" + reationOsmId); Console.WriteLine("relation pointVersion:" + reationVersion); Console.WriteLine("relation pointTimestamp:" + reationTimestamp); Console.WriteLine("relation pointChangeset:" + reationChangeset); Console.WriteLine("relation pointUserid:" + reationUserid); Console.WriteLine("relation pointUsername:" + reationUsername); Console.WriteLine("relation member:" + member); Console.WriteLine("relation tags:" + tags); } } }3、輸出
總結
以上是生活随笔為你收集整理的c# 采用XML的方式读取OSM文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几种常用的无源滤波器的特征
- 下一篇: 网络综合布线中配线架的作用是什么?应该怎