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

复杂程度: 初级数据要求: ArcGIS Tutorial Data for Desktop

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

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

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

获取数据

本教程的数据可供下载。

  1. 请转至数据下载页面
  2. 单击下载按钮将文件保存到本地。
  3. 解压下载的文件。

创建地图

完成以下步骤以创建地图:

  1. 启动 ArcGIS Pro
  2. 通过单击地图模板创建一个新工程。 可以选择性地更改工程的名称和位置。

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

将教程数据添加到工程中

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

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

在这组步骤中,将网络数据集添加到地图中。

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

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

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

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

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

  5. 目录窗格中,展开文件夹 > 教程 > SanFrancisco.gdb > Transportation
  6. Streets_ND(具有一个网络数据集图标 网络数据集)拖放到地图上。

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

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

对咖啡店进行地理编码

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

注:

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

  1. 目录窗格中,浏览至教程数据的位置,右键单击 SanFranciscoLocator.loc,然后单击添加到工程
  2. 右键单击 CoffeeShops.csv,然后从快捷菜单中选择地理编码表

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

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

    “地理编码表”窗格

  4. 输入定位器下拉列表中,选择 SanFranciscoLocator
  5. 地理编码表窗格中,单击下一步
  6. 确保输入表指向 CoffeeShops.csv,下拉列表包含多个字段(因为客户地址位于 StreetAddressCityPostal 字段中),然后单击下一步
  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. 在步骤 4 到 6 中,您将执行字段映射。 这是为了确保 CoffeeShops_Geocoded 要素类中的有关咖啡馆的信息正确映射并填充到 Orders 子图层中的匹配字段。
  5. 字段映射下,从属性部分中选择名称
  6. 字段名称下拉列表中,选择靠近列表底部的 USER_Name

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

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

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

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

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

  9. 单击确定

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

    Orders 子图层上的咖啡店

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

    警告消息

  10. 现在,您将基于配送数量更新服务时间。
  11. 内容窗格中,右键单击 Orders 子图层,然后选择属性表
  12. 在属性表中,右键单击 ServiceTime 字段,然后选择计算字段

    将显示计算字段对话框。

  13. 在步骤 11 和 12 中,您将根据特定咖啡店订购的三明治数量计算服务时间。 订购数量以打为单位,配送所需时间以分钟为单位。 如果咖啡店订购了一打、两打或三打三明治,相应地,所需配送时间为 3 分钟、4 分钟或 5 分钟。 任何超过三打的订单都需要 6 分钟来配送到咖啡店。
  14. ServiceTime 值设置为 BasedOnQuantity(!DeliveryQuantity_1!)
  15. 使用以下内容作为代码块
  16. def BasedOnQuantity(quantity):
        if quantity == 1:
            time = 3
        elif quantity == 2:
            time = 4
        elif quantity == 3:
            time = 5
        else:
            time = 6
        return time
    窗口应与以下界面类似:

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

  17. 单击复选标记以验证表达式。
  18. 单击确定

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

  19. 关闭属性表。

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