QGIS表达式中的变量
QGIS 从2.12版本开始提供对变量的支持,变量的加入对QGIS是一个巨大的提升,用开发团队成员Nyall Dawson的话来说:“变量开启了令人兴奋的各种可能性(the exciting possibilities variables unlock)”。
在QGIS中,变量用于存储程序、项目、图层或者打印布局中的可变内容,如QGIS的语言设置、当前版本、项目文件的存储位置、地图当前比例尺、打印布局的名称等。
构建表达式时,变量用“@+变量名”表示。
系统变量和自定义变量
从用户是否可以改变取值的角度看,QGIS中变量可以分为系统变量和自定义变量两大类。系统变量是系统预定义的、用户能访问但不能修改的变量,通常用斜体字表示。点击【设置】->【选项】打开全局设置对话框,切换到【变量】标签页,可以看到用斜体表示的系统全局变量列表。
自定义变量顾名思义,是用户定义的变量,因此用户可以根据需要增加和删除变量、修改变量名称、变量取值。自定义变量用非斜体字表示。点击对话框右下角的【+】、【-】按钮可以添加、删除自定义变量,双击对应的条目可以使其进入可编辑状态。
变量继承
变量遵从层级结构,类似css的继承规则。根据作用范围的大小,变量可以分为全局变量、项目变量、地图变量、图层变量、打印布局变量、地图集变量、上下文变量等。
点击菜单【设置】->【选项】,打开全局选项设置对话框。
切换到【变量】标签页,可以看到QGIS所有的全局变量。全局变量在整个程序范围内均可以用于构建表达式,且其变量取值相同,例如对于下图中显示的全局变量,无论是在更新字段时,还是在筛选要素时,代表QGIS所处操作系统的变量“@qgis_os_name”均为可用状态,且取值均为当前操作系统,即“windows”。
项目变量是在项目属性对话框中一些列与项目有关的变量集合,包括表示当前项目文件位置的变量“@project_path”、表示项目所使用的坐标系的变量“@project_crs”等。点击菜单【项目】->【属性…】,打开项目属性对话框,切换到【变量】标签页,即可看到当前项目的所有变量及其取值。
项目变量继承了全局变量,因此,在项目属性对话框中可以看到变量分为两大部分列出:全局和项目,即全局变量在项目范围内可用。
地图变量作用范围比全局变量、项目变量小,比图层变量的作用范围大,与具体地图窗口关联,定义了地图窗口渲染的方式,包括地图中心点“@map_extent_center”、地图当前范围“@map_extent”、 地图的坐标参照系“@map_crs”、 地图中可见图层列表“@map_layers”等。
打开图层属性对话框,切换到【变量】标签页,可以看到图层变量。图层变量继承全局变量和项目变量,与当前选择的图层相关,例如表示图层对象的变量“@layer”,表示图层ID的变量“@layer_id”,表示图层名称的变量“@layer_name”。对于不同图层,图层变量的取值也不同。
在打印布局窗口中点击菜单【布局】->【布局属性…】,可在右侧的【布局】面板中看到打印布局变量。打印布局变量继承自全局变量和项目变量,布局自有变量包括:布局名称“@layout_name”、版面页数“@layout_numpages”、版面的当前页码“@layout_page”等。如果启用了地图集,以“atlas”开头的地图集相关变量也将显示在面板中。
在不同上下文中调出表达式构造器,可用的变量并不完全相同,也就是说,一个变量是否可以用于构建表达式,除了与它的作用范围有关,也与使用表达式的上下文相关。
例如,下图的表达式构造器是通过点击点图层符号大小设置的【由数据定义覆盖】按钮调出,粗体字标出的变量即为上下文变量。其中,“geometry_”开头的变量表示当前正在渲染的几何图形相关属性,“@symbol_color”表示用于渲染要素的符号颜色,“@value”表示用户设置的属性取值。
当通过点击【打开字段计算器】按钮构建表达式时,粗体字部分只有“@row_number”,表示当前操作记录的行号。仔细观察发现,该表达式构造器中只包含了全局变量、项目变量和图层变量,与地图渲染有关的变量没有出现在变量列表中。
变量覆盖
变量覆盖定义了同名变量的作用范围(scope),与编程语言中变量的作用域概念类似,一般来说,如果全局变量与局部变量同名,那么在局部变量作用范围内,全局变量将被覆盖。例如,设定全局变量“my_username”,设定取值:“wujianling”,然后在项目属性中增加同名变量“my_username”,设定取值:“吴建玲”,那么在同时可以访问项目变量和全局变量的表达式上下文中,全局变量的取值“wujianling”将不起作用。被覆盖的变量以删除线表示。
常用系统变量
QGIS中的系统变量约为100个,随着软件版本不同,数量有所变化。由于篇幅所限,不能将所有变量一一说明,本文结合《QGIS实操与技巧》专辑所涉及变量,挑选出10个常见系统变量加以详细说明。未能在文中详细解释的变量,可以参考表达式构造器中的帮助内容进行理解和使用。
变量的典型应用场景
地理空间数据的可视化表达效果是评价GIS软件的重要考量,变量给可视化表达带来了更多的灵活性。
地图数据生产项目中,一幅漂亮的地图往往由几十、上百个图层组成,如果逐个调整图层的符号和标签风格,工作量非常大。特别是如果在项目进入尾声时对某个风格不满意,比如发现图层标签的字体不好看,需要重新设置,大量时间将会浪费在重复劳动上。
有了变量以后,对于统一标签的设置和修改将变得非常容易,可以节约大量的手工设置时间。具体操作步骤如下:
首先,在项目范围内为标签所用的字体设置一个变量。点击【项目】->【属性…】,打开项目属性对话框,切换到【变量】标签页,点击右下方的【+】按钮添加自定义变量,将变量名设置为“main_font”,变量取值设置为需要的字体,如“宋体”。
然后,设置标签的字体为变量“@main_font”。在【图层样式】面板的标签字体设置中,点击【由数据定义覆盖】->【变量】->【main_font】,表示字体来自变量“@main_font”的取值。
对其他标签图层重复上面步骤,完成标签字体的统一赋值。
当对标签字体不满意时,打开项目属性并修改“@main_font”的取值,即可将所有标签的字体修改为其他字体。
地图集的制作经常需要生成地图模版,通过模板提供统一的地图整饰内容,例如制图者、项目版本、出图日期、项目路径等。
为了统一管理整饰内容,建议将其设置为变量。当其中的某一项需要修改时,只需要修改对应的变量取值即可。
小结
本文试图从变量继承、变量覆盖、变量是否可修改、常用变量和变量典型使用场景五个方面对变量的特性进行剖析,希望能把对QGIS表达式中变量的理解分享出来。如果文中有理解不到位的地方,也欢迎在后台留言指正。
吴建玲
2020年7月27日
版权声明
本文欢迎转载,转载时请注明出处。