|
发表于 2009-5-12 18:40:59
|
显示全部楼层
受教了:) 之前的提问确实草率了。
学习了一下OSG的相关源码。
当shp文件类型是Polyline时,正如楼上所说“getUserData返回的是osgSim::ShapeAttributeList*格式”
但是,当shp文件类型是Point时,shapeType == 1
osg似乎将所有的点记录变成一个Drawable,只是这个Drawable包含的点数和shp文件里的记录数相等。
这样一来,根据OSG中的源码:
if (sp.getGeode()->getNumDrawables() != xbp.getAttributeList().size())
{
osg::notify(osg::WARN) << "ESRIShape loader : .dbf file containe different record number that .shp file." << std::endl
<< " .dbf record skipped." << std::endl;
}
else
{
osg::Geode * geode = sp.getGeode();
unsigned int i = 0;
ESRIShape::XBaseParser::ShapeAttributeListList::iterator it, end = xbp.getAttributeList().end();
for (it = xbp.getAttributeList().begin(); it != end; ++it, ++i)
{
geode->getDrawable(i)->setUserData(it->get());
}
}
sp.getGeode()->getNumDrawables() 的值是1,而属性记录数是真实的记录数,所以它认为记录表与属性表的记录数不一致,属性信息似乎就被扔掉了。getUserData() 的值为NULL。
这样的情况下,如果点类型的shp文件保存了每个地点的名称,想要把每个地点的名称显示出来,是不是就没有办法了??? |
|