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;

本文介绍如何解析OSM文件,一种类似XML格式的数据文件,用于存储地理信息系统数据。文章通过示例代码展示了如何读取节点、路径和关系等元素,并提取其中的属性信息。
631

被折叠的 条评论
为什么被折叠?



