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 ...
随机推荐
- 【java基础学习】字符串
字符串 1. java内存区域(堆区.栈区.常量池) 2. String方法 获取长度 length(); 获取位置 indexOf(index); lastIndexOf(index) 获取子串 c ...
- JavaMail邮件开发
一.只带有纯文本的邮件 代码事例如下: package com.lyh.sendemail; import java.util.Properties; import javax.mail.Messag ...
- 多线程 - CountDownLatch
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达 ...
- linux 服务器对拷命令scp
1.今天在进行linux下服务部署时由于重新部署的繁杂,所以我决定用scp命令在linux线上服务器(A)拷贝一份服务程序到现有的服务器(B)上: 具体的操作命令是:scp -r A_username ...
- 《Android 性能测试初探》
移动测试站点推荐: https://testerhome.com/ 专项相关帖子推荐: <Android 性能测试初探>合集 移动无线应用专项测试浅谈 公开课: [腾讯课堂]Testerh ...
- c#中浅拷贝和深拷贝的理解
c#中拷贝有浅拷贝和深拷贝之分. 例如对象A,其中有值类型字段和引用类型字段: 1.浅拷贝: 对于值类型字段,直接逐位复制到新拷贝的副本对象中,修改副本的字段的值,不会影响源对象中字段的值: 对于引用 ...
- Oracle 触发器的简单命令
-- 创建触发器的基本命令 create or replace trigger td after delete on ss begin dbms_output.put_line('删除成功'); en ...
- WEB压力测试工具Pylot试用
Pylot介绍 转载自[http://www.freehao123.com/pylot-web/] 为了能够准确地评估网站服务器对网络流量的承受能力,我们一般会采取模拟网站用户访问,通过不断地增加并发 ...
- Android组件间交互
四大组件相信大家都不陌生了吧,今天咱们就组件间通信做个说明: 首先: 主要今天的目的是为了说明Android 提供的一个ResultReceiver类,这个类相信大家都不陌生吧>?但是你们层深入 ...
- cxf(3.1.1) 异常Caused by: java.io.FileNotFoundException: class path resource [META-INF/cxf/cxf-extension-soap.xml]
Caused by: java.io.FileNotFoundException: class path resource [META-INF/cxf/cxf-extension-soap.xml] ...