ArcGIS更改时区
网络数据集控制时区的方式
时区相对于协调世界时间 (UTC) 会有一个时态偏移。当地规则指定了 UTC 偏移量;是否遵守夏令时;如果遵守,夏令时的偏移和日期范围。这些规则可能会经常变化;记住所有当前和过去的规则相当困难。幸运的是,Windows 操作系统的后续版本通过 Windows 更新可以为您的计算机提供世界上任意时区的变化,这样就解决了这个问题。时区和时区的规则存储在 Windows 注册表中。
ArcGIS Network Analyst extension 会从 Windows 注册表中检索时区的 UTC 偏移和夏令时规则。下面的概念图表显示了它的基本工作原理。
边源要素上的 TimeZoneID 字段可指示要素所在的时区。TimeZoneID 值是时区表的外键,时区表与网络数据集位于同一工作空间内,并存储了一个时区列表。时区表中的 MSTimeZone 字段也是一个外键,但它是 Windows 注册表中注册表项的外键。(将整数值视为标识符和外键更普遍;不过,注册表则使用文本来识别时区。) 注册表可向 Network Analyst 提供有关夏令时的 UTC 偏移和任意日期范围的信息。
在此逻辑示意图中,TimeZoneID 值为 2 的街道将突出显示,并与 TimeZones 表中的中部标准时间记录相关联。然后,MSTimeZone 值会在街道与注册表中 Central Standard Time 键之间建立关联关系。根据上述关联关系,Network Analyst 就可以确定这些街道从十一月至三月的 UTC 偏移为 -6 小时,从三月至十一月的 UTC 偏移则为 -5。
如图所示,边源要素类上需要有时区表和 TimeZoneID 字段,才能在网络数据集中配置时区。完成这些设置后,即可创建时区网络属性。
创建时区表
可按照以下步骤手动创建时区表。对于以下这一序列步骤以及后续内容,假定您对 ArcGIS 中的表的创建和编辑都非常熟悉。
- 在网络数据集所在的工作空间中创建表文件,然后为其命名,例如 TimeZones。
如果此工作空间是一个地理数据库,则即使网络数据集需要位于更深的级别(即要素数据集)中,也需要在地理数据库级别创建表文件。
- 向表文件中添加一个文本属性,并将其命名为 MSTimeZone。
警告:
文本属性的名称必须为 MSTimeZone,因为它是 Network Analyst 的关键字。
属性的长度需要与您添加到表中的最长时区的名称相符。到 2010 年 3 月,Windows 注册表中的最长时区名称包含 61 个字符。
- 根据需要,可再添加一个文本字段来描述时区。
有关添加此类描述性字段的好处的详细信息,请参阅下一步骤。
- 表文件创建后,您需要用时区名称填充 MSTimeZone 字段。
按照以下步骤在 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
东部标准时间
(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 的“Mountain Standard Time”和“US Mountain Standard Time”值看起来非常相似。然而,从 Display 字段中,您可以看到亚利桑那时区表示为“US Mountain Standard Time”。(亚利桑那需要一个独立的时区标识符,因为与其他州的山地时间不同,它不遵守夏令时。)
- 打开注册表编辑器。
此时,您的表中就会包含一个名称为 MSTimeZone 的字段。下一步是在每个边源要素与表中的正确时区之间建立关联性。
向边源添加 TimeZoneID 字段
每个边源要素需要与一个时区精确关联。
- 将名为 TimeZoneID 的整型字段添加到每个边源要素类中。虽然可以向此字段分配任意的名称,但仍建议使用 TimeZoneID。
- 计算边源要素的值。
TimeZoneID 值是外键,它可在要素与您刚刚创建的时区表中的记录之间建立关联性。因此,在上例中,ObjectID 5 表示太平洋标准时间,该时区中的所有边源要素的 TimeZoneID 值都应为 5。如果太平洋标准时间恰巧具有不同的 ObjectID 值,则需要用该值填充 TimeZoneID。
向网络数据集添加时区属性
以下步骤说明了在网络数据集上创建时区网络属性的方法。该属性可在边源要素类和时区表二者的 TimeZoneID 字段之间建立关系。
只要您在街道要素类上设有 TimeZoneID 字段并已正确配置时区表,新建网络数据集向导就将自动为您创建此属性。
- 在网络数据集属性对话框或新建网络数据集向导的属性选项卡上,单击添加。
打开添加新属性对话框。
- 输入属性的名称,例如 TimeZone。
- 从使用类型列表中选择描述符。
- 从数据类型列表中选择整型。
- 单击确定。
属性将添加到属性列表。
- 在工作空间中,右键单击新属性,单击关联时区表,然后单击时区表的名称。
中心有 T 字样的绿色圆出现在属性名称的左侧,表明它是时区属性。
- 双击时区属性名称可打开赋值器对话框。
- 对于每个边源,设置字段赋值器以从源要素类中读取 TimeZoneID 值。
在下例中,从“街道”源要素类的 TimeZoneID 字段中读取值的字段赋值器将被分配“自-至”和“至-自”两个方向。
- 单击确定。
赋值器对话框关闭。完成新建网络数据集向导或关闭网络数据集属性对话框之后,您可以构建网络数据集以添加新的时区字段。
跨越多个时区执行网络分析
如果网络位置有时间窗,您所输入的时间值为指定的本地时区,即网络位置的基础边要素的时区。
注:
对于最初与网络上的位置可能不相关联的对象,要区别处理车辆配送的时间窗。
- 某个 VRP 路径起始所在的时间窗可通过 EarliestStartTime 和 LatestStartTime 属性来指定。这些属性值的时区取自路径的起始站点所处的边。
- 中断包含一个时间窗口,您可通过 TimeWindowStart 和 TimeWindowEnd 来指定该时间窗口。中断与路径相关联,且时区取自路径的起始站点所处的边。