ArcMap:如何渲染一幅精美的地形图

news/2025/2/16 6:59:49/

目录

01 python渲染地形图

1.1 代码展示

1.2 重点讲一下阴影和光源的设置。

1.3 如何使用阴影进行进行渲染?

02  ArcMap+ArcSence渲染地形图

2.1 山地阴影的制作 

2.2 基本高度和偏移 

2.3 图层叠加和透明度等参数的设置

2.4  渲染的设置

2.5  其它设置


尝试使用python进行渲染,感觉总是不太满意,但是做都做了,还是贴出来。其实感觉ArcSence做的其实会好看很多。

01 python渲染地形图

1.1 代码展示

思路其实也很简单,就是山地阴影+光源。其它的无非就是参数调整。

import numpy as np
from osgeo import gdal
from matplotlib import pyplot as plt
from matplotlib.colors import LightSource
from mpl_toolkits.axes_grid1 import make_axes_locatable
# 设置DEM路径
dem_file = "E:\\资料\\Competition\\PIE\\Sentinel1_2019\\DEM\\DEM_ZhaoDong.tif"  # 换成你自己的DEDM路径
def plot1(dem_file):# 使用GDAL驱动并读取DEM数据ds = gdal.Open(dem_file)data = ds.ReadAsArray()# 设置无效值nodata = ds.GetRasterBand(1).GetNoDataValue()if np.any(data == nodata):data = np.ma.masked_equal(data, nodata)# 创建光源对象ls = LightSource(azdeg=360, altdeg=30)# 创建图像和轴对象fig, ax = plt.subplots(figsize=(8, 6), dpi=666)# 使用色带和阴影渲染DEM数据rgb = ls.shade(data, cmap=plt.cm.gist_earth, blend_mode='hsv',vert_exag=2, dx=10, dy=10, fraction=1.05)img = ax.imshow(rgb, aspect='auto')# 添加色带(基于原始的DEM数据)divider = make_axes_locatable(ax)cax = divider.append_axes("right", size="5%", pad=0.05)img2 = ax.imshow(data, cmap=plt.cm.gist_earth)  # 仅仅用于色带fig.colorbar(img2, cax=cax, orientation='vertical')img2.remove()  # 在创建色带后删除# 设置轴标题ax.set_title('DEM (Shaded)')# 展示图像plt.show()# 执行函数绘制地形图
plot1(dem_file)

1.2 重点讲一下阴影和光源的设置。

# 创建光源对象
ls = LightSource(azdeg=360, altdeg=30)# 创建图像和轴对象
fig, ax = plt.subplots(figsize=(8, 6), dpi=666)# 使用色带和阴影渲染DEM数据
rgb = ls.shade(data, cmap=plt.cm.gist_earth, blend_mode='hsv',vert_exag=2, dx=10, dy=10, fraction=1.05)
img = ax.imshow(rgb, aspect='auto')

其中的创建光源对象,LightSource函数需要传入两个参数,azdeg(光源方位角:默认315°)和altdeg(光源高度角:默认45°);具体图示如下(源ArcGIS):

实际上,就是光源在你的哪个方向(光源方位角),有多高(光源高度角)?

1.3 如何使用阴影进行进行渲染?

ls.shade方法需要传入DEM数据(data)、色带(plt.cm.gist_earth)、blend_mode(hsv,类似一种色调可能,但是实际上它是一种颜色的混合方式,在ENVI中有HSV混合、RGB等)、vert_exag(高度的夸张系数,因为它渲染是按照DEM高度进行渲染的,如果DEM本身就没有什么起伏,那么看起来的效果和2D没有什么区别,如果你想要使DEM的高度进行拉伸使其更具三维效果,你可以设置这个参数,这个和ArcSence的垂直夸大系数基本没有区别)、dx和xy(数据的分辨率,用于计算阴影的方向,设置高一些),fraction(阴影的不透明度)。

这是专业一点的回答:

  • data: 要渲染的DEM数据。
  • cmap: 色带(colormap)用于将高度值映射为颜色。这里使用plt.cm.gist_earth色带,它模拟了地球表面的颜色。
  • blend_mode: 颜色混合模式,默认为'hsv'。可选的混合模式有'soft''overlay''hsv'
  • vert_exag: 高度的垂直放大因子,用于控制DEM的垂直拉伸,默认为1.0。
  • dx, dy: 数据的水平和垂直分辨率,用于计算阴影的方向。默认情况下,它们分别为1。
  • fraction: 阴影的不透明度,默认为1.0(完全不透明)。
  • ax.imshow(): 在轴对象上绘制图像。rgb是通过阴影渲染生成的RGB图像。
  • aspect='auto': 图像的纵横比,设置为'auto'以自动调整。

 这是出的效果图(不特别好看):

