osg渲染数据高程文件
使用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渲染数据高程文件的更多相关文章
- go 渲染数据到文件
//把数据写到文件里面 package main import ( "fmt" "text/template" "time" "o ...
- osg 渲染ifc数据-测试
直接使用osg渲染ifc数据,提高渲染速度. #include "teslamanage.h" #include <QtWidgets/QApplication> #i ...
- [转][osg]osg渲染引擎框架图,流程图(根据《最长一帧》整理)
转自:http://m.blog.csdn.net/article/details?id=49679731 本文参考<<osg最长一帧>>, <<OpenScene ...
- vue2.* 目录结构分析 数据绑定 循环渲染数据 数据渲染02
一.目录 结构分析 node_modules:项目依赖文件(也可以说是模块) src:开发时所用的资源 assets:静态资源文件 App.vue:根组件(最基础的公共页面) main.js:实例化v ...
- oracle表分区、表分析及oracle数据泵文件导入导出开心版
1.先说oracle表分区是什么吧,这样吧我们来举个桃子,栗子太小,我们就不举了,我们来举个桃子. 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到 ...
- 如何用Matlab将cell数据写入文件
我们知道,一般的文件读写函数是不接受直接将cell内容(非数值)直接写入文件的, 例如:dlmwrite('o.txt', C, 'delimiter', '\t');%C 为cell类型数据,会报错 ...
- JavaScript-cookie是客户端本地,持久存储用户私密数据的文件
navigator:封装浏览器配置信息的对象 cookieEnabled:判断浏览器是否启用cookie cookie是什么:cookie是客户端本地,持久存储用户私密数据的文件 plugins:包含 ...
- Android数据存储-文件操作
一.预备知识 1.Android中的MVC设计模式 MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器.一个逻辑模型可以对于多种视图模型,比如一批统计 ...
- Oracle 数据泵文件
数据泵文件 expdp介绍 EXPDP命令行选项1. ATTACH该选项用于在客户会话与已存在导出作用之间建立关联.语法如下ATTACH=[schema_name.]job_nameSchema_na ...
随机推荐
- Splay树-Codevs 1296 营业额统计
Codevs 1296 营业额统计 题目描述 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...
- reporting service & wpf
WPF做Windows程序界面很好很强大,RDLC做报表免费又好用,如何将两者强强联合呢? 方法1: 可以直接在WPF项目中加入一个WinForm窗体,在这个窗体上进行报表操作,与一般的Wi ...
- JS的基础知识
前言:写前端代码时的各种取值纠结,让我决定我必须要好好学一下js............加油~ $("#tr"+id).remove() 删除某一行,而不用刷新页面 HightCh ...
- LeetCode Encode and Decode Strings
原题链接在这里:https://leetcode.com/problems/encode-and-decode-strings/ 题目: Design an algorithm to encode a ...
- SVN 多项目管理(强烈建议每个项目建一个库)
Subversion的目录结构是很自由的,所有的规划都必须是你自己规定,考虑一个 subversion仓库的目录树,你可以把任何一个目录认定为一个项目,你可以只checkout这个目录下的所有文件进行 ...
- 模板 BFS
[模板]BFS #include <stdio.h> #include <string.h> #include <queue> using namespace st ...
- android开发中scrollview添加自定义view的滑动显示问题
最近做了一个实战用到自定义view,由于view比屏幕大所以想放到scrollview中,如下程序.发现不显示.于是对scrollview进行了研究. <LinearLayout xmlns:a ...
- 谨慎使用多线程中的fork
// Upon successful completion, pthread_atfork() shall return a value of zero; otherwise, an error nu ...
- strits2初始配置总结
**************************************************************************************************** ...
- Struts2&Hibernate&Spring框架目录
第3章 Struts2框架 Struts是流行和成熟的基于MVC设计模式的Web应用程序框架 使用目的:减少在运用MVC设计模型来开发Web应用的时间 3.1 Struts2框架概述 3.1.1 ...