QGIS 3.14|地震数据动画效果实战(二)动画设置篇

tech2025-11-20  1

 

 01 设置图层Temporal属性

 

在QGIS 3.14中,图层的属性对话框首次加入了 Temporal标签页,提供图层的时间设置。

 

右键点击【图层】面板中的“quake2020”图层,弹出菜单中选择【属性…】,打开图层属性对话框。

 

 

勾选【Temporal】复选框,表示该图层接受 Temporal Controller控制。

 

 

点击【Configuration】下拉框,可以看到有多种形式时间设置:

 

Fix Time Range:固定时间范围,即用时间常数设置开始时间和结束时间,图层在该时间范围将处于可见状态。

 

Single Field With Date/Time:通常图层包含了一系列事件点,如地震事件,属性表中保存了事件发生的时间,图层根据时间字段过滤要素。

 

Separate Fields for Start and End Date/Time:图层包含两个时间字段,一个表示事件的发生时间,另一个表示事件的结束时间。从事件发生时间开始,该事件点将显示在地图上,一直到事件结束时间,该点在地图上消失。

 

Separate Fields for Start and Event Duration:与上一条类似,图层含两个时间字段:事件发生的时间和事件持续时间。实际上,在地图渲染时,将开始时间加上持续时间得到事件的结束时间,以判断该事件点是否应该绘制到当前地图窗口中。

 

Start and End Date/Time from Expression:用表达式计算出开始时间和结束时间,特别适合于原始数据提供的时间字段不符合 Temporal Controller输入要求时,用表达式进行数据类型转换。

 

Redraw Layer Only:仅重绘该图层。适用于用表达式建立了与时间变量相关的符号化效果,随着时间的变化需要刷新地图。

 

 

 

在本文中,时间属性选择“Single Field with Date/Time”,【Field】选择《QGIS 3.14|地震数据动画效果实战(一)数据准备篇》合成的时间字段“time”,其他选项保持默认,点击【OK】按钮,完成图层属性设置。

 

返回QGIS主窗口,可以看到“quake2020”图层的右侧出现了图标,表示该图层受到Temporal Controller控制,在地图时间发生变化时,图层会根据时间范围过滤要素,并重新绘制。

 

 

 02 设置动画参数

 

点击【地图浏览】工具栏上的【Temporal Controller Panel】,显示Temporal Controller面板。

 

 

第一次打开Temporal Controller时,默认情况下动画播放处于关闭状态,即Temporal navigation disable。面板上方提供三个按钮: Turn off temporal navigation、Fix range temporal navigation、Animated temporal navigation。

 

 

 :将Temporal Controller面板的操作按钮收起,不再根据时间对要素进行过滤。

 

:设置动画时间范围,点击右侧的【刷新】按钮,可自动填入当前图层的时间取值。

 

 

  :打开动画播放工具条,点击相关按钮可控制动画播放。

 

点击,打开动画相关设置界面。

 

点击时间范围【range】右侧的【刷新】按钮,设置动画时间为当前图层时间范围。

 

【Step】设置为1 months,即步长为1个月。表示地图切换时,用当前地图(Frame)的结束时间作为下一帧的开始时间,加一个月得到下一帧的结束时间。例如,当前地图时间为2018年1月1日 到2018年2月1日,那么下一帧的时间范围为2018年2月1日到2018年3月1日。

 

 

经过设置,现在可以点击按钮看一下动画效果了。

 

 

 

效果不是很好,地震点很快出现又消失,像电影的快进镜头一样,让人眼花缭乱,很难看出地震分布规律。

 

如何把播放度放慢?

 

最简单的方法是在Temporal Controller中设置帧速(Frame Rate),即每秒钟播放多少幅地图,一幅地图相当于动画里的一帧。

 

点击Temporal Controller面板右侧的【Temporal Settings】按钮,将【Frame rate(frames per second)】设置为1,表示1秒播放一幅地图。点击返回。

 

 

点击查看动画效果。

 

 

 

由于设置步长(Step)参数为1 months,地图以一个月为时间单位切换,所以在动画中可以看到,同一个月内发生的地震同时出现,1秒钟后切换到下一个月地震图,时间尺度太粗,难以看出一个月内不同日期地震发生的前后顺序。

 

如果以天为单位绘制地图,展示的时间尺度将会更精确。

 

