创建位置分配图层 (Network Analyst)

需要 Network Analyst 许可。

摘要

创建位置分配网络分析图层并设置其分析属性。位置分配分析图层对于从一组可能位置中选择指定数量的设施点(以便以最佳且高效的方式将需求点分配给设施点)十分有用。

使用情况

  • 通过此工具创建分析图层后,您可以使用添加位置工具向图层中添加网络分析对象;使用求解工具来求解分析;以及使用保存至图层文件工具将结果保存到磁盘中。

  • 在地理处理模型中使用此工具时,如果模型作为工具来运行,则必须将输出网络分析图层创建为模型参数;否则,输出图层将无法添加到地图内容中。

参数

标注说明数据类型
输入分析网络

要执行位置分配分析的网络数据集。

Network Dataset Layer
输出图层名称

要创建的位置分配网络分析图层的名称。

String
阻抗属性

分析过程中用作阻抗的成本属性。

String
行驶自
(可选)

指定计算网络成本时设施点与请求点之间的行驶方向。

  • FACILITY_TO_DEMAND行驶方向从设施点到请求点。消防部门通常使用该设置,因为他们需要关注从消防站行驶到紧急救援位置所需的时间。
  • DEMAND_TO_FACILITY行驶方向从请求点到设施点。零售店通常使用该设置,因为他们需要关注购物者到达商店所需的时间。

使用此选项会影响具有单向限制和根据方向不同阻抗不同的网络上的请求点到设施点的分配。例如,从请求点驾车到达设施点可能需要 15 分钟,但从设施点行驶至请求点仅需 10 分钟。

String
位置分配问题类型
(可选)

将要求解的问题的类型。问题类型的选择取决于要定位的设施点种类。不同种类的设施点具有不同的优先级和约束。

  • MINIMIZE_IMPEDANCE此选项可解决仓库位置问题。它选择一组使加权阻抗(请求的位置乘以到最近设施点的阻抗)的总和最小的设施点。此问题类型通常称为 P 中位数问题。
  • MAXIMIZE_COVERAGE此选项可解决消防站位置问题。它选择了多个设施点以保证所有或最大数量的请求点处于指定的阻抗中断范围内。
  • MAXIMIZE_CAPACITATED_COVERAGE此选项用于求解容量有限的设施点的位置问题。此选项将选择一组满足所有或最大数量的请求而不超出任何设施点容量的设施点。除了支持容量外,该选项还选择一组使加权阻抗(分配给某个设施点的请求点乘以到该设施点的阻抗)的总和最小的设施点。
  • MINIMIZE_FACILITIES此选项可解决消防站位置问题。它将选择当在指定的阻抗中断范围内覆盖了所有或最大数量的请求点时所需要的设施点的最小数量。
  • MAXIMIZE_ATTENDANCE此选项可解决邻域存储位置问题,其中分配给最近所选设施点的请求比例将随距离的增加而降低。已选择最大化总分配请求点的设施点集。大于指定的阻抗中断的请求点不会影响所选的设施点集。
  • MAXIMIZE_MARKET_SHARE此选项可解决竞争性设施点的位置问题。它选择当存在竞争性设施点时可最大化市场份额的设施点。重力模型概念用于确定分配给每个设施点的请求点比例。已选择最大化总分配请求点的设施点集。
  • TARGET_MARKET_SHARE此选项可解决竞争性设施点的位置问题。它选择当存在竞争性设施点时可达到指定目标市场份额的设施点。重力模型概念用于确定分配给每个设施点的请求点比例。已选择的最小设施点量需达到指定的目标市场份额。
String
要查找的设施点数
(可选)

指定求解程序将查找的设施点数。

当要查找的设施点多于所需设施点时,FacilityType 值为必选项的设施点将始终为解的一部分;要选择的任何额外设施点都将从候选设施点中选取。

在求解前所有 FacilityType 值为已选项的设施点在求解时都将视为候选设施点。

对于最小化设施点数问题类型不会考虑参数值,因为求解程序会确定最小的设施点数来查找最大的覆盖范围。

对于目标市场份额问题类型,参数值会被覆盖,因为求解程序会搜索要占有指定市场份额所需的最小设施点数。

Long
阻抗中断
(可选)

阻抗中断指定请求点可分配给设施点的最大阻抗。最大阻抗以沿网络的最小成本路径进行测量。如果请求点位于中断外,则不会被分配。此属性可用于对人们为前往商店而愿意行进的最大距离,以及消防站到达社区中任一请求点所允许的最大时间进行建模。

