资讯详情

优雅地使用GEE绘制DEM

关于

昨天看了一篇高质量的文章。python画地形图博客。感觉,我想到了GEE(Google earth engine)数据源多,计算速度快,计算子多。GEE不逊于python。

制作流程

使用GEE绘制DEM有三个步骤,最重要的是使用调色板。

(1)DEM数据源

GEE的DEM数据很多,读者可以根据自己的需要选择合适的数据源。如果研究区域较小,可以选择分辨率较低的数据。DEM。

在GEE荷兰的0.5m分辨率的DEM:

考虑到试验区是我的家乡四川省,这里使用覆盖世界的30个m分辨率NASA DEM。

// 引入数据源 研究区选择了我的家乡四川省 var dataset = ee.Image('NASA/NASADEM_HGT/001'); var elevation = dataset.select('elevation').clip(ROI); // 可视化参数设置 var elevationVis = { 
           min: 0,   max: 8000, }; //可视化 Map.addLayer(elevation, elevationVis, 'Elevation'); Map.centerObject(ROI, 7); 

(2)配色表

数据加载完成后,数据的颜色不好看,此时需要。有几种方法,一种是GEE中手动调整DEM显示:

另一种是可以参考别人设置的调色板,直接调用。这里我推荐一个GitHub仓库 (https://github.com/gee-community/ee-palettes):

仓库收集了近200种配色方案GEE中直接调用即可:

调用此仓库,只需引入函数库即可new在地图加载函数中填写配色板,注意设置最大值和最小值。然后逐一比较颜色表,找到最合适的颜色方案。

///调用仓库配置的调色板 var palettes = require('users/gena/packages:palettes');  var palette_bamako = palettes.crameri.bamako[10,25,50]; Map.addLayer(elevation, { 
        min:0, max:8000, palette: palette_bamako},  'crameri.bamako');

var palette_rainbow = palettes.kovesi.rainbow_bgyr_35_85_c72[7];
Map.addLayer(elevation, { 
        min:0, max:8000, palette: palette_rainbow},  'palette_rainbow');

var palette_misc = palettes.misc.jet[7];
Map.addLayer(elevation, { 
        min:0, max:8000, palette: palette_misc},  'palette_misc');

var palette_diverging = palettes.kovesi.diverging_linear_bjy_30_90_c45[7];
Map.addLayer(elevation, { 
        min:0, max:8000, palette: palette_diverging},  'palette_diverging');

在配色过程中,也可以注意调色板的最大值与最小值对于DEM显示的影响。四川省的最高海拔为7556米,最低海拔为188米。但是这并不代表我们的配色值域应该遵从最大最小值,因为在配色中如果像素值大于max值,则颜色为最右端,值会自动调整的,如果我们能找到最佳的值域范围,则内部的像素点因为高度差异引起的,换句话说,使用大部分值域范围的显示效果更佳。

根据四川省的DEM值分布直方图,我做了以下几个对比:

//值域范围对比
//0-8000m
var palette_rainbow1 = palettes.kovesi.rainbow_bgyr_35_85_c72[7];
Map.addLayer(elevation, { 
        min:0, max:8000, palette: palette_rainbow1},  'palette_rainbow1');
//最大值与最小值
var palette_rainbow2 = palettes.kovesi.rainbow_bgyr_35_85_c72[7];
Map.addLayer(elevation, { 
        min:188, max:7556, palette: palette_rainbow2},  'palette_rainbow2');
//直方图的横轴最大值与最小值
var palette_rainbow3 = palettes.kovesi.rainbow_bgyr_35_85_c72[7];
Map.addLayer(elevation, { 
        min:451, max:4525, palette: palette_rainbow3},  'palette_rainbow3');
//直方图的横轴最小值与6000 
var palette_rainbow4 = palettes.kovesi.rainbow_bgyr_35_85_c72[7];
Map.addLayer(elevation, { 
        min:451, max:6000, palette: palette_rainbow4},  'palette_rainbow4');

如何选取合适,也是优雅绘制DEM的重要因素。

(3)山体阴影;

选取了较好的DEM数据源、调色板、值域范围后,我们可以加入山体阴影来增强DEM的显示效果。函数 ee.Terrain.hillshade(input,azimuth, elevation)是生成山体阴影的算子,input为DEM,azimuth是方位角,elevation是高度角。

