Skip to main content

使用“最后一公里配送”从单个配送中心服务多个客户

一家早餐三明治初创公司为旧金山地区的独立咖啡店供应三明治,其公司发展迅速,业务蒸蒸日上。 这些三明治大受欢迎,因此咖啡店成打订购此产品。 为了配合咖啡的用餐高峰时段,三明治公司必须在早上 5:00 到 7:30 之间将三明治送到咖啡店。这意味着三明治公司及其驾驶员队伍必须在这个短暂的时间窗内尽可能高效地完成送货。

目前,驾驶员们在运输所有早餐三明治时并没有遇到空间问题,但是当需要配送大批量订单时,最终会发生交货延迟。 由于时间窗对于配送而言十分重要,公司希望根据配送货物的数量更好地计划交付时间。

注:

本教程中使用的数据是虚构的,仅用于在上述示例场景中求解。

获取数据

本教程的数据可供下载。

  1. 请转至 数据下载页面 。

  2. 单击 下载 按钮将文件保存到本地。

  3. 解压下载的文件。

创建地图

要创建地图,请完成以下步骤:

  1. 启动 ArcGIS Pro。

  2. 单击 地图 模板以创建工程。 可以选择性地更改工程的名称和位置。

  3. 单击 确定 。

    随即出现具有地图的新工程。

将教程数据添加到工程中

网络数据集是道路系统的智能模型。 其不仅包含道路的位置和属性,而且还包含有关道路如何彼此关联(例如,哪些道路相连、相连的道路之间允许或禁止哪些转弯)的信息及其他影响可能的行驶路线和行驶时间的信息。

注:

如果您使用 ArcGIS Online 执行分析,则求解程序将参考存储在 ArcGIS Online 云中的高质量的世界级网络数据集并使用 ArcGIS Online 配额 。 您还可以使用存储在本地计算机上的网络数据集或使用自己的网络数据集通过 ArcGIS Enterprise 发布路径服务 ,并通过企业门户配置服务以在 ArcGIS Pro 中使用。

要将网络数据集添加到地图,请完成以下步骤:

  1. 在 目录 窗格(默认情况下,位于应用程序的右侧)上,右键单击 文件夹 ,然后选择 添加文件夹连接 添加文件夹连接 。

    随即出现 添加文件夹连接 对话框。

  2. 浏览到您放置了教程数据的文件夹,双击 Network Analyst ,然后单击 教程 以选择该文件夹。

  3. 单击 确定 。

    随即创建一个与教程文件夹之间的连接。

    接下来,将文件夹中包含的网络数据集添加到地图中。

  4. 在 目录 窗格中,展开 文件夹 > 教程 > SanFrancisco.gdb > Transportation 。

  5. 将 Streets_ND (具有一个网络数据集图标 网络数据集 )拖放到地图上。

    网络数据集将被添加到 内容 窗格以及地图中。

  6. 在 内容 窗格中,取消选中 Streets_ND 以仅显示底图。

对咖啡店进行地理编码

现在,您将对 CoffeeShops.csv 文件进行地理编码,以创建一个包含客户位置的要素类。 当表包含位置的地址时,即可通过地理编码在地图上进行定位。 地址可以在表的一个或多个字段中。

注:

如果您有自己的街道数据,则可以使用该数据创建定位器。如果没有,Esri 提供了 ArcGIS World Geocoding Service,使用时会消耗配额。

  1. 在 目录 窗格中,浏览至教程数据的位置,右键单击 SanFranciscoLocator.loc ,然后单击 添加到工程 。

  2. 右键单击 CoffeeShops.csv ,然后从快捷菜单中选择 地理编码表 。

    地理编码表 窗格随即出现。

  3. 在 地理编码表 窗格中,单击 开始 。

    “地理编码表”窗格

  4. 从 输入定位器 下拉列表中,选择 SanFranciscoLocator 。

  5. 在 地理编码表 窗格中,单击 下一步 。

  6. 确保 输入表 指向 CoffeeShops.csv ,下拉列表包含 多个字段 (因为客户地址位于 StreetAddress 、 City 和 Postal 字段中),然后单击 下一步 。

  7. 按照下方所示映射地址字段:

    • 地址或地点 映射至 StreetAddress

    • 城市 映射至 City

    • ZIP 映射至 Postal

    • 州 映射至 State

  8. 单击 下一步 。

    保持 输出 设置不变以将其保存到工程工作空间。

  9. 对于 首选位置类型 ,从下拉选项中选择 路径位置 。

    此选项会将定位的要素放置在街道网络位置,而非屋顶处。 在 Network Analyst 中,点在空间上会定位至最近的街道边处。 建筑物的中心有时可能更接近其他街道,而不是车道入口所在的街道。

  10. 保留 输出字段 的设置( 所有 ),然后单击 下一步 。

  11. 对于 类别 ,选中 地址 ,然后单击 完成 。

  12. 单击 运行 。

    处理完成后,会显示一条消息,询问是否要重新匹配。

  13. 单击 否 ,因为所有位置均已正确匹配。

    “地理编码已完成”消息

  14. 关闭 地理编码表 窗格。