如果设置请求点的 Cutoff__[阻抗] 属性,该属性将覆盖分析图层的阻抗中断属性。您可能会发现,乡村居民愿意走 10 英里远去往某个设施点,而城镇居民则只愿意走 2 英里的路程。此情况可以如下方式建模:将分析图层的阻抗中断值设置为 10,而将城镇地区中请求点的 Cutoff_Miles 值设置为 2

Double
阻抗变换
(可选)

此属性可设置对设施点与请求点间网络成本进行变换的方程。它还可与阻抗参数结合使用,指定设施点与请求点间的网络阻抗对于求解程序选择设施点的影响的严重程度。

  • LINEAR设施点和请求点之间变换的网络阻抗与它们之间的最短路径网络阻抗相同。使用此选项,阻抗参数始终设置为 1。这是默认设置。
  • POWER设施点和请求点之间变换的网络阻抗等于以最短路径网络阻抗为底,以阻抗参数所指定的数为指数的幂运算结果。将此选项与正阻抗参数结合使用可对附近的设施点指定较高的权重。
  • EXPONENTIAL设施点和请求点之间变换的网络阻抗等于以数学常量 e 为底,以最短路径网络阻抗所指定的数为指数的幂乘以阻抗参数。将此选项与正阻抗参数结合使用可对附近的设施点指定很高的权重。指数变换通常与阻抗中断结合使用。

如果设置请求点的 ImpedanceTransformation 属性,该属性会覆盖分析图层的“阻抗变换”属性。这时,您可能要针对城镇居民和乡村居民使用不同的阻抗变换。可通过为分析图层设置阻抗变换以匹配乡村居民的阻抗参数,同时为城镇地区中的请求点设置阻抗参数以匹配城镇居民的阻抗参数,来执行建模。

String
阻抗参数
(可选)

为“阻抗变换”参数中指定的方程提供参数值。当阻抗变换的类型为线性时会忽略参数值。对于指数阻抗变换,应设置非零值。

如果设置请求点的 ImpedanceParameter 属性,该属性会覆盖分析图层的 阻抗参数属性。您可能要针对城镇居民和乡村居民使用不同的阻抗参数。可通过为分析图层设置阻抗变换以匹配乡村居民的阻抗参数,同时为城镇地区中的请求点设置阻抗参数以匹配城镇居民的阻抗参数,来执行建模。

Double
目标市场份额
(可选)

指定当位置分配问题类型参数设置为目标市场份额时要求解的目标市场份额百分比。它是您希望设施点解占总请求权重的百分比。求解程序会求出为占有该值指定的目标市场份额所需的最小设施点数。

Double
累加器
(可选)

分析过程中要累积的成本属性的列表。 这些累积属性仅供参考;求解程序仅使用阻抗属性参数所指定的成本属性来计算路径。

对于每个累积的成本属性,均会向求解程序所输出的路径中添加一个 Total_[阻抗] 属性。

String
U 形转弯策略
(可选)

指定将在交汇点处使用的 U 形转弯策略。 允许 U 形转弯表示求解程序可以在交汇点处转向并沿同一街道往回行驶。 考虑到交汇点表示街道交叉路口和死角,不同的车辆可以在某些交汇点转弯,而在其他交汇点则不行 - 这取决于交汇点是交叉路口还是死角。 为适应此情况,U 形转弯策略参数由连接到交汇点的边数隐性指定,这称为交汇点价。 此参数可接受的值如下所列;每个值的后面是根据交汇点价对其含义的描述。

  • ALLOW_UTURNS无论在交汇点处有几条连接的边,均允许 U 形转弯。 这是默认值。
  • NO_UTURNS在所有交汇点处均禁止 U 形转弯,不管交汇点原子价如何。 不过请注意,即使已选择该设置,在网络位置处仍允许 U 形转弯;但是也可以通过设置个别网络位置的 CurbApproach 属性来禁止 U 形转弯。
  • ALLOW_DEAD_ENDS_ONLY除仅有一条相邻边的交汇点(死角)外,其他交汇点均禁止 U 形转弯。
  • ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLY在恰好有两条相邻边相遇的交汇点处禁止 U 形转弯,但是交叉点(三条或三条以上相邻边的交汇点)和死角(仅有一条相邻边的交汇点)处允许。 通常,网络在路段中间有多余的交汇点。 此选项可防止车辆在这些位置掉头。
提示:

