查看: 4183|回复: 6

如何读取shp文件中的属性

[复制链接]

该用户从未签到

发表于 2009-12-1 19:10:57 | 显示全部楼层 |阅读模式
各位,如何读取shp文件中的属性呢,就是想通过shp和其相对应的dbf文件读到shp文件中的属性,例如铁路的shp文件,读取dbf中铁路名称。有2个疑问:
1“如果是使用osgdb_shp读入的,那么getUserData返回的是osgSim::ShapeAttributeList*格式,可以用dynamic_cast<osgSim::ShapeAttributeList*>( getUserData() )得到。”这一段是array在以前的一个帖子中介绍的,对这话我不理解。
2另外,读入的shp文件是osg::Node*格式,就是利用osgdb_shp插件读入shp文件是osg::Node*格式,但是需要转换为可显示的Geode节点,这需要怎么做呢?
对于第一段话,不太理解。第二段话不知道如何实现。哪位大侠可以提供一些代码看看呢,谢谢。

该用户从未签到

发表于 2009-12-1 23:28:19 | 显示全部楼层
array的意思很简单就是得到shp文件的属性列表~~~~转换可以通过
osg::Geode* geode =dynamic_cast<osg::Geode*>(node)即可~~~~~

该用户从未签到

 楼主| 发表于 2009-12-2 05:37:11 | 显示全部楼层
本帖最后由 tingzh 于 2009-12-2 05:39 编辑

谢谢,但是第一个问题还不太理解。array提到:“getUserData返回的是osgSim::ShapeAttributeList*格式,可以用dynamic_cast<osgSim::ShapeAttributeList*>( getUserData() )得到”,可是我不太会用getUserData() ,是否前面要加上某个节点的指针?
看了OSG的相关源码,ESRIShape插件的源码中有:
ESRIShape::XBaseParser::ShapeAttributeListList::iterator it, end = xbp.getAttributeList().end();
                    for (it = xbp.getAttributeList().begin(); it != end; ++it, ++i)
                    {
                        geode->getDrawable(i)->setUserData(it->get());
                    }
                }
与getUserData对应的setUserData是否也需要有getDrawable(i)->这类指针调用呢,这个i是否也要it = xbp.getAttributeList().begin(); 那样的循环遍历呢。谢谢。实在恳请有大侠可以提供一段源码。

该用户从未签到

发表于 2009-12-2 08:52:37 | 显示全部楼层
setUserData()/getUserData()是大部分OSG类的通用方法,可以直接存储指针形式的用户数据。如果您得到了一个shp插件导出的Geode对象,那么获取它的每个drawable,并且通过dynamic_cast<osgSim::ShapeAttributeList*>( drawable->getUserData() )就可以得到属性数据。

既然您已经看了源代码,那么我想事情已经很明晰了,不需要专门的例子去解释什么吧~~~~

“这个i是否也要it = xbp.getAttributeList().begin()”,我想这完全是一个C++的问题,您不妨再仔细看一下,您的想法似乎不太合理

该用户从未签到

 楼主| 发表于 2009-12-3 05:28:23 | 显示全部楼层
谢谢,我再试试

该用户从未签到

 楼主| 发表于 2009-12-3 09:53:56 | 显示全部楼层
但是不好意思,dynamic_cast<osgSim::ShapeAttributeList*>( drawable->getUserData() )中的drawable您指的是什么呢,是geode下的实体么?例如,pyramidGeode->addDrawable(pyramidGeometry); 那么该例子中的drawable就是pyramidGeometry么?
可是如果仅仅只有geode,而它下面没有实体怎么办?有的时候直接读入的数据就是Node*类型,然后转换成Geode*,这样一来该如何处理呢,谢谢啊.

该用户从未签到

发表于 2009-12-3 22:58:33 | 显示全部楼层
您需要先学习一下OSG的基础知识,可以看一看Paul Martz的《OSG快速入门指导》,很有代表性;论坛里的其他资料也都很有价值。不然恐怕直接参与探讨会比较困难一些
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表