创建最后一公里配送分析图层

“最后一公里配送”求解程序聚焦于涉及将包裹配送至最终用户的一部分车辆配送问题。 “最后一公里配送”问题包含单个配送中心,将从该中心分派配送车辆前往客户位置。 您可以使用此图层添加客户、路径开始和结束位置、车辆以及驾驶员的相关信息。 其中包含多个用于收集信息的要素类和表。 您还可以访问 最后一公里配送图层 选项卡上的多个参数,以确保针对正确的日期、使用正确的单位和车辆行驶信息进行求解。

要创建最后一公里配送分析图层,请完成以下步骤:

  1. 在 分析 选项卡的 工作流 组中,单击 网络分析 > 最后一公里配送 最后一公里配送 。

    最后一公里配送分析图层随即添加到 内容 窗格中。 它包括多个含有分析输入和输出的子图层。

    此图层将引用 San Francisco 网络数据集,因为在创建最后一公里配送图层时,该网络位于 内容 窗格中。

    注:

    要查看或更改用于创建网络分析图层的网络数据源,请在 分析 选项卡上的 工作流 组中,单击 网络分析 下拉菜单并查看 网络数据源 。

添加停靠点

停靠点用于指定客户的相关信息。 每个停靠点可以包含多项信息,例如驾驶员在该位置的预计停留时间、配送或接取的物品数量、预约时间等。

要添加停靠点,请完成以下步骤:

  1. 在 内容 窗格中,选择 Last Mile Delivery 图层以启用选项卡。

    “最后一公里配送图层”功能区

  2. 单击 最后一公里配送图层 选项卡,然后在 输入数据 部分中,单击 导入停靠点 按钮 导入停靠点 。

    将打开 添加位置 对话框。

  3. 对于 输入位置 ,选择 CoffeeShops_Geocoded 。

    在步骤 4 到 6 中,您将执行字段映射。 这是为了确保 CoffeeShops_Geocoded 要素类中的有关咖啡馆的信息正确映射并填充到 Orders 子图层中的匹配字段。

  4. 在 字段映射 下,从 属性 部分中选择 名称 。

  5. 从 字段名称 下拉列表中,选择靠近列表底部的 USER_Name 。

    “最后一公里配送”求解程序需要每个停靠点的名称唯一。 由于配送列表中的每家咖啡店都有唯一的名称,因此咖啡店名称(存储在 USER_Name 字段中)将映射到 Orders 子图层中的 Name 字段。

  6. 如下所示映射以下附加属性: DeliveryQuantity_1 > USER_DozensOfBreakfastSandwiches 。

    三明治店以打为单位配送三明治。 需要向各个店铺配送的数量在 USER_DozensOfBreakfastSandwiches 字段中追踪,因此此数据将映射至 DeliveryQuantity_1 字段,使得“最后一公里配送”求解程序可以追踪向各个位置配送多少打三明治。

  7. 从 属性 部分中选择 CurbApproach ,然后从 默认值 下拉列表中选择 车辆的右侧 。

    CurbApproach 字段指定了当车辆服务某位置时,对于车辆而言该位置必须在街道的哪一侧。 因为这些路径在旧金山,车辆在街道右侧行驶,因此将 CurbApproach 设置为车辆的右侧可确保配送货车停靠在咖啡店附近的路边,驾驶员不需要横穿道路。

  8. 单击 确定 。

    咖啡店将添加到 Orders 子图层。

    Orders 子图层上的咖啡店

    系统显示一条警告消息,提示地理编码处理导致 CoffeeShops_Geocoded 要素类中的 Name 字段对于 Orders 子图层中的 Name 字段而言过长。 关闭警告消息窗口,因为名称并不超长。

    警告消息

    现在,您将基于配送数量更新服务时间。

  9. 在 内容 窗格中,右键单击 Orders 子图层,然后选择 属性表 。

  10. 在属性表中,右键单击 ServiceTime 字段,然后选择 计算字段 。

    将显示 计算字段 对话框。

    在步骤 11 和 12 中,您将根据特定咖啡店订购的三明治数量计算服务时间。 订购数量以打为单位,配送所需时间以分钟为单位。 如果咖啡店订购了一打、两打或三打三明治,相应地,所需配送时间为 3 分钟、4 分钟或 5 分钟。 任何超过三打的订单都需要 6 分钟来配送到咖啡店。

  11. 将 ServiceTime 值设置为 BasedOnQuantity(!DeliveryQuantity_1!) 。

  12. 使用以下内容作为 代码块 :

    def BasedOnQuantity(quantity):
        if quantity == 1:
            time = 3
        elif quantity == 2:
            time = 4
        elif quantity == 3:
            time = 5
        else:
            time = 6
        return time   
    

    窗口应与以下界面类似:

    已填充参数的“计算字段”对话框

  13. 单击复选标记以验证表达式。

  14. 单击 确定 。

    ServiceTime 字段现已使用适当的值填充。

  15. 关闭属性表。

