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/
- VC 2010 下用 TinyXml 解析openstreetmap 地图数据
- OpenStreetMap 获取地图数据
- PostgreSQL+PostGIS安装以及用Osmosis导入openstreetmap地图数据
- TinyXML-2解析XML数据
- OpenStreetMap初探(六)——获取地图数据
- OpenStreetMap初探(六)——获取地图数据
- 基于OpenStreetMap地图数据的离线路径规划
- 利用OpenStreetMap(OSM)数据搭建一个地图服务
- vs2012下tinyXml解析xml
- win7搭建openStreetMap地图
- OpenStreetMap地图服务器安装
- 解析OSM数据(C++ Parser OpenStreetMap Data)
- TinyXml 在iPhone下的解析
- 关于OpenStreetMap数据
- OpenStreetMap数据导入
- [旧闻]OpenStreetMap 组织确认苹果正使用他们的地图数据
- 将MapInfo数据转换成OpenStreetMap地图的一种尝试(未完全解决问题)
- openstreetmap地图数据转换为one能识别的wkt格式
- 本地缓存的使用
- Java中重载和重写的区别
- android 项目中出现红色感叹号的解决方法
- 用lingo解决易拉罐下料问题
- 欧元区的通货膨胀率很低不存在通缩风险www.ironfx888.com
- VC 2010 下用 TinyXml 解析openstreetmap 地图数据
- stm32程序下载调试之swd
- web页面常用验证码
- 西班牙政府今年GDP增长1 - 1.5%区间
- zoj 3772 Calculate the Function(矩阵乘法)
- 运输层 总结
- error: insufficient permissions for device
- Android VLC播放器二次开发2——CPU类型检查+界面初始化
- 第十八集 mysql 索引优化