历史流量数据
流量会影响行驶途中所要花费的时间 - 道路越拥挤,途中所要花费的时间就越长。如果您正要从一个地方到达另一个地方却没有考虑流量的问题,则您所预计的行驶时间和抵达时间可能会与实际时间相差很远。并且,您可能会错过因避开速度较慢、较拥挤的道路而节省时间的行驶路线机会。
以下两个图形说明的是,由于现行流量模式的改变,每天不同时段的最快路径是如何随之改变的。
通过 ArcGIS Network Analyst 扩展模块,可使用历史流量信息来构建在网络元素上行驶的基于时间的成本模型。这样,您所预期的行驶时间和抵达时间就会更加可靠,并且您实际所花费的行驶时间可能会少于在忽略流量模式情况下所花费的行驶时间。
本 Network Analyst 教程数据包含具有历史流量数据的旧金山地理数据库。研究 SanFrancisco.gdb 中的“街道”要素类、DailyProfiles 表以及 Streets_DailyProfiles 表,可增强您对该主题的理解。如果已安装该教程数据,则此地理数据库的默认文件位置如下所示:
C:\ArcGIS\ArcTutor\Network Analyst\Tutorial
- 历史流量仅能在地理数据库中进行配置,而不能在基于 shapefile 的网络数据集中进行配置。
- 在 ArcGIS 10 版本中,仅路径分析图层和多路径配送 (VRP) 分析图层支持流量数据;其他网络分析图层会在今后的 ArcGIS 版本中得到支持。
创建可在 ArcGIS Network Analyst 中使用的流量数据
即使您可从第三方获取数据,但最好也要了解历史流量数据的创建过程,以便您可在网络数据集中对其进行合理配置。该部分概述了 Network Analyst 所采用的模型。
由于流量数据可捕捉到行驶时间的持续起伏情况,所以某条边的每一侧都会根据每天时间的不同而导致成本随之变化。这与典型的成本属性不同,其每条边的一侧仅允许使用一个值。
对一天之中不断变化的行驶时间成本进行建模时,可将一天分为多个离散时间间隔(如,以一小时为一个时间间隔),然后将各行驶时间存储为与每个间隔相对应的单独成本属性。在一周的时间范围内,若时间间隔为一小时,则每条边均需要 168 个成本属性来存储每小时的平均行驶时间。因为在一小时内流量会显著改变,所以一小时的时间间隔所提供的分辨率较为粗糙。您可以通过缩短时间段(例如缩短到五分钟)来优化分辨率。虽然此举会提供较优质的分辨率,但是将需要 2016 个成本属性。存储所有这些唯一值会占用很大的空间,特别是对于大型网络而言。此外,由于许多街道在一天中会产生相同的成本,所以存在许多不必要的重复数据。鉴于上述原因,在许多情况下,这种建模方式是不可行的。
ArcGIS 使用规范化模型将流量数据最小化,而不是存储每个要素中的所有流量信息。不是存储每个要素的 168 或 2016 个成本属性,而是创建相关表来保存该信息。该表中的每一行都包含一天中各时间间隔的行驶时间。一行对应一个流量剖析,表示行驶时间在一天之中的变化过程。例如,如果许多次级、35 英里/小时的街道,其一天中的行驶速度变化一致,则可在流量剖析表中创建一行,来表示这些动态变化,并使所有这些街道都指向该行或该流量剖析。下面您将看到进一步的优化流量剖析,以便在一天中,即使道路的速度发生变化,但只要遵循同一流量模式,也可参照相同的流量剖析。
为更好地理解该流量模型,假设在一周中(从星期一开始),您需要使用该模型来记录和存储单向街段的行驶时间。首先,您要确定自由流动的行驶时间,该时间是在无其他任何流量阻碍车辆移动的情况下,某车辆穿过某条街段所花费的时间。您可选择确定自由流动速度所使用的方法,不过该速度通常是线段长度与速度限制的函数;或者在没有其他车辆时,通过观测某些车辆的平均行驶时间也可获得该速度。假设您选择将观测到的车辆平均速度作为自由流动速度,并将自由流动的行驶时间规定为 10 秒。
现在,您可以按照相等的时间间隔或时间段进行全天观测。您选择的时间间隔确定了您数据的时态分辨率。您可选择时间间隔为 1 小时、10 分钟等。假设您选择以 5 分钟为时间间隔。您的观测值将以自由流动行驶时间的倍数来记录。例如,在早晨 8:00,您观测到车辆花费 26 秒穿过该路段。这是自由流动行驶时间的 2.6 倍。在下午 5:00,车辆的平均行驶时间为 13 秒,它是自由流动行驶时间的 1.3 倍。在夜里 11:00,道路上几乎没有车辆,它们的平均行驶时间为 10 秒,这与自由流动行驶时间相等 - 该倍数为 1。
完成当天的观测后,需要参照流量剖析表,然后选择一种与全天观测的相对行驶时间变化最匹配的流量剖析。
可选择流量剖析 16(如下图表所绘)来表示每个星期一的路段行驶时间。
某剖析中的当日时间通常表示本地时间,即,引用边所处的时区为本地时区。因此,引用剖析 16 的洛杉矶某边在太平洋时间早晨 8:00 时的行驶时间是自由流动时间的 2.6 倍。指向相同剖析的纽约某边将存在某行驶时间是东部时区 8:00 a.m. 的自由流动速度所需时间的 2.6 倍。时区问题将在本主题中稍后部分中予以讨论。
您或许可选择任意数量的流量剖析。当您使用较多的流量剖析时,可能会更精确地对行驶时间进行建模。不过,如果您使用较少的流量剖析,即可减少数据所需的空间。目的是在精度与空间需求之间寻找一个良好的平衡。对于大型街道网络,随处可见数十个甚至上百个流量剖析,这十分常见。
既然您已选择了一个针对星期一的流量剖析,那么您就需要针对一周内的其余各天重复该过程。下面是对该过程的回顾:
- 观测或计算街段上的自由流动行驶时间。(无需重复此步骤,因为无论是星期几,自由流动行驶时间都相同。)
- 观测全天相等时间间隔内的平均行驶时间。
- 将行驶时间转换为自由流动行驶时间的倍数。
- 选择一个流量剖析来表示一周内该天的街段流量。
您要确定该路段的流量剖析 16 是否也适用于所有其他工作日。您通常要进行此确定,因为在所有工作日中,常规流量模式经常相同。不过您很快就会发现,存在各工作日使用不同的典型剖析的情况,例如:星期一、星期二和星期三使用相同的剖析,而星期四和星期五则共用另一不同的剖析。
因为在您的路段上,星期六及星期日的流量低而平稳,因此可选择“流量剖析 10”(见下图)来表示周末的行驶时间。
接下来,在表中存储自由流动行驶时间以及街段与流量剖析之间的关系:“街道 - 流量剖析连接表”。下一部分将查看该表及其他所需输入。
在地理数据库中存储数据及关系
如果您要创建一个包含历史流量数据的网络数据集,则在地理数据库中需要一个或多个线要素类以及两个表。线要素类表示街道,它必须存储在一个要素数据集中。流量剖析存储在其中一个表中,街道与速度曲线之间的关系存储在另一个表中。以下各部分介绍了在网络数据集中设置历史流量所需的这些项目及字段。
只要在表中存储唯一标识符的值,即可建立街道与速度曲线之间的关系;您无需再创建任何关系类。
街道要素类
各街道要素都有一个唯一标识符:ObjectID 值。“街道流量剖析连接表”通过唯一标识符在街道与其各种流量剖析之间建立关系。
其他字段或许可在设置历史流量时派上用场。以下列出了其他字段,稍后将在本主题中予以详细描述。
字段 |
字段名称示例 |
描述 |
---|---|---|
时间中立行驶时间 |
FT_Minutes TF_Minutes |
以下情况可使用该字段创建一个网络成本属性
|
工作日行驶时间 |
FT_WeekdayMinutes TF_WeekdayMinutes |
当某街段不存在与某工作日相关联的流量剖析时,则可使用该字段创建一个网络成本属性 (时间中立行驶时间也经常用作工作日特定的行驶时间) |
周末行驶时间 |
FT_WeekendMinutes TF_WeekendMinutes |
当某街段不存在与星期六或星期日相关联的流量剖析时,则可使用该字段创建一个网络成本属性 |
时区 |
TimeZoneID |
当某网络覆盖多个时区时,则需要该字段来创建一个时区网络属性 |
流量剖析表
某流量剖析表中的每条记录都包含唯一的标识符和多个用于在每天不同时间存储自由流动时间倍数的字段。因为要将每天的时间分割为多个必须相等的时间间隔或时间段,因此将 24 小时分割为等时间间隔。例如,如果某时间段的长度为五分钟,则有 288 个字段(12:00–12:05 a.m. 对应一个字段,12:05–12:10 a.m. 对应一个,依此类推)。
在 Network Analyst 教程数据中,旧金山地理数据库包含以五分钟为时间段的全天剖析。TimeFactor_0000 字段包含午夜到 12:05 a.m. 的自由流动倍数。TimeFactor_1140 字段包含 11:40 a.m. 到 11:45 a.m. 的倍数。当街道要素与该剖析相关时,即可获取全天任意时间的预期行驶时间。例如,如果街道与剖析 16 相关(如下图所示),您就可将街道自由流动行驶时间与剖析的 TimeFactor_1140 值 (1.124859) 相乘,计算出 11:41 a.m. 时的预期行驶时间。
个人地理数据库将表的最大值限制为 255 个字段。一些 ArcSDE 地理数据库或许会在字段的数量方面有类似的限制。因此,您或许需要为您的数据留有余地,以减少流量剖析表中的字段数量。例如,如果您的流量剖析表将包含五分钟的时间间隔,并且被存储在一个个人地理数据库中,则该表需要至少 288 个字段,而这是无法实现的。此时,您可以改用文件地理数据库,因为它支持超过 65000 个字段,或者,您也可删除一些表示匀速行驶的时间间隔的字段(如,从午夜到 3:00 a.m.)。
街道-流量剖析连接表
“街道-流量剖析”连接表可以标识一周中每天街道的要素、自由流动行驶时间及其相关的剖析。下表列出了必填字段、字段名称示例、所允许的数据类型及简短描述:
字段 |
字段名称示例 |
数据类型 |
描述 |
---|---|---|---|
边要素类标识符 |
EdgeFCID 必须将该字段命名为 EdgeFCID。 |
长整型 |
标识用于存储街道要素的要素类。 |
边要素标识符 |
EdgeFID 必须将该字段命名为 EdgeFID。 |
长整型 |
标识街道要素。 |
边的起始位置 |
EdgeFrmPos 必须将该字段命名为 EdgeFrmPos。 |
双精度 |
与 EdgeToPos 结合使用,标识行驶方向或街道某侧。零表明由线要素的数字化方向定义其起始位置。一表明其另一侧位置。 例如:EdgeFrmPos 值为 0 及 EdgeToPos 值为 1 均标识线要素的右侧(假设右侧通行)。在相同记录中列出的流量剖析只表示街道右侧的流量。 任意小数值都指定了沿要素数字化方向的某个位置,因此,在融合各边之后,融合网络工具仍可保持正确的街道剖析。 |
边的终止位置 |
EdgeToPos 必须将该字段命名为 EdgeToPos。 |
双精度 |
与 EdgeFrmPos 结合使用,标识行驶方向或街道某侧。 |
基本行驶时间字段 |
FreeflowMinutes FreeflowSeconds |
浮点型或双精度 |
自由流动的行驶时间。 它可表示天数、小时数、分钟数或秒数。 |
星期日 ProfileID 字段 |
Profile_1 SundayProfile |
短整型或长整型 |
对于通过 EdgeFCID、EdgeFID、EdgeFrmPos 及 EdgeToPos 标识的街道部分,可最好地表示出星期日流量模式的剖析 ID。 |
星期一 ProfileID 字段 |
Profile_2 MondayProfile |
短整型或长整型 |
可最好地表示出星期一流量的剖析 ID。 |
星期二 ProfileID 字段 |
Profile_3 TuesdayProfile |
短整型或长整型 |
可最好地表示出星期二流量的剖析 ID。 |
星期三 ProfileID 字段 |
Profile_4 WednesdayProfile |
短整型或长整型 |
可最好地表示出星期三流量的剖析 ID。 |
星期四 ProfileID 字段 |
Profile_5 ThursdayProfile |
短整型或长整型 |
可最好地表示出星期四流量的剖析 ID。 |
星期五 ProfileID 字段 |
Profile_6 FridayProfile |
短整型或长整型 |
可最好地表示出星期五流量的剖析 ID。 |
星期六 ProfileID 字段 |
Profile_7 SaturdayProfile |
短整型或长整型 |
可最好地表示出星期六流量的剖析 ID。 |
如下图中的第一个图表所示,“街道-流量剖析”连接表的示例是标题为 Streets_DailyProfiles 的表。字段 PROFILE_1 表示星期日 ProfileID 字段;PROFILE_7 表示星期六 ProfileID 字段;PROFILE_2 到 PROFILE_6(未显示)表示星期一到星期五 ProfileID 字段。
请参见已选记录 (ObjectID 111)。它将一周内每天的剖析与街道要素(对象 ID 为 129)的“自-至”侧相关联。通过 EdgeFrmPos 及 EdgeToPos 值来标识街道的“自-至”方向,这两个值分别为零和一。流量剖析 12 表示星期日和星期六街道的“自-至”侧,因为 12 是 PROFILE_1 和 PROFILE_7 字段中的值。FreeflowMinutes 字段表明了在自由流动条件下,穿过“自-至”方向街道所需的时间。
现在查看前两条记录。第一条记录(对象 ID 109)存储“至-自”方向上街段的剖析 ID,第二条记录(对象 ID 110)则存储相反方向上相同街段的剖析 ID。这一点可以从 EdgeFCID 和 EdgeFID 值(二者的值相同)以及 EdgeFrmPos 和 EdgeToPos 值(二者的值相反)判断得知。另请注意,它们的星期日和星期六的剖析 ID 为零。这就意味着未收集这两天的数据或未选择这两天的剖析。当估算该边上的星期六或星期日历史行驶时间时,赋值器将需要回退到在边流量赋值器中定义的次级成本属性(稍后描述)。
在新建网络数据集向导中配置历史流量数据
在已收到或已创建历史流量数据之后,需要将该数据纳入到一个新的网络数据集中。这一过程是在新建网络数据集 向导中完成的。
- 您只能在创建过程中(而非创建结束后)对网络数据集中的流量数据进行配置。
在网络数据集创建过程中纳入历史流量数据有四个主要步骤:
- 配置两个历史流量表:
- 流量剖析表
- 街道 - 流量剖析连接表
- 最多创建四个网络成本属性:
- 历史行驶时间成本属性
- 工作日的回退行驶时间成本属性
- 周末的回退行驶时间成本属性
- 时间中立成本属性
- 为以上成本属性配置赋值器。
- 如果您的网络覆盖多个时区,则创建一个时区属性。
以下各小节描述了这些步骤。
历史流量表
如以下页面所示,新建网络数据集 向导会询问您是否要通过网络数据集来使用历史流量。单击是,即可指定与“流量剖析”表和“街道-流量剖析”连接表有关的属性。
网络数据集中的流量剖析表
下表列出了您需要为“流量剖析表”配置的属性。
属性 |
描述 |
---|---|
表 |
包含流量剖析的表的名称。 |
第一个时间片字段 |
该属性结合“最后一个时间片字段”,指定一个时间范围。无论何时,在该范围之外计算当日时间的边,其倍数都假设为一。当基本没有流量时,该假设可加快查找当日各时间的成本。 |
最后一个时间片字段 |
详情请参阅“第一个时间片字段”。 |
每个时间片的分钟数 |
您的流量剖析表必须按照一整天时间分为等时间间隔。该属性指定以分钟为单位的间隔长度。 |
第一个时间片的起始时间 |
该属性标识出以“第一个时间片字段”为开始时间所表示的当日时间。 例如,“第一个时间片字段”设置为 TimeFactor_0400(从 4:00 a.m. 开始),因此,“第一个时间片的起始时间”被设置为 4 AM。 |
最后一个时间片的结束时间 |
该属性指定以“最后一个时间片字段”为结束时间所表示的当日时间。该属性值会根据时间片字段数以及“每个时间片的分钟数”值自动推算。 |
网络数据集中的“街道-流量剖析”连接表
“街道-流量剖析”连接表需要设置 10 个属性,如下表所述。
属性 |
描述 |
---|---|
表 |
包含街道自由流动速度及街道与流量剖析之间关系的表的名称 |
基本行驶时间字段 |
该字段包含自由流动行驶时间 |
基本行驶时间单位 |
指定在“基本行驶时间字段”中使用的字段的时间单位 |
星期日 ProfileID 字段 星期一 ProfileID 字段 星期二 ProfileID 字段 星期三 ProfileID 字段 星期四 ProfileID 字段 星期五 ProfileID 字段 星期六 ProfileID 字段 |
包含星期日流量、星期一流量等流量剖析 ID 的字段名称 |
网络属性
纳入历史流量数据的下一步是指定网络属性。在配置历史流量表之后,会自动创建 TravelTime 成本属性。TravelTime 的边流量赋值器可读取历史流量表,以查找一周内某天及该天的指定时间内的行驶时间。如果某边没有一周内特定某天的历史流量数据,则赋值器将回退到其他基于时间的成本属性 - 一个用于工作日,另一个用于周末。
边流量赋值器也涉及到一种时间中立成本属性。这种情况下的时间中立指的是网络属性行驶时间不会随一天内时间或一周内某天的改变而改变。即,无论在哪个时间或哪天,每个网络要素中的正常网络成本属性都具有相同的预期行驶时间。边流量赋值器可使用时间中立属性执行以下操作:
- 求解不支持历史流量的网络分析图层。(当前仅路径分析图层及多路径配送 (VRP) 分析图层支持历史流量数据。)
- 未提供具体时间及具体哪天时,求解支持历史流量的网络分析图层。
- 对路径分析图层及多路径配送 (VRP) 分析图层上的网络位置进行排序。(使用历史行驶时间无法优化网络位置的顺序;不过,可用其优化网络位置之间的路径。)
下图中的蓝色矩形高亮显示了在历史流量分析中使用的网络成本属性。TravelTime 是历史流量成本属性。它使用了引用其他成本属性的边流量赋值器。稍后您将看到 Minutes 是 TravelTime 的时间中立属性。Minutes 使用一个可从字段 FT_Minutes 和 TF_Minutes 中读取值的字段赋值器。与 Minutes 类似,无论何时,WeekdayFallbackTravelTime 和 WeekendFallbackTravelTime 都会为边的每侧返回相同的成本值。不过,有所不同的是,WeekdayFallbackTravelTime 表示工作日的平均行驶时间,WeekendFallbackTravelTime 则表示周末的平均行驶时间。在本例中,某字段赋值器从 FT_WeekdayMinutes 和 TF_WeekdayMinutes 中读取 WeekdayFallbackTravelTime 的成本。一对相似字段提供 WeekendFallbackTravelTime 值。
边流量赋值器
TravelTime 属性具有利用其他成本属性(在此例中为 Minutes、WeekdayFallbackTravelTime 和 WeekendFallbackTravelTime)的边流量赋值器。该边流量赋值器如下图所示。
边流量赋值器可以为一周中的某一天和某一天的特定时刻计算行驶时间。在边流量赋值器 对话框中的时间感知评估部分您可了解到,该赋值器将首先对“流量剖析表”和“街道-流量剖析连接表”进行搜索,以查找表示特定某日的路段流量的剖析。如果找到一个剖析,则会使用该倍数(在“流量剖析表”中)和自由流动行驶时间(在“街道-流量剖析”连接表中)来计算历史行驶时间。不过,如果该路段没有特定某日的流量剖析,则该赋值器会依据工作日或周末回退属性来提供行驶时间。如果赋值器要搜索工作日的某段时间,则会引用“工作日”属性。
回退属性被分割为工作日和周末,因此您可获取更精确的行驶时间。然而,您可以选择将“工作日”和“周末”指向相同的成本属性;例如,如果不存在特定于工作日和周末的行驶时间,则这二者都会指向 Minutes 属性。
时间中立的评估成本属性为 Minutes。
时区
如果您的网络数据集覆盖了多个时区,则添加时区网络属性非常必要。如果未配置时区属性,则 Network Analyst 可能会根据错误的当前时间来计算行驶时间,因为它假设所有边都在一个时区内。
建立网络之后编辑源要素
当编辑与流量数据相关的源要素时,因为“街道流量剖析”表引用了源要素的对象 ID,因此或许还需要编辑“街道流量剖析”表。需考虑以下几点:
- 如果您改变某街道要素的形状或属性,则不会创建或删除任何对象 ID ;该街道要素在重新建立的过程结束之后,将继续与相同的流量剖析保持关联。
- 如果删除某个街道要素,则“街道流量剖析”表中的相关联记录将变成不相关记录。还应删除相关联的记录,但不是必须删除。
- 如果将现有街道要素一分为二,则其中一部分保留原始要素的对象 ID,另一部分被指定一新的 ID。旧 ID 的街道要素将继续与作为原始街道要素的相同流量剖析保持关联。具有新 ID 的那部分要素与任何流量剖析都无关联,因此,需要向“街道流量剖析”表中添加一条或多条记录,以使其与任何流量剖析都相关。
- 只有向“街道日常剖析”表中添加相应的记录并重新建立该网络,您添加到网络的新要素才会具有相关联的流量剖析。
复制源要素
地理数据库中的每个要素类都有一个要素类 ID,此 ID 是一个自动生成的整数,可唯一识别地理数据库中的要素类。当您将某个要素类从一个地理数据库复制到另一个地理数据库时,原始的要素类 ID 和复制的要素类 ID 可能会不同。
如果将相关表(如,“街道流量剖析”表)与一个源要素类一同复制,然后创建一个网络数据集,则该表中的记录将会引用旧要素类 ID。因此,将得到不需要的结果。不过,如果您复制粘贴一个网络数据集,则源要素及任何相关的表都会被自动粘贴到新位置。此外,还会更新表中引用要素类 ID 的字段(如 EdgeFCID)。
如果您不愿意复制网络数据集,则可以使用 Python 窗口确定要素类 ID 并手动更新表。下面介绍了执行该过程的步骤。
- 将要素类添加到 ArcMap。
- 单击标准 工具条上的 Python 窗口按钮 。
- 在出现的 Python 窗口中,输入 arcpy.Describe("[layer name]").DSID,使用要素图层名称替代 [layer name]。
例如,要获取名为 Streets 的图层的要素类 ID,请输入 arcpy.Describe("Streets").DSID。
- 按 Enter 键。
要素类 ID 会显示在您所输入命令的下方。
- 在关联表中,用新的 ID 替换旧的 ID。
利用历史流量数据执行分析
创建包含 TravelTime 网络属性、边流量赋值器和一个时区属性(如果需要)的网络数据集后,即可执行基于时间的网络分析。
路径分析
该小节着重讲述了当利用历史流量数据设置某路径分析图层时,您应考虑到的属性及求解程序行为。有关这些属性的详细信息,请参阅主题路径分析。
网络分析图层属性
- 将阻抗属性设置为行驶时间网络属性。
- 选中使用开始时间并将时间和星期或具体日期属性设置为您希望一条或多条路径开始的时间。
- 如果您要访问时间窗口中的停靠点,请选中使用时间窗口。
网络分析对象的属性
- 如果选中了使用时间窗口,请利用 TimeWindowStart 和 TimeWindowEnd 属性来指定停靠点的任意时间窗口。您所输入的时间值为指定的本地时区,即停靠点的相关边元素的时区。
多路径派发 (VRP)
该小节着重讲述了当利用历史流量数据设置多路径配送 (VRP) 分析图层时,您应考虑到的属性及求解程序行为。有关这些属性的详细信息,请参阅多路径配送 (VRP) 分析。
网络分析图层属性
- 将时间属性设置为行驶时间网络属性。
- 使用星期或具体日期来设置默认日期。这就是网络分析对象中的时间值所引用的某天或某日期。
网络分析对象的属性
- “停靠点”和“站点”二者每个都有两个时间窗口,可通过 TimeWindowStart1、TimeWindowEnd1、TimeWindowStart2 和 TimeWindowEnd2 进行设置。您所输入的时间值为指定的本地时区,即网络位置的基础边要素的时区。
- 某个路径起始所在的时间窗口可通过 EarliestStartTime 和 LatestStartTime 属性来指定。这些属性值的时区取自路径的起始站点所处的边。
- 中断包含一个时间窗口,您可通过 TimeWindowStart 和 TimeWindowEnd 来指定该时间窗口。中断与路径相关联,且时区取自路径的起始站点所处的边。