MATLAB如何利用DEM生成地形三维模型(DEM+Landsat_5+MATALB)
一、基础介绍
关于3维地形模型, 三维地形是描述地球表面及其特征的曲面模型。模型中的特征点和特征线都是三维的,可以直观测量或查询任意特征点的平面坐标和高程,模型能够真实的反映地表特征和地表现象。注意其和传统的DEM不同,DEM只具有地表空间特征但不具有地表属性特征,其只能反映地形,不能反映该处的样貌、色彩等。
下面简单列举一下能够作为建立模型的基础数据:
分类 | 方法 |
---|---|
DEM | DEM可以看作N×M个高程数据集Hij(i∈1,N,j∈1,M),MATLAB中是完全支持使用surf(DEM)进行绘制地形图,其转为地形图的原理可以参考我以前的文章,生成地形图之后,可以将有坐标系统的影像图或者其他纹理图进行浮动在地形图表面,实现建模。 |
地表高程点 | 高程点和DEM有异曲同工之处,但是相比于DEM这种二维数据,高程点可以看作是一维的。其可以表示为Hi(i∈1,N*M),而在MATLAB中也可以利用高程点进行绘制地形图,方法可以参考我以前的文章,其他和以上无异。 |
激光点云 | 激光点云比较特殊,其可以被用于精密场所的建模使用,在MATLAB中利用surf或者mesh类的函数显示,则会大大减小的其建模后的精度,因此在MATLAB中可以之间利用PCshow函数读取显示之后,将其所在地区的纹理图进行贴附,可以实现高精度建模。同样随着倾斜摄影测量的发展,其高精度的优势渐渐渗入到数字城市的建模中。 |
其他 | NONE |
其实上面所说的纹理图贴图类似于arcGIS中的按高程在表面浮动,其原理一样;
我们再看看matlab是如何进行纹理贴图的;首先P=surf(DEM),注意以下三个设置
接下来我们看看三个属性值分别表示的是什么:
(1)Facecolor,所属于Surface的面属性,其下属有四个值,分别是‘Flat’、‘interp’、‘none’、‘texturmap’,本次只对第四个值进行说明;其主要是为了变化CData中的数据,使其符合曲面,可以理解为拉伸
(2)CData,所属于Surface的颜色属性,其分为二维和三维数组两种形式;
注意在此说明一下,我们将纹理图保存为JPG、PNG或者其他影像图时,其表面的颜色时对应于[R,G,B]颜色体,现在将其赋值给CDdata,使Surface其顶点的颜色为纹理图的颜色,若未赋值,则CData为默认值;
(3)Linestyle,所属于Surface的边缘属性,本次就将其设置为‘none’,使其为空以至于其表面的线条隐藏。
二、代码段及其结果
1)读取显示DEM
clc;
clear all;
%读取显示DEM数据,剔除边缘异常数据
[data,R1]=geotiffread("gansu.tif");
figure;
datacop=data(8:432-8,7:603-7);
imagesc(datacop);
title('DEM显示图');
2)读取显示以及合成Landsat_5影像
landsat_band_1=adapthisteq(geotiffread("landsat_b1.tif").*0.5);
landsat_band_2=adapthisteq(geotiffread("landsat_b2.tif"));
landsat_band_3=adapthisteq(geotiffread("landsat_b3.tif"));
imag=cat(3,landsat_band_3,landsat_band_2,landsat_band_1);
figure;
imshow(imag);
imwrite(imag,'landsat.jpg');
title('landsat合成图');
3)读取显示山体阴影图
[data_shale,R2]=geotiffread("gansu_shale.tif");
datacop_shale=data_shale(8:432-8,7:603-7);
figure;
imagesc(datacop_shale);
colormap("gray");
imwrite(datacop_shale,'datacop_shale.jpg');
title('山体阴影显示图');
4)三维显示地形模型
figure;
P=surf(datacop);
colormap("gray");
map_data=imread("landsat.jpg");
P.CData=map_data;
P.FaceColor = "texturemap";
P.LineStyle = "none";
title('真实地形3D模型图');
view(120,70)
figure;
P=surf(datacop);
colormap("jet");
map_data=imread("datacop_shale.jpg");
P.CData=map_data;
P.FaceColor = "texturemap";
P.LineStyle = "none";
title('山体坡向3D模型图(pitch-angle=45° direction-angle=225°)');
view(30,70)