关于

昨天阅读了一篇质量很高的python绘制地形图博客。有感而发,我便想到了GEE(Google earth engine)数据源众多、计算速度快、计算算子多的特点,使用GEE应该不会逊色于python。

制作流程

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

(1)DEM数据源

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

在GEE中的每一种数据源,都有详细的介绍与代码引用示例,比如荷兰的0.5m分辨率的DEM:

这里考虑到试验区是我老家四川省,这里使用覆盖全球的30m分辨率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仓库 ee-palettes(https://github.com/gee-community/ee-palettes):

该仓库汇集了近两百种配色方案,在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绘制炫酷的立体地形图

优雅地使用GEE绘制DEM相关推荐

  1. GEE绘制DEM全解析

    GEE绘制DEM全解析 关于 昨天阅读了一篇质量很高的python绘制地形图博客.有感而发,我便想到了GEE(Google earth engine)数据源众多.计算速度快.计算算子多的特点,使用GE ...

  2. c++绘制函数图像_简洁优雅的Matplotlib可视化 | 绘制论文曲线图

    这是"简洁优雅的Matplotlib可视化"栏目的第 2 篇文章! 我在上一期举了一个很简单的线形图例子--绘制sin和cos曲线.在这一期,我们将系统地讲解线形图和散点图的画法. ...

  3. 如何优雅的用Axure绘制高保真原型心得分享

    去年一直想写的Axure小技巧分享,终于还是动手写了,今天主要给大家分享关于axure高保真原型的一些东东. 本文核心内容点: - 啥是高保真原型?(附简单说明原型) - Axure可以画出什么水准的 ...

  4. matlab曲面拟合的算法,用Matlab 实现移动曲面拟合法生成DEM

    用Matlab实现移动曲面拟合法生成DEM 杜玉军 (武汉大学测绘工程0408班 200431610007  武汉  430079) 摘要:移动曲面拟合法是DEM格网点内插常用的一种方法,利用Matl ...

  5. IC技术圈期刊 2021年第2期

    IC技术圈期刊内容涵盖FPGA.前端.验证.后端.自动化.模拟.求职.管理等IC技术领域,欢迎阅读,欢迎投稿. 本期文章包括:FPGA 15篇,前端 6篇,验证 1篇,后端 1篇,嵌入式 1篇. FP ...

  6. 星载高分宽幅方位多通道合成孔径雷达SAR卫星调研

    目前,国际上在轨运行的方位多通道星载SAR卫星主要有RadarSat-2.TerraSAR-X.TanDem-X.ALOS-2和GF-3.下面按照相关文献发表的时间,介绍这5颗卫星. RadarSat ...

  7. 论文三线表中表头添加横线间隔线

    在写论文的时候我们可能需要用到三线表,然后需要在表头绘制间隔线,就像下面这样 关于这个效果,相信网上有很多类似的解决方案,但都不够优雅,如手动绘制横线.内嵌单元格.双线表格等等.其实正确的打开方式应该 ...

  8. InSAR处理及绘图常用GMT命令、bash、csh、matlab语法及样例

    文章目录 前言 一.GMT 二.bash 三.csh 四.matlab 前言 一两年的科研成果刚被正式接收,在此简单回顾一篇水paper所学和所做的一些东西,也为了以后方便翻阅查找.主要用到了GMTS ...

  9. arcgis中的插值分析了解

    1.前言 打开arcgis工具箱我们可以发现arcgis为我们提供了多种插值分析的工具,克里金插值.反距离权重插值.样条函数插值等,具体如图所示 在工具箱中除地形转栅格和通过文件实现地形转栅格是用来绘 ...

最新文章

  1. php多文件读写,php使用多个进程同时控制文件读写示例
  2. PHP7.0连接DB
  3. mysql报错排查总结
  4. ns-allinone错误锦囊
  5. netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源
  6. 细说ReactiveCocoa的冷信号与热信号(二):为什么要区分冷热信号
  7. Windows 平台安装 MongoDB
  8. win10计算器rsh_Win10计算器在哪里?
  9. vs2017+pcl1.8.1配置
  10. 圈圈教你学USB学习资料大全(包含完整光盘和教程)
  11. php player baidu,BaiduPlayer.php
  12. win7讲述人修复_win7系统TTS语音引擎修复补丁
  13. 方差分析、T检验、卡方分析|LSD检验可用于方差同质性检验|LSD检验法与t检验相比的优点
  14. red5搭建流媒体直播系统
  15. java中nextToken,Java StringTokenizer nextToken()用法及代碼示例
  16. tomcat一次升级后启动报错的解决,IllegalArgumentException: AJP连接器配置secretRequired=“true“
  17. 【最新最详细】SQL Server 2019 安装教程{超详细 附网盘下载链接}
  18. 在git clone报错
  19. 企业邮箱邮件撤回可撤回几次?邮件误删恢复怎么用?
  20. python爬虫: requests爬取flash播放页面的信息

热门文章

  1. void指针(void *的用法)
  2. python内建函数有哪些_享学课堂浅谈Python序列内建函数都有哪些
  3. PL0扩展一维数组array
  4. Vue插件视频播放插件
  5. Error: Transaction check error: package managesoft-13.1.1-1.x86_64 does not verify: no digest
  6. 北京科技大学计算机考研专业课计算机综合一871分享
  7. 4 第二式:左右开弓似射雕
  8. C++14尝鲜:decltype 和 decltype(auto)
  9. Vue中使用百度地图做路径分析并根据起终点坐标模拟道路里程桩
  10. Java第一课学习,开启学习之旅!