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、输出

  1. Node osmId:13698430  
  2. Node pointLat:-34.2911861  
  3. Node pointLon:-71.3101819  
  4. Node pointVersion:2  
  5. Node pointTimestamp:2010-11-27T14:02:18Z  
  6. Node pointChangeset:6470051  
  7. Node pointUserid:337684  
  8. Node pointUsername:felipeedwards  
  9. Node tags:  
  10. Node osmId:13698430  
  11. Node pointLat:-34.2911941  
  12. Node pointLon:-71.3101193  
  13. Node pointVersion:3  
  14. Node pointTimestamp:2010-12-13T00:22:55Z  
  15. Node pointChangeset:6643617  
  16. Node pointUserid:337684  
  17. Node pointUsername:felipeedwards  
  18. Node tags:  
  19. Node osmId:50026147  
  20. Node pointLat:-33.0228196  
  21. Node pointLon:-71.5509851  
  22. Node pointVersion:3  
  23. Node pointTimestamp:2008-03-16T03:48:24Z  
  24. Node pointChangeset:330702  
  25. Node pointUserid:30854  
  26. Node pointUsername:Zambelli Limitada  
  27. 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;  
  28. Node osmId:50026147  
  29. Node pointLat:-33.0244675  
  30. Node pointLon:-71.5515995  
  31. Node pointVersion:4  
  32. Node pointTimestamp:2008-03-18T06:04:36Z  
  33. Node pointChangeset:348809  
  34. Node pointUserid:30854  
  35. Node pointUsername:Zambelli Limitada  
  36. 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;  
  37. Way osmId:23456524  
  38. Way pointVersion:1  
  39. Way pointTimestamp:2008-03-26T02:18:52Z  
  40. Way pointChangeset:397290  
  41. Way pointUserid:30854  
  42. Way pointUsername:Zambelli Limitada  
  43. Way pointsId:254026575,254026576,254026577,  
  44. Way tags:key=name,value=2 Oriente;key=oneway,value=yes;key=highway,value=residential;key=created_by,value=Potlatch 0.8;  
  45. Way osmId:23456524  
  46. Way pointVersion:2  
  47. Way pointTimestamp:2008-03-26T02:19:09Z  
  48. Way pointChangeset:397290  
  49. Way pointUserid:30854  
  50. Way pointUsername:Zambelli Limitada  
  51. Way pointsId:254026580,254026581,254026575,254026576,254026577,  
  52. Way tags:key=name,value=2 Oriente;key=oneway,value=yes;key=highway,value=residential;key=created_by,value=Potlatch 0.8;  
  53. relation osmId:4296616  
  54. relation pointVersion:1  
  55. relation pointTimestamp:2014-12-21T20:14:43Z  
  56. relation pointChangeset:27617220  
  57. relation pointUserid:695793  
  58. relation pointUsername:quadero  
  59. relation member:way,304279236,outer;  
  60. 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;  
  61. relation osmId:4296667  
  62. relation pointVersion:1  
  63. relation pointTimestamp:2014-12-21T20:25:40Z  
  64. relation pointChangeset:27617430  
  65. relation pointUserid:695793  
  66. relation pointUsername:quadero  
  67. relation member:way,307633496,outer;  
  68. relation tags:key=type,value=multipolygon;key=amenity,value=parking;  





猜你喜欢

转载自blog.csdn.net/prince999999/article/details/80163095
今日推荐