向网络数据集添加时区
当车辆穿越一个时区时,当前时间(日期也有可能)会改变。如果未在跨多个时区的网络数据集上配置时区,则分析中的当前时间值可能会造成混乱。而且,如果忽略了时区,已启用流量的网络数据集可能会返回错误的行驶时间。为了避免这些问题,您可以对您的网络数据集进行设计来协调时区。
本主题解释了必须在网络数据集中配置时区的原因,并介绍了使用时区网络属性配置时区的方法。
网络数据集如果完全位于一个时区内,则不必配置时区。而且,如果您从不使用以时间作为阻抗的起始时间执行网络分析,也不必配置时区。
时区与网络分析相关的原因
为了更好地理解在跨时区的已启用流量的网络数据集上设置时区属性的重要性,我们假设在 8:13 a.m. 时路径分析遍历了两条相邻边(从东部时区的一条边开始,然后沿中部时区的另一条边继续)。如果未配置时区属性,则网络数据集将忽略时差,并且只基于一个时区得到边的行驶时间。这意味着没有得到中部时区 7:13 a.m. 时边的行驶时间,相反,可能得到 8:13 a.m. 或当天其他时间的行驶时间,这取决于默认的时区。
但是,如果正确配置了时区,则东部时区中边的成本会按当地时间 8:13 a.m. 计算,中部时区中边的成本会按当地时间 7:13 a.m. 正确计算。这样,就会保持已启用流量的网络数据集中行驶时间的准确性。而且,方向会显示时区变化。
无论跨时区的网络数据集是否已启用流量,配置时区属性后,输入和解释当前时间属性(例如时间窗和到达或离开时间)都会变得更加容易,因为它们的时间值始终指当地时间。例如,假设您添加两个停靠点(一个位于东部时区,另一个位于中部时区),并且希望将它们的时间窗都设置为当地时间 8:00 a.m. 至 9:00 a.m.。如果未配置时区,则必须手动将一个或两个时间窗的值转换为默认时区。另外,在网络数据集上配置时区时,输入的时间会自动设置为基础边的当地时间,并且 Network Analyst 会从内部协调时间转换。
网络数据集协调时区的方式
时区相对于通用协调时间 (UTC) 会有时态偏移。当地规则可指定 UTC 偏移量;是否遵守夏令时;如果遵守,夏令时的偏移和日期范围。这些规则可能会经常变化;记住所有当前和过去的规则相当困难。幸运的是,Windows 操作系统的后续版本通过 Windows 更新可以为您的计算机提供世界上任意时区的变化,这样就解决了这个问题。时区和时区的规则存储在 Windows 注册表中。
Network Analyst 会从 Windows 注册表中检索时区的 UTC 偏移和夏令时规则。以下概念图显示了它的基本工作原理。
边源要素上的 TimeZoneID 字段表明要素所在的时区。TimeZoneID 值是时区表的外键,它与网络数据集位于相同的工作空间内,并存储时区列表。时区表中的 MSTimeZone 字段也是一个外键,但它是 Windows 注册表中注册表项的外键。(将整数值视为标识符和外键更普遍;然而,注册表使用文本来识别时区。)注册表可向 Network Analyst 提供有关夏令时的 UTC 偏移和任意日期范围的信息。
如图所示,边源要素类上需要有时区表和 TimeZoneID 字段,才能在网络数据集中配置时区。完成这些设置后,即可创建时区网络属性。
创建时区表
要自动创建和填充时区表,请运行“填充时区表”工具,此工具可从 ArcGIS 资源中心下载。或者,可按照以下步骤手动创建时区表。对于以下这一序列步骤以及后续内容,都假设您对创建和编辑 ArcGIS 中的表非常熟悉。
- 在与网络数据集相同的工作空间中创建表,然后为其命名,例如 TimeZones。
如果工作空间是地理数据库,则需要在地理数据库级别创建表,即使网络数据集需要位于更深的级别(即要素数据集)中。
- 将文本属性添加到表中,然后将其命名为 MSTimeZone。警告:
文本属性的名称必须为 MSTimeZone,因为它是 Network Analyst 的关键字。
属性的长度要与您添加到表中的最长时区的名称相符。到 2010 年 3 月,Windows 注册表中的最长时区名称包含 61 个字符。
- 或者,再添加一个文本字段来描述时区。
有关添加此类描述性字段的好处的详细信息,请参阅下一步骤。
- 创建表后,需要用时区名称填充 MSTimeZone 字段。可手动或通过编程方式完成此操作。
如果希望通过编程方式完成此操作,则首先在 ArcGIS 资源中心搜索 TimeZoneFactory 对象。或者,按照以下细分步骤在 Windows 注册表中手动查找这些值。
- 打开注册表编辑器。
在 Windows 7 或 Vista 中,单击开始,在开始搜索文本框中输入 regedit,然后按 ENTER。
在 Windows XP 中,单击开始 > 运行打开运行 对话框。在打开文本框中输入 regedit,然后按 ENTER。
- 注册表中的项与文件夹很相似。展开以下项:HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > WindowsNT > CurrentVersion > Time Zones。
一长列子项会出现在 Time Zones 项中。列表中的每个项表示一个时区。在新时区表的 MSTimeZone 属性下输入的值必须与这些项名称的拼写完全匹配,求解时 Network Analyst 才可以在注册表中查找到它们。
警告:确保不对注册表进行任何更改,因为这可能会使系统崩溃。
要复制名称,可单击某时区项,然后按 F2 进入编辑模式。按 CTRL+C 可将名称复制到剪贴板。按 ESC 可退出编辑模式。(如果想要以后粘贴名称,请按 CTRL+V。)
在注册表编辑器 中选择某项后,它的值会出现在注册表编辑器 窗口的其他窗格中。这些值组合在一起可描述时区,而且 Network Analyst 可使用这些值确定合适的时间。虽然 Network Analyst 不使用 Display 值,但是,您也可以使用该信息查看该时区与 UTC 的时态偏移以及有关时区使用位置的一些地理信息。
- 在时区表中为每个要在网络数据集中使用的时区创建一条记录。对于每条记录的 MSTimeZone 字段,当它出现在注册表编辑器 中时,输入或粘贴时区的名称。
例如,如果您的网络数据集包含连续的美国本土,则您的表中将包含五个 MSTimeZone 值,如下所示。(Display 字段可选。)
ObjectID
MSTimeZone
Display
1
东部标准时间
(UTC-05:00) 东部时间(美国和加拿大)
2
中部标准时间
(UTC-06:00) 中部时间(美国和加拿大)
3
山地标准时间
(UTC-07:00) 山地时间(美国和加拿大)
4
美国山地标准时间
(UTC-07:00) 亚利桑那
5
太平洋标准时间
(UTC-08:00) 太平洋时间(美国和加拿大)
提示:在此处添加 Display 字段是为了更好地描述 MSTimeZone 值。它所包含的信息是从注册表中时区项的 Display 值中复制而来。
虽然 Network Analyst 不需要表中存在类似 Display 这样的字段,但是添加它可以使您和其他用户更加轻松地识别 MSTimeZone 表示的时区。例如,MSTimeZone 的“山地标准时间”和“美国山地标准时间”值看起来非常相似。然而,从 Display 字段中,您可以看到亚利桑那时区表示为“美国山地标准时间”。(亚利桑那需要一个独立的时区标识符,因为与山地时间的其他州不同,它不遵守夏令时。)
- 打开注册表编辑器。
此时,您的表中就会包含一个名称为 MSTimeZone 的字段。下一步是在每个边源要素与表中的正确时区之间建立相关性。
添加 TimeZoneID 字段
每个边源要素需要与一个时区之间精确关联。
- 将名为 TimeZoneID 的整型字段添加到每个边源要素类中。虽然可以为该字段指定任意名称,但通常会使用 TimeZoneID。
- 计算边源要素的值。
TimeZoneID 值是外键,它可在要素与您刚刚创建的时区表中的记录之间建立相关性。因此,在上例中,ObjectID 5 表示“太平洋标准时间”,该时区中的所有边源要素的 TimeZoneID 值都应为 5。如果“太平洋标准时间”恰巧有不同的 ObjectID 值,则需要用该值填充 TimeZoneID。
添加时区网络属性
以下步骤说明了在网络数据集上创建时区网络属性的方法。该属性可在边源要素类和时区表二者的 TimeZoneID 字段之间建立关系。
-
在网络数据集属性 对话框或新建网络数据集 向导的属性选项卡上,单击添加。
将打开添加新属性 对话框。
- 输入属性的名称,例如 TimeZone。
- 从使用类型列表中选择描述符。
-
从数据类型列表中选择整型。
-
单击确定。
属性将添加到属性列表。
-
右键单击新属性,单击使用时区,然后单击您创建的时区表的名称。
中心有 T 字样的绿色圆出现在属性名称的左侧,表明它是时区属性。
- 双击时区属性名称可打开赋值器 对话框。
-
对于每个边源,设置字段赋值器以从源要素类中读取 TimeZoneID 值。
在下例中,从“街道”源要素类的 TimeZoneID 字段中读取值的字段赋值器将被分配“自-至”和“至-自”两个方向。
-
单击确定。
赋值器 对话框关闭。完成新建网络数据集 向导或关闭网络数据集属性 对话框之后,您可以构建网络数据集以添加新的时区字段。