本文中,地震数据的时间范围是:2018年1月1日到2020年8月18日,共960天,如果以1天为步长播放,需要绘制960幅地图,用动画的术语来说,共有960帧画面。如果帧速为1 FPS,即1秒钟播放一帧,那么,观看两年地震数据需要16分钟(960帧/1FPS/60秒),显然,时间太长了。

 

有没有既能缩短总播放时间,又能以Step为1观看动画的办法呢?这就需要Event duration、Frame rate、Step三个参数的配合。

 

在Temporal Controller面板中,设置【step】为“1days”。如下图:

 

 

 

点击【Temporal Settings】按钮,设置【Frame rate(frames per second)】为20 FPS,使得960帧画面只需要48秒(960/20)即可播放完成。

 

打开“quake2020”图层的属性窗口,切换到Temporal标签页,找到【Event duration】,设置为“30 days”,表示Step为1天时,地震点将会在地图上显示30天,即停留30帧。当帧速为20 FPS时,每个点在地图上显示1.5秒(30帧/20 FPS)。

 

 

 

点击查看动画效果。

 

 

 

经过上述设置过程,地震点以比较舒适的播放速度显示和消失,以天为单位的时间尺度和适当的滞留时间,可以观察到一段时间范围内每天地震事件的变化规律。

 

 03 设置符号

 

地震的破坏程度,不仅跟地震发生的频率有关,更取决于地震等级的大小,因此在地震专题图中,地震等级是必须考虑的重要因素。下面以地震等级和地图时间、地震发生时间构建表达式,使地震点依据等级和滞留时间,呈现从小变大、最后消失的动画效果。

 

点击【图层】面板上方的【打开图层样式面板】按钮,在窗口右侧打开【图层样式】面板。

 

 

 

渲染样式选择单一符号,选中【标记】下面的【简单标记】,点击【大小】右侧的【由数据定义覆盖】按钮,在下拉菜单中选择【助理】,打开【符号大小】助理设置面板。

 

 

 

点击【输入】->【源】右侧的【Ɛ】表达式按钮,在表达式代码编辑区输入:

 

"EQ_PRIMARY" *day( @map_start_time - "time" )

上述表达式中:    

    "EQ_PRIMARY"为地震等级字段,取值0-9。

    @map_start_time:变量,表示当前地图(Frame)的开始时间。

    "time":地震发生的时间。

    Day:时间函数,以天为单位计算时间间隔。

 

由于图层属性中设置了Event duration为30天,所以表达式:day( @map_start_time - "time" )的取值范围是[0,30],"EQ_PRIMARY"的取值范围是[0,9],因此,表达式"EQ_PRIMARY" *day( @map_start_time -  "time" )的范围是[0,270],即符号大小的输入数值范围。

 

下方的【输出】参数组,表示符号绘制大小,最小值设为0,其他保持默认即可。

 

 

点击查看动画效果。

 

 

 

地震点根据等级从小变大、最后消失,使地图画面生动起来。

 

除了从小变大的效果之外,使用【应用变换曲线】功能,可以设计出更多的符号变化效果。

 

勾选【应用变换曲线】复选框,打开变换曲线。

 

 

“变换曲线”定义了【输入】->【输出】之间的对应关系,横坐标是【输入】,即表达式的取值,纵坐标是【输出】,即符号在地图上的绘制大小。

 

默认的变换曲线是从坐标0点到最大值点的直线,即线性变换,表示随着表达式取值增大,地震点慢慢变大。

 

按住鼠标左键,任意拖动曲线,可以在下方看到对应的输出效果。例如,下图中曲线表示地震点在地图上从0开始慢慢变大,表达式取值约50时,点最大,随后慢慢变小,直至消失。

 

 

点击查看动画效果

 

 

这样的动画是不是更有趣了?

 

关于动画参数的设置就介绍到这里,下一篇将介绍 给地图添加进度条。

 

吴建玲

2020年8月27日


 

版权声明

 

本文欢迎转载,转载时请注明出处。

 

本文是参考了Nyall Dawson的视频整理。Nyall Dawson是QGIS开发团队成员,有10年的QGIS开发经验,他的直播条理清楚、思路新颖,感兴趣的朋友可以去观看相关视频,地址为:

https://www.youtube.com/watch?v=vgDg5cRwPRw。

 

最新回复(0)