如果您需要定义更加精确的 U 形转弯策略,可以考虑在网络成本属性中添加一个通用转弯延迟赋值器,或者如果存在的话,调整其设置,并特别注意反向转弯的配置。 还可以设置网络位置的 CurbApproach 属性。

String
约束条件
(可选)

分析过程中要应用的限制属性的列表。

String
在分析中应用等级
(可选)
  • 选中 - 将使用等级属性进行分析。 使用等级的结果是,求解程序更偏好高等级的边而不是低等级的边。 分等级求解的速度更快,并且可用于模拟驾驶员在可能的情况下选择在高速公路而非地方道路上行驶(即使行程可能更远)的偏好。 只有输入网络数据集具有等级属性时,此选项才处于活动状态。
  • 未选中 - 将不会使用等级属性进行分析。 如果未使用等级,则结果是网络数据集的精确路径。

如果未在用于执行分析的网络数据集中定义等级属性,该参数将处于非活动状态。

Boolean
输出路径形状
(可选)
  • NO_LINES将不会为分析的输出生成任何形状。
  • STRAIGHT_LINES输出线形状是对设施点解及其分配的请求点进行连接的直线。
String
默认容量
(可选)

指定位置分配问题类型参数设为最大化有容量限制的覆盖范围时默认的设施点容量。对于所有其他问题类型,可忽略此参数。

设施点有容量属性,如果此属性设置为非空值,将覆盖该设施点的默认容量参数。

Double
开始时间
(可选)

指示出发的时间和日期。出发时间可以来自设施点或请求点,取决于行驶是从请求点到设施点还是从设施点到请求点。

如果您已经选择了基于流量的阻抗属性,将会根据特定的某天某时的动态交通状况来生成解决方案。日期和时间可被指定为 5/14/2012 10:30 AM。

Instead of using a particular date, a day of the week can be specified using the following dates.

  • Today—12/30/1899
  • Sunday—12/31/1899
  • Monday—1/1/1900
  • Tuesday—1/2/1900
  • Wednesday—1/3/1900
  • Thursday—1/4/1900
  • Friday—1/5/1900
  • Saturday—1/6/1900
For example, to specify that travel should begin at 5:00 PM on Tuesday, specify the parameter value as 1/2/1900 5:00 PM.

Date

派生输出

标注说明数据类型
网络分析图层

新创建的网络分析图层。

网络分析图层

arcpy.management.MakeLocationAllocationLayer(in_network_dataset, out_network_analysis_layer, impedance_attribute, {loc_alloc_from_to}, {loc_alloc_problem_type}, {number_facilities_to_find}, {impedance_cutoff}, {impedance_transformation}, {impedance_parameter}, {target_market_share}, {accumulate_attribute_name}, {UTurn_policy}, {restriction_attribute_name}, {hierarchy}, {output_path_shape}, {default_capacity}, {time_of_day})
名称说明数据类型
in_network_dataset

要执行位置分配分析的网络数据集。

Network Dataset Layer
out_network_analysis_layer

要创建的位置分配网络分析图层的名称。

String
impedance_attribute

分析过程中用作阻抗的成本属性。

String
loc_alloc_from_to
(可选)

指定计算网络成本时设施点与请求点之间的行驶方向。

  • FACILITY_TO_DEMAND行驶方向从设施点到请求点。消防部门通常使用该设置,因为他们需要关注从消防站行驶到紧急救援位置所需的时间。
  • DEMAND_TO_FACILITY行驶方向从请求点到设施点。零售店通常使用该设置,因为他们需要关注购物者到达商店所需的时间。

使用此选项会影响具有单向限制和根据方向不同阻抗不同的网络上的请求点到设施点的分配。例如,从请求点驾车到达设施点可能需要 15 分钟,但从设施点行驶至请求点仅需 10 分钟。

String
loc_alloc_problem_type
(可选)

