查看: 1832|回复: 4

【求助】关于shape文件的读取问题

[复制链接]

该用户从未签到

发表于 2011-1-10 21:58:31 | 显示全部楼层 |阅读模式
我有一个shape文件,为点文件,是一些地名。昨天我做了一个mfc的例子程序,将这个shape文件导入地形中作为地名标注。其中的主要函数如下:
osg::ref_ptr<osg::Group> CCoreOSG::ImportOSGShpLabel( std::string filename )
{

osg::ref_ptr<osg::Node> nodLable = osgDB::readNodeFile(filename);


osg::ref_ptr<osg::Geode> labGeode = dynamic_cast<osg::Geode*>(nodLable.get());

unsigned int numDrawables = labGeode->getNumDrawables();

osg::ref_ptr<osg::Group> mLable = new osg::Group;

for( unsigned int i = 0; i < numDrawables; i++ )

{

osg::Geometry *geom = dynamic_cast<osg::Geometry *>(labGeode->getDrawable(i));

if( geom != 0L )

{

osg::Vec3 vecvertex;

osg::Vec3Array* pArray = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());

if(pArray->getDataSize() > 0)

{

vecvertex = pArray->at(0);

vecvertex.z() = 5000.0;

double height = osgSim::HeightAboveTerrain::computeHeightAboveTerrain(mModel, vecvertex);

vecvertex.z() -= (height - 4000);

}

osg::ref_ptr<osgSim::ShapeAttributeList> lstShpAttrib = dynamic_cast<osgSim::ShapeAttributeList*>(geom->getUserData());

std::string txt = getAttributeByName(lstShpAttrib, "名称");

mLable->addChild(create3DText(vecvertex, 6000,txt).get());

}

}


return mLable;
}

osg::ref_ptr<osg::Group> CCoreOSG::create3DText( const osg::Vec3& center,float radius, std::string txt )
{

osg::Geode* geode  = new osg::Geode;


float characterSize=radius*0.2f;


osg::Vec3 pos(center.x()-radius*.5f,center.y()-radius*.5f,center.z()-radius*.5f);


osgText::Text* text = new osgText::Text;

text->setFont("fonts/simhei.TTF");

text->setCharacterSize(characterSize);

text->setPosition(pos);

text->setCharacterSizeMode(osgText::Text::OBJECT_COORDS);

text->setAxisAlignment(osgText::Text::SCREEN);

const char* cstr=txt.c_str();

DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, cstr, -1, NULL, 0);

wchar_t *pwText = new wchar_t[dwNum];

MultiByteToWideChar (CP_ACP, 0, cstr, -1, pwText, dwNum);


text->setText(pwText);

geode->addDrawable(text);


osg::ref_ptr<osg::Group> rootNode = new osg::Group;

rootNode->addChild(geode);


return rootNode;   
}

std::string CCoreOSG::getAttributeByName( osg::ref_ptr<osgSim::ShapeAttributeList> attribList, std::string name )
{

osgSim::ShapeAttributeList::iterator it;

for(it = attribList->begin(); it != attribList->end(); ++it)

{

if(it->getName() == name)


return it->getString();

}

return "";
}

文件路径为D:\data\GIS\merge.shp。读取效果如附件1。
今天我做了一个基于控制台的程序,相关函数基本都是直接拷贝过去的,可是结果出错了,错误信息详见附件2,显示结果如附件3。
附件1.jpg
附件2.jpg
附件3.JPG

该用户从未签到

发表于 2011-1-10 22:56:47 | 显示全部楼层
mark

该用户从未签到

发表于 2011-1-11 08:43:26 | 显示全部楼层
record type F not supported,这表示osgdb_shp插件不能识别您的数据类型(我看了一下源代码,它的确不支持F类型)。如果您的mfc可以读取的话,那么是否您使用了不同的shp读取插件,例如osgdb_ogr?

另一种可能是mfc程序同样有not supported的问题,但是并不影响显示,您是否忽略了中文编码的问题,或者某些重要的函数

该用户从未签到

发表于 2011-1-11 17:37:05 | 显示全部楼层
建议不要使用osg自带的shape文件读取插件。这个插件功能比较弱,不能支持shape文件里面的所有数据类型。而且对于shape里面的多边形对象,读取出来会是错误的形状(比如该多边形内部包含空洞、或者复杂的凹多边形)。
建议就自己写一个,或者使用共享软件的读取插件(我习惯使用MapWinGIS)来读取shp,然后自行将其组织成geometry,用以渲染。

该用户从未签到

发表于 2011-1-12 08:57:35 | 显示全部楼层
也可以参考下osggis,或者GDAL库来读取SHP文件~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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