VC 2010 下用 TinyXml 解析openstreetmap 地图数据

来源:互联网 发布:淘宝会员注册流程 编辑:程序博客网 时间:2024/05/29 18:18

         最近一直在忙毕业设计,毕设中有涉及到地图道路匹配的问题,导师推荐研究Open Street Map 项目,现在遇到的第一个问题就是怎么把地图数据解析出来,OSM 地图数据是以osm 格式的XML 文件,解析xml 数据的工具有很多,包括VC 中也有解析XML的库,VC自带的库我弄了一下可能是库版本不匹配的问题,没搞成功,由于时间有限只能以后再研究。在网上搜了一下发现了这个开源的 TinyXML 小工具,很小巧,用起来也很简单,上午弄了一下基本解决了问题,现在分享一下过程。

    首先看一下我要解析的数据(片段):

<?xml version="1.0" encoding="UTF-8"?><osm version="0.6" generator="osm-extract.pl">  <node id="25248662" version="51" timestamp="2011-10-26T18:18:21Z" uid="12298" user="jaakl" changeset="9662487" lat="39.9064705" lon="116.3911947">    <tag k="gns:UFI" v="-1898545"/>    <tag k="name:zh_pinyin" v="Bei Jing"/>    <tag k="name:sv" v="Beijing"/>    <tag k="gns:UNI" v="9310007"/>    <tag k="gns:DSG" v="ADM1"/>    <tag k="name:de" v="Peking"/></node>  <node id="25248784" version="27" timestamp="2011-08-27T02:13:54Z" uid="376715" user="bj-transit" changeset="9134435" lat="39.9061452" lon="116.3856556">    <tag k="highway" v="traffic_signals"/>  </node>  <node id="25248785" version="10" timestamp="2011-08-27T02:13:54Z" uid="376715" user="bj-transit" changeset="9134435" lat="39.9062479" lon="116.3894136">    <tag k="highway" v="traffic_signals"/>  </node>  <node id="25248786" version="11" timestamp="2011-08-27T02:13:54Z" uid="376715" user="bj-transit" changeset="9134435" lat="39.9063555" lon="116.3930587">    <tag k="highway" v="traffic_signals"/>  </node>

我的目的是要提取出node 的 id、lat、lon 三个属性。

我用的环境是VC++ 2010 版本, win7 。


下面讲tinyxml, tinyxml是开源的,代码可以到这里下载: http://sourceforge.net/projects/tinyxml/  我们要用的也是其中的代码。 下载好代码后,在里面找到 tinystr.h tinyxml.h tinystr.cpp tinyxml.cpp tinyxmlerror.cpp tinyxmlparser.cpp 把他们分别拷贝到工程的目录里, 然后在工程里分别将他们加载到headers和sources 里面。 好了,这样就配置好了,可以用tinyxml 来解析文件了。


下面是我的解析代码:

#include "stdafx.h"#include <string>#include <string.h>#include <iostream>#include "tinyxml.h"  //加入头文件#include "tinystr.h"void readHighwayXml();int main(int argc,char** argv){readHighwayXml();    return 0;}void readHighwayXml() {using namespace std;const char * xmlFile = "conf/map.osm";TiXmlDocument doc;  if (doc.LoadFile(xmlFile)) {  //doc.Print();  } else {cout << "can not parse xml conf/school.xml" << endl;return;}//int i=0;TiXmlElement* rootElement = doc.RootElement();  //osm  TiXmlElement* nodeElement = rootElement->FirstChildElement();  // nodefor(;nodeElement !=NULL; nodeElement=nodeElement->NextSiblingElement()){TiXmlAttribute* attributeOfNode = nodeElement->FirstAttribute(); for (;attributeOfNode != NULL; attributeOfNode = attributeOfNode->Next() ) {  if(!strcmp(attributeOfNode->Name(),"id") || !strcmp(attributeOfNode->Name(),"lat") || !strcmp(attributeOfNode->Name(),"lon"))cout << attributeOfNode->Name() << " : " << attributeOfNode->Value() << std::endl; }        TiXmlElement* tagElement = nodeElement->FirstChildElement();  //tag  for (; tagElement != NULL; tagElement = tagElement->NextSiblingElement() ) {  }    //不需要tag,跳过。 //  if(i==100)//  break;//  else//  i++;}}

在使用上面程序第一次编译时出错,提示找不到头文件啊什么的,反正就是找不到include文件之类的, 根据出错报告在 tinystr.cpp tinyxml.cpp tinyxmlerror.cpp tinyxmlparser.cpp  每个文件里最前面都加上#include "stdafx.h" 后就解决了,这应该是VC环境的问题,VC将所有的包含文件都囊括在了 #include "stdafx.h" 中,具体没有深究,问题应该是比较简单的就是找到包含文件什么的。


tips: tinyxml 将XML文件载入内存是使用的DOM模型(参看 http://baike.baidu.com/subview/14806/8904138.htm?fr=aladdin) 它在内存中是以树的形式存在的,以我上面的xml 文件为例子, osm 为树根,node 为 osm的孩子, tag 是node 的孩子。 引号里的又是每个节点的属性,都是层次结构的非常清晰。

更详细的tinyxml 的使用文档参看这里 : http://www.grinninglizard.com/tinyxml/



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 韵达快递不派送怎么办 中通快递不派送怎么办 农业银行信用卡密码输错三次怎么办 农业银行卡多次输错密码怎么办 想把店长弄走怎么办 济南银座卡过期了怎么办 银座购物卡丢失后怎么办 银座的卡丢了怎么办 银行卡换了旧卡怎么办 大理市民卡丢了怎么办 市民卡内的钱怎么办 宝付支付乱扣款怎么办 苏宁任性贷逾期怎么办 第二次跟家里开口要钱还网贷怎么办 网贷到家来要钱怎么办 网贷贷不了啦急要钱怎么办 百度推广竞价关键词太长怎么办 药店位置差客流少怎么办 网站上的用词违规怎么办 苹果16g内存不够怎么办 手机16g内存不够怎么办 在私企年纪大了怎么办 谷歌浏览器显示不安全打不开怎么办 4s密码多次错误怎么办 苹果4s手机系统错误怎么办 汽车充电口坏了怎么办 如果手机充不了电怎么办 淘宝买的家电坏了怎么办 衣服皱了没有熨斗怎么办 油烟机油盒坏了怎么办 实体店不给换货怎么办 台式电脑鼠标不动了怎么办 电脑开机一直长鸣报警怎么办 国外电话卡网速太慢怎么办 滴滴提现忘记登录密码怎么办 微信提现支付密码忘记了怎么办 小米手机前置摄像头打不开怎么办 mp4视频屏幕好小怎么办 投了简历没回应怎么办 借壳上市原股票怎么办 红米note3指纹解锁失灵怎么办