将三明治店位置添加到 Depots 子图层

站点是路径在一天中的开始和结束位置。 所有路径都必须在同一位置开始和结束。 对于此分析,将使用三明治店作为站点。 与客户数据一样,三明治店的数据也可以进行地理编码 但是,由于这是单个地址,您将改为使用 定位 窗格对地址进行地理编码并将其添加到 Depots 子图层。

注:

通过 ArcGIS World Geocoding Service 使用 添加至要素类 选项会消耗配额。 使用提供的定位器不会消耗配额。

要添加三明治店的位置,请完成以下步骤:

  1. 单击 地图 选项卡,在 查询 组中,单击 定位 按钮 定位 。

    “查询”组中的“定位”按钮

    定位 窗格随即显示。

  2. 单击搜索框旁边的 选项 下拉箭头。

    “定位”窗格中的“选项”按钮

  3. 选中 SanFranciscoLocator 。

  4. 在搜索框中,输入三明治店的地址 50 Southdale Ave. Daly City, CA 94015 ,然后按 Enter 键。

  5. 在 定位 窗格中,右键单击选项 A ,然后选择 添加至要素类 。

    添加至要素类 窗口随即显示,您可以在此处选择要将地址添加到的要素类。

  6. 展开 Last Mile Delivery: Depots ,选择 Depots 模板,然后单击 确定 。

  7. 在 内容 窗格中,右键单击 Depots 子图层,然后选择 属性表 。

    属性表中添加了一行,表示唯一的三明治店位置。 三明治店的完整地址作为站点的名称。

  8. 关闭属性表。

  9. 在 编辑 选项卡上,清除选择并保存编辑内容。

  10. 关闭 定位 窗格。

向 Routes 子图层添加信息

路径包含有关车辆和驾驶员的信息。 可以包含关于驾驶员工作日的信息,例如开始工作的时间以及一天内的工作时长。 也可以包含车辆信息,例如容量和运营成本。

为了高效地将订单货物配送至 173 个咖啡店,请在添加路径时设置以下参数。 您将指定可以为 173 个咖啡店提供服务的路径数量,路径的开始和结束位置(即三明治店的位置)、路径可以开始的最早时间(配送时间窗为早上 5:00 到 7:30)、货车的容量、路径的最大总行驶时间以及驾驶员每小时的薪资。