将要求解的问题的类型。问题类型的选择取决于要定位的设施点种类。不同种类的设施点具有不同的优先级和约束。

  • MINIMIZE_IMPEDANCE此选项可解决仓库位置问题。它选择一组使加权阻抗(请求的位置乘以到最近设施点的阻抗)的总和最小的设施点。此问题类型通常称为 P 中位数问题。
  • MAXIMIZE_COVERAGE此选项可解决消防站位置问题。它选择了多个设施点以保证所有或最大数量的请求点处于指定的阻抗中断范围内。
  • MAXIMIZE_CAPACITATED_COVERAGE此选项用于求解容量有限的设施点的位置问题。此选项将选择一组满足所有或最大数量的请求而不超出任何设施点容量的设施点。除了支持容量外,该选项还选择一组使加权阻抗(分配给某个设施点的请求点乘以到该设施点的阻抗)的总和最小的设施点。
  • MINIMIZE_FACILITIES此选项可解决消防站位置问题。它将选择当在指定的阻抗中断范围内覆盖了所有或最大数量的请求点时所需要的设施点的最小数量。
  • MAXIMIZE_ATTENDANCE此选项可解决邻域存储位置问题,其中分配给最近所选设施点的请求比例将随距离的增加而降低。已选择最大化总分配请求点的设施点集。大于指定的阻抗中断的请求点不会影响所选的设施点集。
  • MAXIMIZE_MARKET_SHARE此选项可解决竞争性设施点的位置问题。它选择当存在竞争性设施点时可最大化市场份额的设施点。重力模型概念用于确定分配给每个设施点的请求点比例。已选择最大化总分配请求点的设施点集。
  • TARGET_MARKET_SHARE此选项可解决竞争性设施点的位置问题。它选择当存在竞争性设施点时可达到指定目标市场份额的设施点。重力模型概念用于确定分配给每个设施点的请求点比例。已选择的最小设施点量需达到指定的目标市场份额。
String
number_facilities_to_find
(可选)

指定求解程序将查找的设施点数。

当要查找的设施点多于所需设施点时,FacilityType 值为必选项的设施点将始终为解的一部分;要选择的任何额外设施点都将从候选设施点中选取。

在求解前所有 FacilityType 值为已选项的设施点在求解时都将视为候选设施点。

对于 MINIMIZE_FACILITIES 问题类型,不会考虑参数值,因为求解程序会确定最小的设施点数来查找最大的覆盖范围。

对于 TARGET_MARKET_SHARE 问题类型,参数值会被覆盖,因为求解程序会搜索要占有指定市场份额所需的最小设施点数。

Long
impedance_cutoff
(可选)

阻抗中断指定请求点可分配给设施点的最大阻抗。最大阻抗以沿网络的最小成本路径进行测量。如果请求点位于中断外,则不会被分配。此属性可用于对人们为前往商店而愿意行进的最大距离,以及消防站到达社区中任一请求点所允许的最大时间进行建模。

如果设置请求点的 Cutoff__[阻抗] 属性,该属性将覆盖分析图层的阻抗中断属性。您可能会发现,乡村居民愿意走 10 英里远去往某个设施点,而城镇居民则只愿意走 2 英里的路程。此情况可以如下方式建模:将分析图层的阻抗中断值设置为 10,而将城镇地区中请求点的 Cutoff_Miles 值设置为 2

Double
impedance_transformation
(可选)

此属性可设置对设施点与请求点间网络成本进行变换的方程。它还可与阻抗参数结合使用,指定设施点与请求点间的网络阻抗对于求解程序选择设施点的影响的严重程度。

  • LINEAR设施点和请求点之间变换的网络阻抗与它们之间的最短路径网络阻抗相同。使用此选项,阻抗参数始终设置为 1。这是默认设置。
  • POWER设施点和请求点之间变换的网络阻抗等于以最短路径网络阻抗为底,以阻抗参数所指定的数为指数的幂运算结果。将此选项与正阻抗参数结合使用可对附近的设施点指定较高的权重。
  • EXPONENTIAL设施点和请求点之间变换的网络阻抗等于以数学常量 e 为底,以最短路径网络阻抗所指定的数为指数的幂乘以阻抗参数。将此选项与正阻抗参数结合使用可对附近的设施点指定很高的权重。指数变换通常与阻抗中断结合使用。

如果设置请求点的 ImpedanceTransformation 属性,该属性会覆盖分析图层的“阻抗变换”属性。这时,您可能要针对城镇居民和乡村居民使用不同的阻抗变换。可通过为分析图层设置阻抗变换以匹配乡村居民的阻抗参数,同时为城镇地区中的请求点设置阻抗参数以匹配城镇居民的阻抗参数,来执行建模。

String
impedance_parameter
(可选)

为“阻抗变换”参数中指定的方程提供参数值。当阻抗变换的类型为 LINEAR 时会忽略参数值。对于 POWEREXPONENTIAL 阻抗变换,应设置非零值。

