使用gdal解析DEM文件,将高程数据转换为HeightField对象,然后在osg渲染。

1 源代码

#include <gdal_priv.h>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osg/Shape>
#include <osgTerrain/TerrainTile>
#include <osgTerrain/GeometryTechnique>
#include <osgTerrain/Layer> int main(int argc, char* argv[])
{
if(argc<1)
return -1;
GDALAllRegister();
GDALDataset* poDataset=(GDALDataset*)GDALOpen(argv[1],GA_ReadOnly);
if(poDataset){
double gdalGeoTransform[6];
poDataset->GetGeoTransform(gdalGeoTransform);
osg::HeightField* hf=new osg::HeightField();
hf->allocate(poDataset->GetRasterXSize(),poDataset->GetRasterYSize());
hf->setOrigin(osg::Vec3(gdalGeoTransform[0],gdalGeoTransform[3],0));
hf->setXInterval(gdalGeoTransform[2]);
hf->setYInterval(gdalGeoTransform[5]);
float * heightData=new float[poDataset->GetRasterXSize()*poDataset->GetRasterYSize()];
poDataset->GetRasterBand(1)->RasterIO(GF_Read,0,0,poDataset->GetRasterXSize(),poDataset->GetRasterYSize(),heightData,poDataset->GetRasterXSize(),poDataset->GetRasterYSize(),GDT_Float32,0,0);
float* heightPtr=heightData;
float noDataValueFill=0.0f;
float noDataValue=poDataset->GetRasterBand(1)->GetNoDataValue();
for(int r=poDataset->GetRasterYSize()-1;r>=0;--r){
for(int c=0;c<poDataset->GetRasterXSize();++c){
float h=*heightPtr++;
if(h!=noDataValue)
hf->setHeight(c,r,h);
else
hf->setHeight(c,r,noDataValueFill);
}
} osg::ref_ptr<osgTerrain::TerrainTile> terrainTile=new osgTerrain::TerrainTile;
osg::ref_ptr<osgTerrain::Locator> locator=new osgTerrain::Locator;
double minX,minY,maxX,maxY;
minX=std::min(gdalGeoTransform[0],gdalGeoTransform[0]+poDataset->GetRasterXSize()*gdalGeoTransform[1]);
minY=std::min(gdalGeoTransform[3],gdalGeoTransform[3]+poDataset->GetRasterYSize()*gdalGeoTransform[5]);
maxX=std::max(gdalGeoTransform[0],gdalGeoTransform[0]+poDataset->GetRasterXSize()*gdalGeoTransform[1]);
maxY=std::max(gdalGeoTransform[3],gdalGeoTransform[3]+poDataset->GetRasterYSize()*gdalGeoTransform[5]);
locator->setTransformAsExtents( minX,minY,maxX,maxY); osg::ref_ptr<osgTerrain::HeightFieldLayer> hfl=new osgTerrain::HeightFieldLayer;
hfl->setHeightField(hf);
hfl->setLocator(locator.get());
terrainTile->setElevationLayer(hfl);
osg::Group* scene=new osg::Group;
scene->addChild(terrainTile.get());
osgViewer::Viewer viewer;
viewer.setSceneData(scene);
viewer.addEventHandler(new osgViewer::WindowSizeHandler());
viewer.run();
}
return 0;
}

osg渲染数据高程文件的更多相关文章

  1. go 渲染数据到文件

    //把数据写到文件里面 package main import ( "fmt" "text/template" "time" "o ...

  2. osg 渲染ifc数据-测试

    直接使用osg渲染ifc数据,提高渲染速度. #include "teslamanage.h" #include <QtWidgets/QApplication> #i ...

  3. [转][osg]osg渲染引擎框架图,流程图(根据《最长一帧》整理)

    转自:http://m.blog.csdn.net/article/details?id=49679731 本文参考<<osg最长一帧>>, <<OpenScene ...

  4. vue2.* 目录结构分析 数据绑定 循环渲染数据 数据渲染02

    一.目录 结构分析 node_modules:项目依赖文件(也可以说是模块) src:开发时所用的资源 assets:静态资源文件 App.vue:根组件(最基础的公共页面) main.js:实例化v ...

  5. oracle表分区、表分析及oracle数据泵文件导入导出开心版

    1.先说oracle表分区是什么吧,这样吧我们来举个桃子,栗子太小,我们就不举了,我们来举个桃子. 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到 ...

  6. 如何用Matlab将cell数据写入文件

    我们知道,一般的文件读写函数是不接受直接将cell内容(非数值)直接写入文件的, 例如:dlmwrite('o.txt', C, 'delimiter', '\t');%C 为cell类型数据,会报错 ...

  7. JavaScript-cookie是客户端本地,持久存储用户私密数据的文件

    navigator:封装浏览器配置信息的对象 cookieEnabled:判断浏览器是否启用cookie cookie是什么:cookie是客户端本地,持久存储用户私密数据的文件 plugins:包含 ...

  8. Android数据存储-文件操作

    一.预备知识 1.Android中的MVC设计模式 MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器.一个逻辑模型可以对于多种视图模型,比如一批统计 ...

  9. Oracle 数据泵文件

    数据泵文件 expdp介绍 EXPDP命令行选项1. ATTACH该选项用于在客户会话与已存在导出作用之间建立关联.语法如下ATTACH=[schema_name.]job_nameSchema_na ...

随机推荐

  1. java IO 学习总结

    推荐文章:java I/O学习 只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流 字符流:FileReader和BufferedReader的使用 String path = &quo ...

  2. SignalR in a WebSite Project

    Question(http://stackoverflow.com/questions/19924678/signalr-in-a-website-project)  I have a test we ...

  3. 使用maven来管理您的java项目

    maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试.发布和报告等.在大型项目开发中,使用maven来管理是必不可少的. 一.安装maven 1.W ...

  4. (一) ARM 内存SDRAM 讲解

    2.SDRAM内存工作原理 上面产生的误解关于 Bank ,这个bank 不是 和 S3C2440 芯片有关系(RAM 自身有bank , SDRAM 自身也有bank ,就像书 有 好几章节一样) ...

  5. WMI资料汇总

    简介 http://technet.microsoft.com/zh-cn/library/ee692772.aspx#E5IAC 主页 http://msdn.microsoft.com/zh-cn ...

  6. 自定义AlertView实现模态对话框

    在Windows应用程序中,经常使用模态(Model)对话框来和用户进行简单的交互,比如登录框.在IOS应用程序中,有时我们也希望做同样的事情.但IOS的UI库中,没有模态对话框,最接近那个样子的应该 ...

  7. vs2013 类名颜色显示黑色,无法修改

    vs2013 类名黑色,修改不起作用,最后找到解决办法. http://stackoverflow.com/questions/10970305/how-can-i-get-user-type-c-s ...

  8. 阿里云OneinStack数据库相关

    阿里云OneinStack数据库相关必须进入oneinstack目录下执行相关命令 ===================================源码安装目录: Nginx:/usr/loca ...

  9. @synthesize vs. @dynamic

    @synthesize will generate getter and setter methods and corresponding instance variable for your pro ...

  10. MVC5 + EF6 入门完整教程二

    从前端的UI开始 MVC分离的比较好,开发顺序没有特别要求,先开发哪一部分都可以,这次我们主要讲解前端UI的部分. ASP.NET MVC抛弃了WebForm的一些特有的习惯,例如服务器端控件,Vie ...