要向 Routes 子图层添加路径及其他信息,请完成以下步骤:

  1. 在 内容 窗格中,右键单击 Last Mile Delivery 图层组名称,然后选择 缩放至图层 以缩放至完整范围。

  2. 返回到 最后一公里配送图层 选项卡。

  3. 在 输入数据 组中,单击 导入路径 下拉菜单,然后选择 添加路径 。

    随即显示 添加车队配送路线 对话框。

  4. 设置以下值:

    1. 路径数量 -12

      三明治店有 12 辆配送货车,因此这就是可用于送货的路径数。

    2. 起始站点名称 - 50 Southdale Ave, Daly City, CA 94015

      路径必须在三明治店开始和结束,因此 起始站点名称 和 终止站点名称 值都是三明治店的地址。

      您可以从下拉列表中选择 起始站点名称 ,该值必须与 Depots 子图层中 Name 字段的值一致。

    3. 终止站点名称 - 50 Southdale Ave, Daly City, CA 94015

      您可以从下拉列表中选择 终止站点名称 ,该值必须与 Depots 子图层中 Name 字段的值一致。

    4. 最早路径开始时间 - 5:00 am

      路径必须在早上 5:00 开始,才能及时将早餐三明治送到咖啡店,以满足早晨高峰期的需求。

    5. Capacity_1 - 150

      每辆车最多可以容纳 150 打早餐三明治。 很重要的一点是, Capacity_1 使用的单位应该与 DeliveryQuantity_1 的单位一致,在本例中为一打三明治。

    6. 最长总时间 - 150

      路径必须在早上 7:30 之前完成并返回三明治店。驾驶员有 2.5 小时来完成其路径。 由于模拟此问题时使用的时间字段单位是分钟,因此您需要为 最长总时间 输入 150 分钟。

    7. 单位时间成本 - 0.5

      驾驶员的时薪为 30 美元,但由于使用了分钟来模拟此问题,所以相当于每分钟 0.5 美元。

  5. 单击 确定 以运行工具。

    十二条路径随即添加到 Routes 子图层。

添加区域

为了使驾驶员留在其首选城镇区域,您现在将添加区域。

  1. 在 最后一公里配送图层 选项卡上的 输入数据 部分,单击 创建要素 按钮 创建要素 。

  2. 在 创建要素 窗格中,选择 Zones 模板。

  3. 绘制两个多边形以划分金门公园和圣米格尔山的北部和南部。 这些区域应该与下图相似。

    已添加北部和南部区域

  4. 在 内容 窗格中,右键单击 Zones ,然后选择 属性表 。

  5. 对于金门公园和圣米格尔山南部的多边形,将 Name 字段值更改为 South 。

  6. 对于金门公园和圣米格尔山北部的多边形,将 Name 字段值更改为 North 。

  7. 打开 Routes 属性表并滚动至 ZoneName 和 IsHardZone 字段的右边。

  8. 右键单击 IsHardZone 字段,然后单击 计算字段 。

    将显示 计算字段 对话框。

  9. 将 IsHardZone 值设置为 True 。

    此设置定义路径仅可向指定区域内的停靠点配送货物。

  10. 选择属性表中的前三行,右键单击 ZoneName 字段,然后单击 计算字段 。

    将显示 计算字段 对话框。

  11. 将 ZoneName 值设置为 'South' 。

    此操作会对前三条路径应用限制,使其仅向南部区域的停靠点配送货物。

  12. 切换属性表中选择的行,然后使用 计算字段 将其余九条路径的 ZoneName 值设置为 'North' 。

    此操作会对其余九条路径应用限制,使其仅向北部区域的停靠点配送货物。

  13. 清除所选内容并保存编辑内容。

  14. 关闭属性表。

设置日期并运行分析

您现在可以设置一个路径将要开始的日期。 您无需设置时间,因为在上一部分中使用 添加车队配送路径 工具添加路径时,已经为每个路径设置了时间。

  1. 在 最后一公里配送图层 功能区上的 日期和时间 部分中,单击 默认日期 下拉箭头,然后将日期设置为 03/14/2024 。

  2. 在 分析 组中,单击 运行 。

    Last Mile Delivery 图层将进行求解。 停靠点将分配至路径,符号系统将更新为以一致的颜色显示路径及为其分配的停靠点。

    由一条特定路径提供服务的停靠点使用一致的颜色代码显示

  3. 在 内容 窗格中,右键单击 Routes 子图层,然后选择 属性表 。

  4. 在表中向右滚动至 OrderCount 输出字段。

查看结果。 最后一公里配送分析图层 中的多个要素类均包含输出字段,这些字段提供关于求解结果的详细信息。 Routes 表提供各个路径的概览,但您也可以查看每条路径的详细信息。 Routes 输出包含各个驾驶员前往的位置数、总用时、路径开始时间以及预计返回三明治店的时间。 您将注意到有三条路径不服务任何咖啡店,因为这些咖啡店由其他路径覆盖。 因此,这三条路径的大多数字段都具有空值。