如果设置请求点的 ImpedanceParameter 属性,该属性会覆盖分析图层的 阻抗参数属性。您可能要针对城镇居民和乡村居民使用不同的阻抗参数。可通过为分析图层设置阻抗变换以匹配乡村居民的阻抗参数,同时为城镇地区中的请求点设置阻抗参数以匹配城镇居民的阻抗参数,来执行建模。

Double
target_market_share
(可选)

指定当位置分配问题类型参数设置为 TARGET_MARKET_SHARE 时要求解的目标市场份额百分比。它是您希望设施点解占总请求权重的百分比。求解程序会求出为占有该值指定的目标市场份额所需的最小设施点数。

Double
accumulate_attribute_name
[accumulate_attribute_name,...]
(可选)

分析过程中要累积的成本属性的列表。 这些累积属性仅供参考;求解程序仅使用阻抗属性参数所指定的成本属性来计算路径。

对于每个累积的成本属性,均会向求解程序所输出的路径中添加一个 Total_[阻抗] 属性。

String
UTurn_policy
(可选)

指定将在交汇点处使用的 U 形转弯策略。 允许 U 形转弯表示求解程序可以在交汇点处转向并沿同一街道往回行驶。 考虑到交汇点表示街道交叉路口和死角,不同的车辆可以在某些交汇点转弯,而在其他交汇点则不行 - 这取决于交汇点是交叉路口还是死角。 为适应此情况,U 形转弯策略参数由连接到交汇点的边数隐性指定,这称为交汇点价。 此参数可接受的值如下所列;每个值的后面是根据交汇点价对其含义的描述。

  • ALLOW_UTURNS无论在交汇点处有几条连接的边,均允许 U 形转弯。 这是默认值。
  • NO_UTURNS在所有交汇点处均禁止 U 形转弯,不管交汇点原子价如何。 不过请注意,即使已选择该设置,在网络位置处仍允许 U 形转弯;但是也可以通过设置个别网络位置的 CurbApproach 属性来禁止 U 形转弯。
  • ALLOW_DEAD_ENDS_ONLY除仅有一条相邻边的交汇点(死角)外,其他交汇点均禁止 U 形转弯。
  • ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLY在恰好有两条相邻边相遇的交汇点处禁止 U 形转弯,但是交叉点(三条或三条以上相邻边的交汇点)和死角(仅有一条相邻边的交汇点)处允许。 通常,网络在路段中间有多余的交汇点。 此选项可防止车辆在这些位置掉头。
提示:

如果您需要定义更加精确的 U 形转弯策略,可以考虑在网络成本属性中添加一个通用转弯延迟赋值器,或者如果存在的话,调整其设置,并特别注意反向转弯的配置。 还可以设置网络位置的 CurbApproach 属性。

String
restriction_attribute_name
[restriction_attribute_name,...]
(可选)

分析过程中要应用的限制属性的列表。

String
hierarchy
(可选)
  • USE_HIERARCHY将使用等级属性进行分析。 使用等级的结果是,求解程序更偏好高等级的边而不是低等级的边。 分等级求解的速度更快,并且可用于模拟驾驶员在可能的情况下选择在高速公路而非地方道路上行驶(即使行程可能更远)的偏好。 只有输入网络数据集具有等级属性时,此选项才有效。
  • NO_HIERARCHY将不会使用等级属性进行分析。 如果未使用等级,则结果是网络数据集的精确路径。

如果未在用于执行分析的网络数据集中定义等级属性,该参数将不可用。

Boolean
output_path_shape
(可选)
  • NO_LINES将不会为分析的输出生成任何形状。
  • STRAIGHT_LINES输出线形状是对设施点解及其分配的请求点进行连接的直线。
String
default_capacity
(可选)

指定 loc_alloc_problem_type 参数设为 MAXIMIZE_CAPACITATED_COVERAGE 时默认的设施点容量。对于所有其他问题类型,可忽略此参数。

设施点有容量属性,如果此属性设置为非空值,将覆盖该设施点的 default_capacity 参数。

Double
time_of_day
(可选)

指示出发的时间和日期。出发时间可以来自设施点或请求点,取决于行驶是从请求点到设施点还是从设施点到请求点。

如果您已经选择了基于流量的阻抗属性,将会根据特定的某天某时的动态交通状况来生成解决方案。日期和时间可被指定为 5/14/2012 10:30 AM。