02  ArcMap+ArcSence渲染地形图

其实它渲染的也不是很满足我的要求,我想要是下面这个样子的,但是目前为止我暂时还不知道如何去制作,我猜测需要使用一些专门的3D渲染软件例如Blender、PS(3d map generator)等会得到更好的效果,当然ArcMap pro的效果相对于ArcMap应该会更好,也可以尝试。

首先,我们要实现的就是python代码所实现的,实际上还是灯源+阴影。阴影的话我们使用ArcMap(ArcSence其实也可以)的山地阴影工具基于DEM数据进行山地阴影的生成;至于灯源的话我们需要使用到ArcSence进行设置了。

还有一件事,那就是python是直接使用阴影生成了一个渲染好的地形图,但是我们初窥可以发现,将DEM(顶层)与山地阴影(底层)两幅影像进行叠加可以达到这种效果,不过需要将DEM的透明度调整为45%左右,其他的参数也需要调整。

接下来直接实操吧。

2.1 山地阴影的制作 

我直接在ArcSence中制作了。

2.2 基本高度和偏移 

如果你设置完上述之后,DEM和山体阴影还是没有三维效果,那么你可以尝试下面的操作:

  

2.3 图层叠加和透明度等参数的设置

这种调整因人而异,每一个人的感觉都是不一样的,大家只要自己包括周围人觉得差不多,那就是调的差不多了。

DEM的显示参数如下:

 

2.4  渲染的设置

其实,2.3步骤做完了,基本上你可以看到渲染的效果,但是我们还可以进一步渲染。

基本上做完你可以看到如下效果了:

 

2.5  其它设置

其实做完2.4基本上就完成了地形图的渲染,但是这里还有一些其它的设置。

 

 如何将渲染的地形图输出呢?

 

最后看一下输出的效果吧。

 

 

 

 但是其实这些还是不满足我的要求,我想要的是下面这个样子,不过暂且满足吧。

(包含中国的三维渲染地形图)

 (西南地区山地)

 


http://www.ppmy.cn/news/71627.html

相关文章

QT开发实战-动态壁纸软件

动态壁纸软件开发 项目源代码在下面链接获取: ----------------------------- 开发者:CodeSharkSJ 希望此项目能加强你对Qt的应用 文章目录 项目图与开发环境核心技术原理自定义窗口程序UI布局背景绘制样式表基本实现QWebEngineQMedia使用系统托盘隐藏记忆功能应用程序打包 …

苹果XR头显简史:现实困境与未来预期

近几个月来,有关苹果MR头显的消息层出不穷,机构分析师大多认为6月份的WWDC23将会亮相。作为全新品类,苹果AR/VR备受期待的同时也有一些市场顾虑,例如因AR/VR产品成熟度问题,现阶段推出MR头显也饱受争议,甚至…

RSBBS 报表接口 query跳转 RRI

这里只讲RSBBS的goto query,不讲query里面的替换路径。 报表接口就是从一个query跳转到另一个目的地。从下面能看到,可以跳转到一个BW系统下的query,或者能跳转到ERP系统的一个ABAP report也行,或者可以通过archive link去从quer…

DS3800HPIB 有效执行任务的所有程序

DS3800HPIB是通用电气公司生产的Speedtronic Mark IV系列的一部分。这DS3800HPIB是一种大型电路板,具有八个连接端子,电路板两侧的尺寸各不相同。左下角有一个红色小方块,上面有一个拨动开关。这DS3800HPIB有大约50个天蓝色的小二极管。这DS3…

华纳云:JSP不能运行JavaScript怎么解决?

本篇内容主要讲解“JSP不能运行JavaScript怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JSP不能运行JavaScript怎么解决”吧! 一、JavaScript执行与页面渲染的顺序问题 JavaScript执行与页面渲…

Android之 ContentProvider内容提供者详解

一 四大组件 1.1 Activity组件,它一个单独的窗口,程序流程都必须在Activity中运行。 1.2 service组件,用于在后台完成用户指定的操作。 1.3 content provider组件,会为所有的应用准备一个内容窗口,并且保留数据库、…

实验四 面向对象分析与设计——UML类图与时序图

一、实验目的: 掌握面向对象分析中静态结构模型与动态行为模型的基本思想。学会识别系统中的类、类的属性和操作以及类之间的关系,掌握UML类图的绘制方法。了解时序图的作用和组成元素,掌握UML时序图的绘制方法。 二、实验仪器及实验环境&a…

C++14中lambda表达式新增加的features的使用

lambda表达式是在C11中引入的,它们可以嵌套在其它函数甚至函数调用语句中,C11中lambda表达式的使用参考:https://blog.csdn.net/fengbingchun/article/details/52653313 lambda表达式语法如下:除capture和body是必须的&#xff0c…