方向角指的是太阳的角度方向,是以北为基准方向在 0 到 360 度范围内按顺时针进行测量的,90º 的方位角为东。高度指的是照明源高出地平线的角度或坡度。高度的单位为度,范围为 0(位于地平线上)到 90(位于头上)之间。需要注意hillshade的值域为0-255.

//山体阴影
var palette_hillshade = palettes.crameri.bamako[10,25,50];
var exaggeration = 20;
var hillshade = ee.Terrain.hillshade(elevation.multiply(exaggeration),270,45);
Map.addLayer(hillshade, { 
        min: 0, max: 255, palette: palette_hillshade},  'palette_hillshade');

方位角

影响山体阴影显示效果的有方位角:

//不同的方位角
var palette_hillshade = palettes.crameri.bamako[10,25,50];
var exaggeration = 20;
var hillshade_45 = ee.Terrain.hillshade(elevation.multiply(exaggeration),45,15);
Map.addLayer(hillshade_45, { 
        min: 0, max: 255, palette: palette_hillshade},  'palette_hillshade_45');
var hillshade_135 = ee.Terrain.hillshade(elevation.multiply(exaggeration),135,15);
Map.addLayer(hillshade_135, { 
        min: 0, max: 255, palette: palette_hillshade},  'palette_hillshade_135');
var hillshade_225 = ee.Terrain.hillshade(elevation.multiply(exaggeration),225,15);
Map.addLayer(hillshade_225, { 
        min: 0, max: 255, palette: palette_hillshade},  'palette_hillshade_225');
var hillshade_315 = ee.Terrain.hillshade(elevation.multiply(exaggeration),315,15);
Map.addLayer(hillshade_315, { 
        min: 0, max: 255, palette: palette_hillshade},  'palette_hillshade_315');

GEE的默认方向角为270º ,作者可以根据自身需求选择合适的方位角。

高度角

不同的高度角也会影响山体阴影的显示效果:

//不同的高度角
var palette_hillshade = palettes.crameri.bamako[10,25,50];
var exaggeration = 20;
var hillshade_15 = ee.Terrain.hillshade(elevation.multiply(exaggeration),270,15);
Map.addLayer(hillshade_15, { 
        min: 0, max: 255, palette: palette_hillshade},  'palette_hillshade_15');
var hillshade_30 = ee.Terrain.hillshade(elevation.multiply(exaggeration),270,30);
Map.addLayer(hillshade_30, { 
        min: 0, max: 255, palette: palette_hillshade},  'palette_hillshade_30');
var hillshade_45 = ee.Terrain.hillshade(elevation.multiply(exaggeration),270,45);
Map.addLayer(hillshade_45, { 
        min: 0, max: 255, palette: palette_hillshade},  'palette_hillshade_45');
var hillshade_60 = ee.Terrain.hillshade(elevation.multiply(exaggeration),270,60);
Map.addLayer(hillshade_60, { 
        min: 0, max: 255, palette: palette_hillshade},  'palette_hillshade_60');
var hillshade_75 = ee.Terrain.hillshade(elevation.multiply(exaggeration),270,75);
Map.addLayer(hillshade_75, { 
        min: 0, max: 255, palette: palette_hillshade},  'palette_hillshade_75');
var hillshade_90 = ee.Terrain.hillshade(elevation.multiply(exaggeration),270,90);
Map.addLayer(hillshade_90, { 
        min: 0, max: 255, palette: palette_hillshade},  'palette_hillshade_90');

一般来说,高度角越小,山体阴影效果越强,高度角在gee中默认是45°。

代码链接

https://code.earthengine.google.com/2e947952a68cb01eb63a247ec4424936

写在最后

总结以下,要优雅地使用GEE绘制DEM:

首先得,小研究区选择分辨率高的DEM,大研究区可以选择低分辨率DEM;

其次是选好,这里推荐使用第三方库ee-palettes,然后就是注意调色板的最值范围;

其次是制作,注意选择合适的太阳高度角与方位角。

该文只是提供一个制作思路,由于作者的审美水平有限,读者不必完全按照我的配色方案来制作地形图,

参考

Clarmy吱声.如何用Python绘制炫酷的立体地形图

标签: 连接器dem9snmb

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司