[GDAL]在三维场景中显示DEM
1.ArcEngine和GDAL读写栅格数据机制对比(一)2.[GDAL]1.GDAL1.8.1编译与第一个程序3.C#+GDAL读取影像(1)4.[GDAL]4.影像的读取和显示5.[GDAL]3.影像金字塔构建6.[GDAL]2.读取栅格和矢量数据7.[GDAL]读取HDF格式的calipso数据8.[GDAL]写入shp9.ArcEngine和GDAL读写栅格数据机制对比(二)—— IPixelBlock读写栅格10.[GDAL]GEOS和Proj4编译
11.[GDAL]在三维场景中显示DEM
12.[转载]C#下使用GDAL将dem转换为灰度图13.[GDAL]编译64位GDAL1.1014.C#+GDAL读写文件粗糙实现了个版本
存储波段的基本信息和数据:

1 namespace RGeos.Terrain
2 {
3 //存储波段的基本信息和数据
4 public class RasterBandData
5 {
6 public double[] data;
7 public int Columns;
8 public int Rows;
9 public double NoDataValue;
10 public double MaxValue;
11 public double MinValue;
12 }
13 }
显示用的渲染对象:

1 using System;
2 using RGeos.SlimScene.Core;
3 using SlimDX.Direct3D9;
4 using System.Drawing;
5 using SlimDX;
6 using CustomVertex;
7 using System.IO;
8
9 namespace RGeos.Terrain
10 {
11 public class RTerrain : RenderableObject
12 {
13 Device device = null;
14 private Bitmap bitMap = null;
15 private RasterBandData DataDem = null;
16 //定义行列数目
17 private int Cols = 5, Rows = 4;
18 //定义像素的大小
19 private float cellHeight = 10f, cellWidth = 10f;
20 //纹理
21 private Texture texture = null;
22 //材质
23 private Material material;
24 //顶点缓冲变量
25 private VertexBuffer vertexBuffer;
26 //索引缓冲变量
27 private IndexBuffer indexBuffer;
28 // 顶点变量
29 private CustomVertex.PositionTextured[] vertices;
30 //索引号变量
31 private int[] indices;
32
33 public RTerrain(string name, RasterBandData dem, Bitmap bitmap)
34 : base(name)
35 {
36 DataDem = dem;
37 Cols = dem.Columns;
38 Rows = dem.Rows;
39 bitMap = bitmap;
40 }
41
42 public override void Initialize(DrawArgs drawArgs)
43 {
44 try
45 {
46 device = drawArgs.Device;
47 LoadTexturesAndMaterials();
48 VertexDeclaration();
49 IndicesDeclaration();//定义索引缓冲
50 isInitialized = true;
51 }
52 catch (Exception ex)
53 {
54 isInitialized = false;
55 throw ex;
56 }
57
58 }
59 //导入贴图和材质
60 private void LoadTexturesAndMaterials()
61 {
62 material = new Material();
63 material.Diffuse = Color.White;
64 material.Specular = Color.LightGray;
65 material.Power = 15.0F;
66 device.Material = material;
67 System.IO.MemoryStream memory = new System.IO.MemoryStream();
68 bitMap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
69 memory.Seek(0, SeekOrigin.Begin);
70 texture = Texture.FromStream(device, memory);
71 }
72
73 public override void Update(DrawArgs drawArgs)
74 {
75 if (!isInitialized && isOn)
76 Initialize(drawArgs);
77 }
78 //定义顶点
79 private void VertexDeclaration()
80 {
81 vertexBuffer = new VertexBuffer(device, Cols * Rows * CustomVertex.PositionTextured.SizeBytes, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default);
82 DataStream vs = vertexBuffer.Lock(0, Cols * Rows * CustomVertex.PositionTextured.SizeBytes, LockFlags.None);
83 vertices = new CustomVertex.PositionTextured[Cols * Rows];//定义顶点
84
85 for (int i = 0; i < Rows; i++)
86 {
87 for (int j = 0; j < Cols; j++)
88 {
89 //Color color = bitMap.GetPixel((int)(j * cellWidth), (int)(i * cellHeight));
90 float height = (float)DataDem.data[i * Cols + j];
91 if (height == DataDem.NoDataValue)
92 {
93 height = 0;
94 }
95 vertices[j + i * Cols].Position = new Vector3(j * cellWidth, height, -i * cellHeight);
96 vertices[j + i * Cols].Tu = (float)j / (Cols - 1);
97 vertices[j + i * Cols].Tv = (float)i / (Rows - 1);
98 }
99 }
100 vs.WriteRange(vertices);
101 vertexBuffer.Unlock();
102 vs.Dispose();
103 }
104 //定义索引
105 private void IndicesDeclaration()
106 {
107 indexBuffer = new IndexBuffer(device, 32 * 6 * (Cols - 1) * (Rows - 1), Usage.WriteOnly, Pool.Default, true);
108 DataStream ds = indexBuffer.Lock(0, 32 * 6 * (Cols - 1) * (Rows - 1), LockFlags.None);
109 indices = new int[6 * (Cols - 1) * (Rows - 1)];
110 int index = 0;
111 for (int i = 0; i < Rows - 1; i++)
112 {
113 for (int j = 0; j < Cols - 1; j++)
114 {
115 indices[index] = j + i * (Cols);
116 indices[index + 1] = j + (i + 1) * Cols;
117 indices[index + 2] = j + i * Cols + 1;
118 indices[index + 3] = j + i * Cols + 1;
119 indices[index + 4] = j + (i + 1) * Cols;
120 indices[index + 5] = j + (i + 1) * Cols + 1;
121 index += 6;
122 }
123 }
124 ds.WriteRange(indices);
125 indexBuffer.Unlock();
126 ds.Dispose();
127 }
128
129 public override void Render(DrawArgs drawArgs)
130 {
131 if (!isInitialized || !isOn)
132 return;
133 VertexFormat curFormat = drawArgs.Device.VertexFormat;
134 int curZEnable = drawArgs.Device.GetRenderState(RenderState.ZEnable);
135 int curLighting = drawArgs.Device.GetRenderState(RenderState.Lighting);
136 int curCull = drawArgs.Device.GetRenderState(RenderState.CullMode);
137 int curAlphaBlendEnable = drawArgs.Device.GetRenderState(RenderState.AlphaBlendEnable);
138 int curDepthBias = drawArgs.Device.GetRenderState(RenderState.DepthBias);
139 int curColorOperation = drawArgs.Device.GetTextureStageState(0, TextureStage.ColorOperation);
140 try
141 {
142 drawArgs.Device.SetRenderState(RenderState.Lighting, false);
143 drawArgs.Device.VertexFormat = PositionTextured.Format;
144 drawArgs.Device.SetRenderState(RenderState.ZEnable, true);
145 drawArgs.Device.SetRenderState(RenderState.CullMode, Cull.None);
146 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Modulate);
147 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
148 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorArg2, TextureArgument.Diffuse);
149 drawArgs.Device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.Disable);
150 device.SetTexture(0, texture);//设置贴图
151
152 device.SetStreamSource(0, vertexBuffer, 0, PositionTextured.SizeBytes);
153 device.Indices = indexBuffer;
154 device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, (Cols * Rows), 0, indices.Length / 3);
155 }
156 catch (Exception ex)
157 {
158 }
159 finally
160 {
161 drawArgs.Device.VertexFormat = curFormat;
162 drawArgs.Device.SetRenderState(RenderState.ZEnable, curZEnable);
163 drawArgs.Device.SetRenderState(RenderState.Lighting, curLighting);
164 drawArgs.Device.SetRenderState(RenderState.CullMode, curCull);
165 drawArgs.Device.SetRenderState(RenderState.AlphaBlendEnable, curAlphaBlendEnable);
166 drawArgs.Device.SetRenderState(RenderState.DepthBias, curDepthBias);
167 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, curColorOperation);
168 }
169 }
170
171 public override void Dispose()
172 {
173 if (vertexBuffer != null)
174 {
175 vertexBuffer.Dispose();
176 vertexBuffer = null;
177 texture = null;
178 vertices = null;
179 }
180 if (indexBuffer != null)
181 {
182 indexBuffer.Dispose();
183 indexBuffer = null;
184 indices = null;
185 }
186 }
187
188 public override bool PerformSelectionAction(DrawArgs drawArgs)
189 {
190 throw new NotImplementedException();
191 }
192 }
193 }
调用方法:

1 OpenFileDialog dlg = new OpenFileDialog(); 2 dlg.Title = ""; 3 dlg.Filter = "Img(*.img)|*.img"; 4 if (dlg.ShowDialog() == DialogResult.OK) 5 { 6 string file = dlg.FileName; 7 string NameOf = System.IO.Path.GetFileNameWithoutExtension(file); 8 DemHelper dem = new DemHelper(); 9 dem.Start(); 10 dem.Read(file); 11 RasterBandData bandata = dem.ReadDate(50, 40); 12 Bitmap bitmap = dem.MakeGrayScale(50, 40); 13 Vector3 position = new Vector3(-100f, 0f, 100f); 14 //SimpleRasterShow simRaster = new SimpleRasterShow(NameOf, position, bitmap.Width, bitmap.Height); 15 //simRaster.IsOn = true; 16 //simRaster.RenderPriority = RenderPriority.Custom; 17 //simRaster.bitmap = bitmap; 18 //mSceneControl.CurrentWorld.RenderableObjects.ChildObjects.Add(simRaster); 19 RTerrain terrain = new RTerrain(NameOf, bandata, bitmap); 20 terrain.IsOn = true; 21 mSceneControl.CurrentWorld.RenderableObjects.ChildObjects.Add(terrain); 22 }
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
合集:
GDAL
分类:
GDAL
, GL/Shader/OpenCL&MP/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!