向网络数据集添加时区
当车辆穿越一个时区时,它的当前时间(包括当前日期)会发生改变。如果未在横跨多个时区的网络数据集上配置时区属性,则分析中的当前时间值可能会发生混乱。而且,如果忽略了时区,启用流量的网络数据集可能会返回错误的行驶时间,而实时流量的网络数据集可能会渲染该错误时间的流量状况。为避免出现这些问题,可向网络数据集添加属性来控制时区。
本主题将解释在网络数据集上配置时区的重要性,并将介绍使用描述符网络属性来配置时区的方法。
始终需要在启用实时流量的网络数据集上配置时区属性;然而,并不总是需要在不支持实时流量的网络数据集上配置时区属性。例如,如果不支持实时流量的网络数据集整个都位于一个时区内,则无需配置时区。而且,如果您从不使用基于时间的阻抗(配合起始时间)来执行网络分析,则也无需配置时区。
时区与网络分析相关的原因
为了更好地理解在一个横跨多时区且启用了流量的网络数据集上设置时区属性的重要性,我们假定在上午 8:13 时,路径分析遍历了两条相邻边,即从东部时区的一条边开始,然后沿中部时区的另一条边继续。如果未配置时区属性,则网络数据集将忽略时差,并且只基于一个时区得到边的行驶时间。这意味着将不能得到中部时区上午 7:13 时边的行驶时间,相反,则可能得到上午 8:13 或当天其他时间的行驶时间,这取决于默认的时区。
但是,如果正确配置了时区,则东部时区中边的成本会按当地时间上午 8:13 进行计算,而中部时区中边的成本会按当地时间上午 7:13 正确计算。这样,就会保持启用流量的网络数据集中行驶时间的准确性。而且,方向窗口中会显示时区变化。
无论跨时区的网络数据集是否已启用流量,配置时区属性后,对当前时间属性(例如时间窗和到达或离开时间)的输入和解释都会变得更加容易,因为它们的时间值始终参考的是当地时间。例如,假定您添加了两个停靠点(一个位于东部时区,另一个位于中部时区),并且希望将它们的时间窗都设置为当地时间 8:00 a.m. 至 9:00 a.m.。如果未配置时区,则必须手动将一个或两个时间窗的值转换为默认时区。反之,如果在网络数据集上配置了时区属性,输入的时间会自动设置为基础边的当地时间,而且 Network Analyst 会自动控制时间的转换。
网络数据集控制时区的方式
时区相对于协调世界时间 (UTC) 会有一个时态偏移。当地规则指定了 UTC 偏移量;是否遵守夏令时;如果遵守,夏令时的偏移和日期范围。这些规则可能会经常变化;记住所有当前和过去的规则相当困难。幸运的是,Windows 操作系统的后续版本通过 Windows 更新可以为您的计算机提供世界上任意时区的变化,这样就解决了这个问题。时区和时区的规则存储在 Windows 注册表中。
ArcGIS 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
显示
1
Eastern Standard Time
(UTC-05:00) 东部时间(美国和加拿大)
2
Central Standard Time
(UTC-06:00) 中部时间(美国和加拿大)
3
Mountain Standard Time
(UTC-07:00) 山地时间(美国和加拿大)
4
US Mountain Standard Time
(UTC-07:00) 亚利桑那
5
Pacific Standard Time
(UTC-08:00) 太平洋时间(美国和加拿大)
提示:在此处添加 Display 字段是为了更好地描述 MSTimeZone 值。它所包含的信息是从注册表中时区项的 Display 值中复制而来。
虽然 Network Analyst 不需要表中存在类似 Display 这样的字段,但是添加它可以使您和其他用户更加轻松地识别 MSTimeZone 表示的时区。例如,MSTimeZone 的“Mountain Standard Time”和“US Mountain Standard Time”值看起来非常相似。然而,从 Display 字段中,您可以看到亚利桑那时区表示为“US Mountain Standard Time”。(亚利桑那需要一个独立的时区标识符,因为与其他州的山地时间不同,它不遵守夏令时。)
- 打开注册表编辑器。
此时,您的表中就会包含一个名称为 MSTimeZone 的字段。下一步是在每个边源要素与表中的正确时区之间建立关联性。
向边源添加 TimeZoneID 字段
每个边源要素需要与一个时区精确关联。
- 将名为 TimeZoneID 的整型字段添加到每个边源要素类中。虽然可以向此字段分配任意的名称,但仍建议使用 TimeZoneID。
- 计算边源要素的值。
TimeZoneID 值是外键,它可在要素与您刚刚创建的时区表中的记录之间建立关联性。因此,在上例中,ObjectID 5 表示“Pacific Standard Time”,该时区中的所有边源要素的 TimeZoneID 值都应为 5。如果“Pacific Standard Time”恰巧有不同的 ObjectID 值,则需要用该值填充 TimeZoneID。
向网络数据集添加时区属性
以下步骤说明了在网络数据集上创建时区网络属性的方法。该属性可在边源要素类和时区表二者的 TimeZoneID 字段之间建立关系。
只要您在街道要素类上设有 TimeZoneID 字段并已正确配置时区表,新建网络数据集 向导就将自动为您创建此属性。
-
在网络数据集属性 对话框或新建网络数据集 向导的属性选项卡上,单击添加。
打开添加新属性 对话框。
- 输入属性的名称,例如 TimeZone。
- 从使用类型列表中选择描述符。
-
从数据类型列表中选择整型。
-
单击确定。
属性将添加到属性列表。
-
在工作空间中,右键单击新属性,单击关联时区表,然后单击时区表的名称。
中心有 T 字样的绿色圆出现在属性名称的左侧,表明它是时区属性。
- 双击时区属性名称可打开赋值器 对话框。
-
对于每个边源,设置字段赋值器以从源要素类中读取 TimeZoneID 值。
在下例中,从“街道”源要素类的 TimeZoneID 字段中读取值的字段赋值器将被分配“自-至”和“至-自”两个方向。
-
单击确定。
赋值器 对话框关闭。完成新建网络数据集 向导或关闭网络数据集属性 对话框之后,您可以构建网络数据集以添加新的时区字段。
跨越多个时区执行网络分析
如果网络位置有时间窗,您所输入的时间值为指定的本地时区,即网络位置的基础边要素的时区。
对于最初与网络上的位置可能不相关联的对象,要区别处理车辆配送的时间窗。
- 对于 VRP 路径起始所在的时间窗,可以通过 EarliestStartTime 和 LatestStartTime 属性来指定。这些属性值的时区取自路径的起始站点所处的边。
- 中断包含一个时间窗,您可通过 TimeWindowStart 和 TimeWindowEnd 来指定该时间窗。中断与路径相关联,且时区取自路径的起始站点所处的边。