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、输出
- Node osmId:13698430
- Node pointLat:-34.2911861
- Node pointLon:-71.3101819
- Node pointVersion:2
- Node pointTimestamp:2010-11-27T14:02:18Z
- Node pointChangeset:6470051
- Node pointUserid:337684
- Node pointUsername:felipeedwards
- Node tags:
- Node osmId:13698430
- Node pointLat:-34.2911941
- Node pointLon:-71.3101193
- Node pointVersion:3
- Node pointTimestamp:2010-12-13T00:22:55Z
- Node pointChangeset:6643617
- Node pointUserid:337684
- Node pointUsername:felipeedwards
- Node tags:
- Node osmId:50026147
- Node pointLat:-33.0228196
- Node pointLon:-71.5509851
- Node pointVersion:3
- Node pointTimestamp:2008-03-16T03:48:24Z
- Node pointChangeset:330702
- Node pointUserid:30854
- Node pointUsername:Zambelli Limitada
- Node tags:key=name,value=Vi?a del Mar;key=is_in,value=Chile, Latin America;key=place,value=city;key=created_by,value=Potlatch 0.7b;
- Node osmId:50026147
- Node pointLat:-33.0244675
- Node pointLon:-71.5515995
- Node pointVersion:4
- Node pointTimestamp:2008-03-18T06:04:36Z
- Node pointChangeset:348809
- Node pointUserid:30854
- Node pointUsername:Zambelli Limitada
- Node tags:key=name,value=Vi?a del Mar;key=is_in,value=Chile, Latin America;key=place,value=city;key=created_by,value=Potlatch 0.7b;
- Way osmId:23456524
- Way pointVersion:1
- Way pointTimestamp:2008-03-26T02:18:52Z
- Way pointChangeset:397290
- Way pointUserid:30854
- Way pointUsername:Zambelli Limitada
- Way pointsId:254026575,254026576,254026577,
- Way tags:key=name,value=2 Oriente;key=oneway,value=yes;key=highway,value=residential;key=created_by,value=Potlatch 0.8;
- Way osmId:23456524
- Way pointVersion:2
- Way pointTimestamp:2008-03-26T02:19:09Z
- Way pointChangeset:397290
- Way pointUserid:30854
- Way pointUsername:Zambelli Limitada
- Way pointsId:254026580,254026581,254026575,254026576,254026577,
- Way tags:key=name,value=2 Oriente;key=oneway,value=yes;key=highway,value=residential;key=created_by,value=Potlatch 0.8;
- relation osmId:4296616
- relation pointVersion:1
- relation pointTimestamp:2014-12-21T20:14:43Z
- relation pointChangeset:27617220
- relation pointUserid:695793
- relation pointUsername:quadero
- relation member:way,304279236,outer;
- relation tags:key=name,value=Universidad de La Frontera;key=type,value=multipolygon;key=amenity,value=university;key=addr:city,value=Temuco;key=addr:street,value=Francisco Salazar;key=addr:housenumber,value=01145;
- relation osmId:4296667
- relation pointVersion:1
- relation pointTimestamp:2014-12-21T20:25:40Z
- relation pointChangeset:27617430
- relation pointUserid:695793
- relation pointUsername:quadero
- relation member:way,307633496,outer;
- relation tags:key=type,value=multipolygon;key=amenity,value=parking;