当前位置:   article > 正文

OSG中读取shp数据_osg shpfile

osg shpfile

OSG(OpenSceneGraph)主要被用来展示三维,但目前需要在Qt5.0中显示二三维地图并进行开发,所以就想到了OSG。上网查了一下OSG支持的数据格式:大量常用的2D 图形文件格式,包括.bmp,.dds,.gif,.jpeg,.pic,.png,.rgb,.tga 和.tiff。OSG  支持的3D模型文件格式包括3D Studio Max(.3ds),AliasWavefront(.obj),Carbon Graphics’ Geo(.geo),Collada(.dae),ESRI Shapefile(.shp),OpenFlight(.flt),Quake(.md2)和Terrex TerraPage(.txp)等常见格式。编译什么的可以参考我之前的博客:https://blog.csdn.net/qq_38378235/article/details/80082141。今天主要来分享一下如何在OSG中加载shp数据,及一些简单的操作。

1、gis常用shp数据的加载

其实这部分操作也不难,是之前自己想复杂了,话不多说,用代码来说明:

  1. //创建Viewer对象,场景浏览器
  2. osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
  3. //创建场景组节点
  4. osg::ref_ptr<osg::Group> root = new osg::Group();
  5. //创建节点,读取SHP文件
  6. osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile("region.shp");
  7. osg::ref_ptr<osg::Node> node2 = osgDB::readNodeFile("line.shp");
  8. osg::ref_ptr<osg::Node> node3 = osgDB::readNodeFile("point.shp");
  9. //添加到场景
  10. root->addChild(node1.get());
  11. root->addChild(node2.get());
  12. root->addChild(node3.get());
  13. //优化场景数据
  14. osgUtil::Optimizer optimizer ;
  15. optimizer.optimize(root.get()) ;
  16. //设置场景数据
  17. viewer->setSceneData(root.get());
  18. //初始化并创建窗口
  19. viewer->realize();
  20. //开始渲染
  21. viewer->run();

这样gis中的点、线、面数据就能用OSG进行展示了,是不是觉得很简单和加载其他模型没有什么区别,当然这只是目前尝试的加载方法,能够显示并满足展示要求。

2、因为加载进去的点、线、面都是一样的颜色,因此只能看到最大层次的面数据,线和点层数据被覆盖了,因此通过修改不同node的颜色来区别以便显示查看,修改模型颜色主要参考网上的博客:https://blog.csdn.net/woaicd/article/details/77163012,代码如下:

  1. #include <QCoreApplication>
  2. #include <osgDB/ReadFile>
  3. #include <osgViewer/Viewer>
  4. #include <osg/Texture2D>
  5. #include <osg/TexEnv>
  6. #include <osg/TexGen>
  7. osg::Image* createImage( int width, int height,osg::Vec3 color )
  8. {
  9. osg::ref_ptr<osg::Image> image = new osg::Image;
  10. image->allocateImage( width, height, 1, GL_RGB, GL_UNSIGNED_BYTE );
  11. unsigned char* data = image->data();
  12. for ( int y=0; y<height; ++y )
  13. {
  14. for ( int x=0; x<width; ++x )
  15. {
  16. *(data++) = color.x();
  17. *(data++) = color.y();
  18. *(data++) = color.z();
  19. }
  20. }
  21. return image.release();
  22. }
  23. int main(int argc, char *argv[])
  24. {
  25. QCoreApplication a(argc, argv);
  26. osgViewer::Viewer viewer;
  27. osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cow.osg");
  28. if(model.valid())
  29. {
  30. osg::ref_ptr<osg::Image> image= createImage(256,256,osg::Vec3(255.0,1.0,0.0));
  31. if (image.get())
  32. {
  33. osg::ref_ptr<osg::Texture2D> texture=new osg::Texture2D();
  34. texture->setImage(image.get());
  35. //设置自动生成纹理坐标
  36. osg::ref_ptr<osg::TexGen> texgen=new osg::TexGen();
  37. texgen->setMode(osg::TexGen::NORMAL_MAP);
  38. //设置纹理环境,模式为BLEND
  39. osg::ref_ptr<osg::TexEnv> texenv=new osg::TexEnv;
  40. texenv->setMode(osg::TexEnv::Mode::ADD);
  41. texenv->setColor(osg::Vec4(0.6,0.6,0.6,0.0));
  42. //启动单元一自动生成纹理坐标,并使用纹理
  43. osg::ref_ptr<osg::StateSet> state=new osg::StateSet;
  44. state->setTextureAttributeAndModes(1,texture.get(),osg::StateAttribute::ON);
  45. state->setTextureAttributeAndModes(1,texgen.get(),osg::StateAttribute::ON);
  46. // state->setTextureAttribute(1,texenv.get());
  47. model->setStateSet(state.get());
  48. }
  49. viewer.setSceneData(model.get());
  50. }
  51. viewer.run();
  52. return a.exec();
  53. }

3、改变节点姿态

OSG中通过旋转模型来改变节点的姿态,使用的类叫 MatrixTransform

  1. //创建旋转矩阵
  2. osg::MatrixTransform* rotateMT=new osg::MatrixTransform;
  3. rotateMT->setMatrix(osg::Matrix::rotate(osg::inDegrees(-90.f),-1.0f,-1.0f,0.0f));
  4. rotateMT->addChild(root);
  5. osg::MatrixTransform* mt=new osg::MatrixTransform;
  6. mt->addChild(node4);
  7. root->addChild(mt);
  8. //设置场景数据
  9. viewer->setSceneData(rotateMT);

说明:(1)在setMatrix的时候,使用osg::Matrix::rotate(osg::inDegrees(-90.0f), 0.0f, 0.0f, 1.0f) 构造了一个变换矩阵。

osg::Matrix::rotate这是Matrix类的静态函数,返回一个矩阵。一共有4个参数,第一个参数是角度,后面三个参数是旋转的向量坐标值。

(2)OSG中的旋转,通常是指绕着某个轴旋转一定角度。实参中的后三个参数(0.0f, 0.0f, 1.0f)实际指的是z轴的正半轴。

可以把坐标原点(0, 0, 0)看成向量起点,向量指向点(0.0f, 0.0f, 1.0f),这个点位于z轴坐标轴上,因为这个点的x=0, y=0, z=1。

4、改变背景颜色

 

osg默认的背景是蓝色的,画线是黑色,直观上有时候看着不好,想换成常用的白色,当然也可以换成其他图片做背景。

这里只说换颜色(以换成白色为例),代码就一句话:

  1. //更变背景颜色
  2. viewer->getCamera()->setClearColor(osg::Vec4f(1.0f,1.0f,1.0f,1.0f)); //white

参数RGB和透明度,可以随意改,直到修改到自己满意为止,现在的这个设置是底面为白色。

5、缩放改变节点大小

这个也是比较常用的功能,在视图模式下,通过缩放鼠标来改变节点的大小,一句代码就好,要提前#include <osgViewer/ViewerEventHandlers>

viewer->addEventHandler(new osgViewer::WindowSizeHandler);

好了,现在已经差不多了,源代码见:https://pan.baidu.com/s/1yD7pxzLz9_J99OlGdfaFSw

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/314879
推荐阅读
相关标签
  

闽ICP备14008679号