欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > 基于 GEE 绘制好看的地形图

基于 GEE 绘制好看的地形图

2025/4/19 14:22:15 来源:https://blog.csdn.net/ZK180531/article/details/145065205  浏览:    关键词:基于 GEE 绘制好看的地形图

目录

1 流程图

2 DEM数据源

3 加载数据源

4 使用调色板

4.1 调色板介绍

4.2 调用仓库已经配置好的调色板

4.3 DEM值分布直方图对比

5 山体阴影

6 方位角

7 高度角

8 完整代码



1 流程图

使用GEE绘制DEM一共有3步,其中最重要的是调色板的使用。

基于GEE绘制好看的地形图的流程

2 DEM数据源

GEE的DEM数据众多,读者可以根据自己的需要选择合适的数据源。研究区范围大,可以选择分辨率较低的数据,如果研究区域较小,则尽量使用高分辨率DEM。

GEE中的DEM数据集

这里使用覆盖全球的30m分辨率的NASA DEM当作数据源。

3 加载数据源

// 引入数据源
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);
数据源DEM

4 使用调色板

4.1 调色板介绍

待数据加载完成之后,数据的颜色不好看,这个时候就需要调色板。有几种办法,一种是在GEE中手动调整DEM显示,如下所示。

设置数据显示颜色

手动调整的DEM颜色

还有一个就是可以参考别人的已经设置好的调色板,直接调用,这里我推荐一个GitHub仓库,该仓库汇集了近两百种配色方案,在GEE中直接调用即可:

GitHub - gee-community/ee-palettes: A set of common color palettes for Google Earth Engine

ee-palettes
调色板样式
调色板样式
调色板样式
调色板样式

调用这个仓库,只需要引入函数库,然后设置一个调色板,并将该配色方案填入地图加载函数中,注意设置最大值与最小值。然后对照着颜色表逐个尝试,找到最适合自己的颜色方案。

4.2 调用仓库已经配置好的调色板

// 调用仓库已经配置好的调色板
var palettes = require('users/gena/packages:palettes');// 使用不同的调色板可视化 elevation 数据
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');
配色方案crameri.bamako[10,25,50]
配色方案kovesi.rainbow_bgyr_35_85_c72[7]
配色方案misc.jet[7]
配色方案kovesi.diverging_linear_bjy_30_90_c45[7]

4.3 DEM值分布直方图对比

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

// 值域范围对比
// 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');
min0,max8000米配色方案
min188,max7556米配色方案
min451,max4525米配色方案
min451,max6000米配色方案

5 山体阴影

选取了较好的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');
山体阴影

6 方位角

影响山体阴影显示效果的因素有方位角。

// 不同的方位角
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');
45°方位角
135°方位角
225°方位角
315°方位角

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

7 高度角

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

// 不同的高度角
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');
高度角90°
高度角75°
高度角60°
高度角45°
高度角30°
高度角15°

8 完整代码

// 引入数据源
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);// 调用仓库已经配置好的调色板
var palettes = require('users/gena/packages:palettes');// 使用不同的调色板可视化 elevation 数据
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');// 值域范围对比
// 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');// 山体阴影
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');// 不同的高度角
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');

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词