通常来说,要素已基于其属性值在地图中实现了符号化。 例如,一些按人口进行了符号化的城市或按道路分类进行了符号化的道路。 有时,您需要根据计算的聚合值对要素进行符号化。 计算值的示例包括最小值、最大值、平均值或总计值等。 这些值是根据一组聚合值的属性进行计算的。
时态数据应用情景
对具有聚合值的数据进行符号化主要在两种情景中有用。
具有时间序列的站点数据
此类数据在固定位置上的量会随时间发生改变。 在这些位置上,随着时间流逝会定期或不定期地对要素进行观察、收集或预测。 示例包括在气象站或沿河流的监测站所测量的温度、降雨量、水位、盐度以及排放情况。
您可能想要按七月份全部降雨量或全年的最高或最低温度将气象站要素符号化。 要用此方法对数据进行可视化,需要对数据进行模拟以便固定位置可以存储在要素类中,且观测数据可以与日期时间属性一同存储在相关的表中。
具有时间戳的稀疏数据
这些要素代表了发生在单个时间点的事件。 示例包括龙卷风的位置、客户地址、医院收治的患者及犯罪地点。
您可能想要显示龙卷风造成的损失总量、总的购买量或聚合在面要素(例如省、区或其他行政边界)中的总患者数。 要用此方法对数据进行可视化,需要对数据进行模拟以便位置可以存储在具有日期时间属性的要素类中。
准备用于聚合显示的数据
要显示具有聚合结果的要素,应考虑以下几点:
- 聚合类型 - 确定要显示总数、最小值、最大值、平均值还是其他一些指标。
- 显示要素 - 确定哪些要素显示聚合结果。 这些与具有测量过的观察值的要素可能相同也可能不同。 例如,您可以显示每个气象站的年度总降雨量,还可以根据县或流域边界显示年度总降雨量(按每个气象站点要素测定)。
- 查询参数:
- 时间 - 确定要显示聚合结果的时间范围和时间间隔。 使用时间滑块可以对这些参数进行动态设置。 例如,对于日常的聚合结果,可将时间滑块上的时间范围和时间间隔设置为一天。
- 范围 - 您可能只想要聚合要素子集的结果。 例如,要聚合 0 到 50 米之间的盐度以及 50 到 75 米之间的盐度,可使用范围参数和范围滑块。
- 查询过滤器 - 要通过聚合每个选区的犯罪类型查看犯罪数据中的模式,可使用离散参数构建查询过滤器。
聚合结果示例
假设存在一个名称为 weather_stations 的要素类,其中存储了气象站的位置。 每个气象站要素都可通过存储在 station_id 字段中的值进行唯一识别。 该字段用于将气象站与名称为 observed_rainfall 的表中的相关观测记录链接起来。 该表记录了同一位置随时间变化而收集到的降雨量观测结果。 其中包括链接到气象站的要素类的 station_id 字段、存储每天降雨量(单位为厘米)的 rainfall_cm 字段以及存储降雨发生日期的 collection_date 字段。
利用查询图层参数动态计算聚合结果
其目的是计算每个气象站任何给定时期内(例如一个月、一年或任何自定义的时间范围)的总降雨量,并将气象站按该时期内计算的总降雨量进行符号化。 有两种方法可实现此目的。
第一种方法是通过定义查询图层参数使用以下简单或高级方法动态计算聚合结果。 第二种方法涉及使用地理处理工具或数据库函数预先计算结果。
运行“创建聚合查询图层”地理处理工具
可运行创建聚合查询图层工具来构建查询图层并定义查询参数以显示结果。 两种方法中此方法更加灵活,可确保始终显示最新结果。 该工具使用数据库 SQL 聚合函数和连接功能来汇总、聚合和过滤信息。
创建聚合查询图层工具允许在查询图层上启用时间以动态查看不同时间段,无需预定义每个所需的时间范围并计算其结果。
- 打开地图后,在分析选项卡的地理处理组中,单击工具 。
- 在地理处理窗格的工具箱选项卡中,单击数据管理工具 > 图层和表视图 > 创建聚合查询图层。 单击该工具将其打开。
- 按照示例情景,如下设置工具属性:
- 在参数选项卡上,将目标要素类参数设置为 weather_stations 要素类。
- 将 observed_rainfall 设置为汇总表参数。
- 将目标和相关连接字段设置为 station_id,然后输入输出图层名称。
- 选择 SUM 作为汇总字段聚合类型。 在字段名称下,选择 rainfall_cm。
- 在参数定义下,选择范围作为参数类型,然后指定名称,例如 timeWindow。 此设置可在查询图层上启用时间。
- 将字段或表达式参数定义为 collection_date 字段。
- 将数据类型参数指定为日期。
- 根据需要查看并设置任何其他参数。 根据上述选择,系统会自动设置某些参数。
- 运行该工具。 时间感知型查询图层即会添加到地图和内容窗格。
- 打开查询图层的属性表。 名为 SUM_rainfall_cm 的附加字段用于显示使用所有记录的总降雨量。
可启用时间滑块并导航到任何时间范围。 导航时,将重新计算地图的当前时间范围的值。 也可以选择使用属性符号化并标注气象站点要素。 要了解有关此工具的详细信息,请参阅创建聚合查询图层。
手动构建查询图层
在某些情况下,如果查询使用高级关键字或参数,则可能需要手动构建查询图层。 下面是其中的一些示例:
- 预定义的离散参数,例如 view_scale 和 view_extent
- 具有多个连接或外部连接的 SQL 查询
这种方法也有一些缺点。 其中包括以下内容:
- 由于每次使用地图导航、使用时间滑块或打开属性表时都会计算聚合结果,数据库可能会产生额外的负载。 如果数据集较小,或时间窗返回相对较小的子集,甚至是大型数据集,可忽略此类额外负载。
- 该方法要求将数据存储在企业级数据库中。 文件地理数据库或 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 字段。
- 使用连接字段工具或添加连接工具将汇总表中的记录连接到要素图层。
- 显示具有定义查询的地图中的图层,以显示特定月份的结果。 例如,要仅显示五月份的结果,使用 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
- 如果数据库是地理数据库,将表注册到地理数据库可获得最佳性能,还可将表连接到要素图层。
在内容窗格中单击要素图层。 在要素图层选项卡的数据选项卡的关系组中,单击连接,然后单击添加连接。
- 如果不是地理数据库,您必须从下列策略中选择一个策略:
- 在将保存几何的表与新创建的汇总表连接在一起的数据库中创建一个视图。
- 创建查询图层,然后定义查询图层的源中的连接。
- 显示具有定义查询的地图中的图层,以显示特定月份的结果。 例如,要仅显示五月份的结果,使用 Month = 5 的定义查询。
提示:
您可以使用 Windows 计划程序来计划任务,使其定期运行来预先计算结果。