Instead of using a particular date, a day of the week can be specified using the following dates.

  • Today—12/30/1899
  • Sunday—12/31/1899
  • Monday—1/1/1900
  • Tuesday—1/2/1900
  • Wednesday—1/3/1900
  • Thursday—1/4/1900
  • Friday—1/5/1900
  • Saturday—1/6/1900
For example, to specify that travel should begin at 5:00 PM on Tuesday, specify the parameter value as 1/2/1900 5:00 PM.

Date

派生输出

名称说明数据类型
output_layer

新创建的网络分析图层。

网络分析图层

代码示例

MakeLocationAllocationLayer 示例 1(Python 窗口)

仅使用必需参数运行此工具。

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeLocationAllocationLayer(network, "StoreLocations", "TravelTime")
MakeLocationAllocationLayer 示例 2(Python 窗口)

使用所有参数运行此工具

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeLocationAllocationLayer(network, "NewStores", "TravelTime",
                                    "DEMAND_TO_FACILITY", "MAXIMIZE_ATTENDANCE",
                                    3, 5, "POWER", 2, "",
                                    ["TravelTime", "Meters"], "ALLOW_UTURNS",
                                    ["Oneway"], "NO_HIERARCHY",
                                    "STRAIGHT_LINES", "", "9 AM")
MakeLocationAllocationLayer 示例 3(工作流)

以下独立 Python 脚本演示了如何使用 MakeLocationAllocationLayer 工具选择将为连锁零售店获得最大业务量的商店位置。

# Name: MakeLocationAllocationLayer_Workflow.py
# Description: Choose the store locations that would generate the most business
#              for a retail chain. For this scenario we will perform the
#              location-Allocation analysis using maximize attendance problem
#              type.
# Requirements: Network Analyst Extension

#Import system modules
import arcpy
from arcpy import env
import os

try:
    #Set environment settings
    output_dir = "C:/Data"
    #The NA layer's data will be saved to the workspace specified here
    env.workspace = os.path.join(output_dir, "Output.gdb")
    env.overwriteOutput = True

    #Set local variables
    input_gdb = "C:/Data/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    layer_name = "NewStoreLocations"
    impedance = "TravelTime"
    facilities = os.path.join(input_gdb, "Analysis", "CandidateStores")
    required_facility = os.path.join(input_gdb, "Analysis", "ExistingStore")
    demand_points = os.path.join(input_gdb, "Analysis", "TractCentroids")
    output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")

    #Create a new location-allocation layer. In this case the demand travels to
    #the facility. We wish to find 3 potential store locations out of all the
    #candidate store locations using the maximize attendance model.
    result_object = arcpy.na.MakeLocationAllocationLayer(network, layer_name,
                                                      impedance,
                                                      "DEMAND_TO_FACILITY",
                                                      "MAXIMIZE_ATTENDANCE", 3,
                                                      5, "LINEAR")

    #Get the layer object from the result object. The location-allocation layer
    #can now be referenced using the layer object.
    layer_object = result_object.getOutput(0)

    #Get the names of all the sublayers within the location-allocation layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    facilities_layer_name = sublayer_names["Facilities"]
    demand_points_layer_name = sublayer_names["DemandPoints"]

    #Load the candidate store locations as facilities using default search
    #tolerance and field mappings.
    arcpy.na.AddLocations(layer_object, facilities_layer_name, facilities, "",
                            "", exclude_restricted_elements = "EXCLUDE")

    #Load the existing store location as the required facility. Use the field
    #mappings to set the facility type to requried. We need to append this
    #required facility to existing facilities.
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                    facilities_layer_name)
    field_mappings["FacilityType"].defaultValue = 1
    arcpy.na.AddLocations(layer_object, facilities_layer_name,
                            required_facility, field_mappings, "",
                            append="APPEND",
                            exclude_restricted_elements="EXCLUDE")

    #Load the tract centroids as demand points using default search tolerance
    #Use the field mappings to map the Weight property from POP2000 field.
    demand_field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                    demand_points_layer_name)
    demand_field_mappings["Weight"].mappedFieldName = "POP2000"
    arcpy.na.AddLocations(layer_object, demand_points_layer_name, demand_points,
                          demand_field_mappings, "",
                          exclude_restricted_elements="EXCLUDE")

    #Solve the location-allocation layer
    arcpy.na.Solve(layer_object)

    #Save the solved location-allocation layer as a layer file on disk
    layer_object.saveACopy(output_layer_file)

    print("Script completed successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback, sys
    tb = sys.exc_info()[2]
    print("An error occurred on line %i" % tb.tb_lineno)
    print(str(e))