通常来说,要素已基于其属性值在地图中实现了符号化。例如,一些按人口进行了符号化的城市或按道路分类进行了符号化的道路。有时,您需要根据计算的聚合值对要素进行符号化。计算值的示例包括最小值、最大值、平均值或总计值等。这些值是根据一组聚合值的属性进行计算的。
时态数据应用情景
对具有聚合值的数据进行符号化主要在两种情景中有用。
具有时间序列的站点数据
此类数据在固定位置上的量会随时间发生改变。在这些位置上,随着时间流逝会定期或不定期地对要素进行观察、收集或预测。示例包括在气象站或沿河流的监测站所测量的温度、降雨量、水位、盐度以及排放情况。
您可能想要按七月份全部降雨量或全年的最高或最低温度将气象站要素符号化。要用此方法对数据进行可视化,需要对数据进行模拟以便固定位置可以存储在要素类中,且观测数据可以与日期时间属性一同存储在相关的表中。
具有时间戳的稀疏数据
这些要素代表了发生在单个时间点的事件。示例包括龙卷风的位置、客户地址、医院收治的患者及犯罪地点。
您可能想要显示龙卷风造成的损失总量、总的购买量或聚合在面要素(例如省、区或其他行政边界)中的总患者数。要用此方法对数据进行可视化,需要对数据进行模拟以便位置可以存储在具有日期时间属性的要素类中。
准备用于聚合显示的数据
要显示具有聚合结果的要素,应考虑以下几点:
- 聚合类型 - 确定要显示总数、最小值、最大值、平均值还是其他一些指标。
- 显示要素 - 确定哪些要素显示聚合结果。这些与具有测量过的观察值的要素可能相同也可能不同。例如,您可以显示每个气象站的年度总降雨量,还可以根据县或流域边界显示年度总降雨量(按每个气象站点要素测定)。
- 查询参数:
- 时间 - 确定要显示聚合结果的时间范围和时间间隔。使用时间滑块可以对这些参数进行动态设置。例如,对于日常的聚合结果,可将时间滑块上的时间范围和时间间隔设置为一天。
- 范围 - 您可能只想要聚合要素子集的结果。例如,要聚合 0 到 50 米之间的盐度以及 50 到 75 米之间的盐度,可使用范围参数和范围滑块。
- 查询过滤器 - 要通过聚合每个选区的犯罪类型查看犯罪数据中的模式,可使用离散参数构建查询过滤器。
聚合结果示例
假设存在一个名称为 weather_stations 的要素类,其中存储了气象站的位置。每个气象站要素都可通过存储在 station_id 字段中的值进行唯一识别。该字段用于将气象站与名称为 observed_rainfall 的表中的相关观测记录链接起来。该表记录了同一位置随时间变化而收集到的降雨量观测结果。其中包括链接到气象站的要素类的 station_id 字段、存储每天降雨量(单位为厘米)的 rainfall_cm 字段以及存储降雨发生日期的 collection_date 字段。其目的是计算每个气象站任何给定时期内(例如一个月、一年或任何自定义的时间范围)的总降雨量,并将气象站按该时期内计算的总降雨量进行符号化。有两种方法可实现此目的。
利用查询图层参数动态计算聚合结果
两种方法中此方法更加灵活,可确保始终显示最近的结果。您可使用数据库 SQL 聚合函数和连接功能。在 ArcGIS Pro 中,要实现此功能您必须创建查询图层。
但是,这种方法也有一些缺点。缺点具体如下:
- 由于每次使用地图导航、使用时间滑块或打开属性表时都会计算聚合结果,数据库会产生额外的负载。
- 该方法要求数据存储在企业级数据库。文件地理数据库或 shapefile 不能使用此方法。
如果数据需要频繁更新,可以考虑将数据移动至企业级数据库并接受对数据库造成的额外负载。
- 在地图选项卡的图层组中打开添加数据菜单并单击查询图层。
- 在查询框中,构建 SQL 查询以返回聚合结果。
从 observed_rainfall 表中选择每个气象站的总降雨量。
SELECT station_id, SUM(rainfall_cm) AS total_rainfall FROM observed_rainfall GROUP BY station_id
将结果连接到 weather_stations 要素类。这会使用 observed_rainfall 表中的所有记录返回总降雨量。
SELECT w.*, r.total_rainfall FROM weather_stations AS w INNER JOIN (SELECT station_id, SUM(rainfall_cm) AS total_rainfall FROM observed_rainfall GROUP BY station_id) AS r ON w.station_id = r. station_id
用 where 子句设置时间范围,计算 2016 年 6 月 1 日至 2016 年 6 月 30 日之间的聚合结果。
SELECT w.*, r.total_rainfall FROM weather_stations AS w INNER JOIN (SELECT station_id, SUM(rainfall_cm) AS total_rainfall FROM observed_rainfall WHERE collection_date >= '6/1/2016' AND collection_date <= '6/30/2016' GROUP BY station_id) AS r ON w.station_id = r.station_id
- 单击下一步来完成新建查询图层对话框中的余下说明,并将查询图层添加至当前地图。
- 将图层符号化,以将气象站及 2016 年 6 月每个站点的总降雨量一同显示出来。例如,您可能会利用分级或比例符号根据总降雨量对要素大小进行设置,还有可能会利用分级或未分类颜色符号,用颜色变化表示每个气象站。
如果您想要更改时间范围,比如您想要看到相同的可视化效果,但时间变更为 8 月 1 日至 8 月 15 日,您需要打开查询图层的源并更改 where 子句。这样做很麻烦,因此使用时间滑块实现这种更改更为可取。要使用时间滑块修改 where 子句,您需要用到 SQL 语句中的参数。
- 右键单击内容窗格中的图层,然后单击属性。
- 在源选项卡中的查询表行中,单击编辑查询 。该查询会在查询文本框中显示。
提示:
为了使查询文本更易于读取,可以在按住 Ctrl 键的同时向前转动鼠标滚轮,以将其放大。
- 用范围参数替换 WHERE collection_date >= '6/1/2016' AND collection_date <= '6/30/2016'。范围参数使用 ::r: 前缀进行声明。
where 子句由名为 TimeVar 的参数进行替换。
SELECT w.*, r.total_rainfall FROM weather_stations AS w INNER JOIN (SELECT station_id, SUM(rainfall_cm) AS total_rainfall FROM observed_rainfall WHERE ::r:TimeVar GROUP BY station_id) AS r ON w.station_id = r.station_id
- 参数将以粗体显示在 SQL 查询内,且参数旁边附有图标 。单击图标以设置如下参数的属性:
- 字段或表达式:collection_date
- 数据类型:日期
- 默认值:选中
- 默认值范围:6/1/2016 至 6/30/2016
- 单击完成。
- 在编辑查询对话框上,单击验证以确保没有错误。
由于范围参数参考了日期时间字段,因此图层现在为时间感知图层。时间感知图层可以用时间滑块进行控制。例如,使用时间滑块选择一个时间范围,气象站会与该时间范围内计算的总降雨量一起动态显示。
- 要了解每月总量,将当前时间跨度和时间步长都设置为一个月。
- 要了解变动的平均值,将当前时间跨度设置为一个月,将时间步长设置为一天。此例中,当您每次单击时间滑块中的间隔时,时间滑块都会移动到下一天并显示从该日开始的一个月内的结果。
提示:
在属性表的视图选项卡中,启用时间和范围过滤器可只显示地图中可见的要素。如果不这样做,对结果的计算会波及所有要素以及整个表,如果表中包含很多记录,会导致计算较为缓慢。
预先计算结果
当您处理不经常更新且可预定义时间范围的数据时,该方法非常适用。此例中,预先计算聚合结果可以在地图每次更新时、打开属性表时或查询图层时降低数据库的负载。
该方法的不足之处包括以下方面:
- 每次更新时间数据时,都需要执行这些步骤。
- 因此,此方法并非十分灵活。例如,要以每周和每年的结果可视化要素,您需要两个单独的表:一个用于存储每周的聚合结果,另一个用来存储每年的结果。
- 使用这种方法,您就无法使用时间滑块。
预先计算聚合结果的方法有两种。
使用地理处理
以下示例概述了使用地理处理工具预先计算每个气象站每月平均降雨量的步骤。
- 在名为 month 的要素类中添加新的整数字段来表示月。
- 使用计算字段工具更新记录。
将表达式参数设置为 month = getMonth(!DateTime!)。
在 Codeblock 参数中输入以下内容。此例中,v 是 datetime 属性的值。
from datetime import datetime def getMonth(v): d = datetime.strptime(v, "%m/%d/%Y") return d.month
- 使用汇总统计数据工具创建具有汇总结果的表。此例中,汇总的是每个气象站每月的总降雨量。输入如下参数:
- 统计数据字段:选择想要汇总的字段。此例中为降雨量字段。
- 统计类型:选择 SUM 以计算总降雨量。
- 案例分组字段:选择 station_id 和 month 字段。
- 使用连接字段工具或添加连接工具将汇总表中的记录连接到要素图层。
- 显示具有定义查询的地图中的图层,以显示特定月份的结果。例如,要仅显示五月份的结果,可使用定义查询 where Month = 5。
使用数据库函数
如果您的数据存储在企业级数据库中,您可以使用 SQL 查询来预先计算聚合结果或汇总结果,并将其保存在一个单独的表中。
- 执行数据库客户端中的下列 SQL 查询。它可以计算每个气象站的月平均值。查询假设有一个存储整数的字段可以表示月份。
SELECT station_id, month, SUM(rainfall_cm) AS total_rainfall INTO avg_monthly_rainfall FROM observed_rainfall GROUP BY station_id, month
- 如果数据库是地理数据库,将表注册到地理数据库可获得最佳性能,还可将表连接到要素图层。
在内容窗格中选择要素图层。在要素图层选项卡的数据选项卡的关系组中,单击连接,然后单击添加连接。
- 如果不是地理数据库,您必须从下列策略中选择一个策略:
- 在将保存几何的表与新创建的汇总表连接在一起的数据库中创建一个视图。
- 创建查询图层,然后定义查询图层的源中的连接。
- 显示具有定义查询的地图中的图层,以显示特定月份的结果。例如,要仅显示五月份的结果,可使用定义查询 where Month = 5。
提示:
您可以使用 Windows 计划程序来计划任务,使其定期运行来预先计算结果。