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

摘要

创建位置分配网络分析图层并设置其分析属性。 位置分配分析图层对于从一组可能位置中选择指定数量的设施点(以便以最佳且高效的方式将需求点分配给设施点)十分有用。 该图层可通过本地网络数据集进行创建,也可通过在线托管服务或门户托管服务进行创建。

使用情况

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

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

  • ArcGIS AllSource 中,网络分析图层数据存储在文件地理数据库要素类中的磁盘上。 在工程中创建网络分析图层时,将在当前工作空间环境的新要素数据集中创建图层数据。 在 Python 脚本中创建网络分析图层时,您必须首先使用 arcpy.env.workspace = "<path to file gdb>" 将工作空间环境显式地设置到想要存储图层数据的文件地理数据库。 创建图层后,将向该文件地理数据库添加一个包含相应子图层要素类的新要素数据集。

参数

标注说明数据类型
网络数据源

将对其执行网络分析的网络数据集或服务。 将门户 URL 用于服务。

Network Dataset Layer;String
图层名称
(可选)

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

String
出行模式
(可选)

分析中使用的出行模式名称。 出行模式为一组网络设置(例如行驶限制和 U 形转弯),用于确定行人、车辆、卡车或其他交通媒介在网络中的移动方式。 出行模式在网络数据源中进行定义。

arcpy.na.TravelMode 对象和包含出行模式有效 JSON 表示的字符串也可用作参数的输入。

String
行驶方向
(可选)

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

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

  • 远离设施点行驶方向从设施点到请求点。 这是默认设置。 消防部门通常使用该设置,因为他们需要关注从消防站行驶到紧急救援位置所需的时间。
  • 朝向设施点行驶方向从请求点到设施点。 零售店通常使用该设置,因为他们需要关注购物者到达商店所需的时间。
String
问题类型
(可选)

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

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

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

可通过在 Cutoff_ [阻抗] 属性中指定请求点子图层中的单个中断值来逐个请求点覆盖中断值。 例如,它可能显示乡村居民愿意走 10 英里远去往某个设施点,而城市居民则只愿意走 2 英里的路程。 可按如下方式对此行为进行建模:将分析图层的中断值设置为 10 并将城区中各请求点的 Cutoff_Miles 值设置为 2。

默认情况下分析不使用中断值。

Double
要查找的设施点数
(可选)

求解程序将查找的设施点数。 默认值为 1。

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

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

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

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

Long
衰减函数类型
(可选)

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

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

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

衰减函数类型参数中指定的方程的参数值。 当将衰减函数类型参数设置为线性时,会忽略参数值。 对于指数选项,应设置非零值。

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

Double
目标市场份额
(可选)

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

Double
容量
(可选)

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

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

Double
时间
(可选)

出发的时间和日期。 出发时间可以来自设施点或请求点,具体取决于出行方向设置为朝向设施点还是远离设施点

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

将您的分析配置为使用以下特殊日期之一来模拟一周中的某天或当前日期,而不是特定的静态日期:

  • 今天 - 12/30/1899
  • 星期日 - 12/31/1899
  • 星期一 - 1/1/1900
  • 星期二 - 1/2/1900
  • 星期三 - 1/3/1900
  • 星期四 - 1/4/1900
  • 星期五 - 1/5/1900
  • 星期六 - 1/6/1900

了解如何在网络分析中使用和解释日期和时间的详细细腻

Date
时区
(可选)

时间参数的时区。

  • 各位置的本地时间时间参数是指设施点或请求点所处的时区。 如果出行方向是从设施点到请求点,此为设施点所处的时区。 如果出行方向是从请求点到设施点,此为请求点所处的时区。 这是默认设置。
  • UTC时间参数指协调世界时间 (UTC)。 如果您需要在指定时间内(如现在)的最佳位置,但不确定设施点或请求点所在的时区,请选择此选项。
String
线状
(可选)

指定输出线形状。

无论选择何种输出 shape 类型,最佳路径始终由网络阻抗(而非欧氏距离)决定。 这表示只是路径形状不同,而对网络进行的基础遍历则相同。

  • 无线将不会为分析的输出生成任何形状。 如果您想求解超大型问题,并且仅对解决方案表感兴趣而不想查看地图中的结果,则此选项十分有用。
  • 直线输出线形状是对设施点及其分配的请求点进行连接的直线。 这是默认设置。
String
累积属性
(可选)

分析过程中要累积的成本属性的列表。 这些累积属性仅供参考;求解程序仅使用求解分析时指定的出行模式所使用的成本属性。

对于每个累积的成本属性,会在网络分析输出要素中填充 Total_[阻抗] 属性。

如果网络数据源为 ArcGIS Online 服务,或如果网络数据源是不支持累积的 Portal for ArcGIS 版本上的服务,则此参数不可用。

String
忽略求解时无效的位置
(可选)

指定是否忽略无效的输入位置。 通常,如果无法在网络上定位,则位置无效。 当无效位置被忽略时,求解器将跳过它们并尝试使用剩余位置执行分析。

  • 选中 - 将忽略无效的输入位置,并且仅使用有效的位置。 这是默认设置。
  • 未选中 - 将使用所有输入位置。 无效的位置将导致分析失败。
Boolean

派生输出

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

新创建的网络分析图层。

Network Analyst Layer

arcpy.management.MakeLocationAllocationAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {travel_direction}, {problem_type}, {cutoff}, {number_of_facilities_to_find}, {decay_function_type}, {decay_function_parameter_value}, {target_market_share}, {capacity}, {time_of_day}, {time_zone}, {line_shape}, {accumulate_attributes}, {ignore_invalid_locations})
名称说明数据类型
network_data_source

将对其执行网络分析的网络数据集或服务。 将门户 URL 用于服务。

Network Dataset Layer;String
layer_name
(可选)

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

String
travel_mode
(可选)

分析中使用的出行模式名称。 出行模式为一组网络设置(例如行驶限制和 U 形转弯),用于确定行人、车辆、卡车或其他交通媒介在网络中的移动方式。 出行模式在网络数据源中进行定义。

arcpy.na.TravelMode 对象和包含出行模式有效 JSON 表示的字符串也可用作参数的输入。

String
travel_direction
(可选)

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

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

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

String
problem_type
(可选)

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

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

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

可通过在 Cutoff_ [阻抗] 属性中指定请求点子图层中的单个中断值来逐个请求点覆盖中断值。 例如,它可能显示乡村居民愿意走 10 英里远去往某个设施点,而城市居民则只愿意走 2 英里的路程。 可按如下方式对此行为进行建模:将分析图层的中断值设置为 10 并将城区中各请求点的 Cutoff_Miles 值设置为 2。

默认情况下分析不使用中断值。

Double
number_of_facilities_to_find
(可选)

求解程序将查找的设施点数。 默认值为 1。

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

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

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

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

Long
decay_function_type
(可选)

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

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

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

String
decay_function_parameter_value
(可选)

decay_function_type 参数中指定的方程的参数值。 当 decay_function_type 参数已设置为 LINEAR 时,将忽略该参数值。 对于 POWEREXPONENTIAL 选项,应设置非零值。

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

Double
target_market_share
(可选)

problem_type 参数设置为 TARGET_MARKET_SHARE 时,要求解的目标市场份额(百分比)。 此为您希望求解的设施点占总请求权重的百分比。 求解程序会求出为占有该值指定的目标市场份额所需的最小设施点数。

Double
capacity
(可选)

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

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

Double
time_of_day
(可选)

出发的时间和日期。 出发时间可以来自设施点或请求点,具体取决于 travel_direction 设置为 TO_FACILITIES 还是 FROM_FACILITIES

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

将您的分析配置为使用以下特殊日期之一来模拟一周中的某天或当前日期,而不是特定的静态日期:

  • 今天 - 12/30/1899
  • 星期日 - 12/31/1899
  • 星期一 - 1/1/1900
  • 星期二 - 1/2/1900
  • 星期三 - 1/3/1900
  • 星期四 - 1/4/1900
  • 星期五 - 1/5/1900
  • 星期六 - 1/6/1900

了解如何在网络分析中使用和解释日期和时间的详细细腻

Date
time_zone
(可选)

时间参数的时区。

  • LOCAL_TIME_AT_LOCATIONS时间参数是指设施点或请求点所处的时区。 如果出行方向是从设施点到请求点,此为设施点所处的时区。 如果出行方向是从请求点到设施点,此为请求点所处的时区。 这是默认设置。
  • UTC时间参数指协调世界时间 (UTC)。 如果您需要在指定时间内(如现在)的最佳位置,但不确定设施点或请求点所在的时区,请选择此选项。
String
line_shape
(可选)

指定输出线形状。

  • NO_LINES将不会为分析的输出生成任何形状。 如果您想求解超大型问题,并且仅对解决方案表感兴趣而不想查看地图中的结果,则此选项十分有用。
  • STRAIGHT_LINES输出线形状是对设施点及其分配的请求点进行连接的直线。 这是默认设置。

无论选择何种输出 shape 类型,最佳路径始终由网络阻抗(而非欧氏距离)决定。 这表示只是路径形状不同,而对网络进行的基础遍历则相同。

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

分析过程中要累积的成本属性的列表。 这些累积属性仅供参考;求解程序仅使用求解分析时指定的出行模式所使用的成本属性。

对于每个累积的成本属性,会在网络分析输出要素中填充 Total_[阻抗] 属性。

如果网络数据源为 ArcGIS Online 服务,或如果网络数据源是不支持累积的 Portal for ArcGIS 版本上的服务,则此参数不可用。

String
ignore_invalid_locations
(可选)

指定是否忽略无效的输入位置。 通常,如果无法在网络上定位,则位置无效。 当无效位置被忽略时,求解器将跳过它们并尝试使用剩余位置执行分析。

  • SKIP无效的输入位置将被忽略,只使用有效的位置。 这是默认设置。
  • HALT将使用所有输入位置。 无效的位置将导致分析失败。
Boolean

派生输出

名称说明数据类型
out_network_analysis_layer

新创建的网络分析图层。

Network Analyst Layer

代码示例

MakeLocationAllocationAnalysisLayer 示例 1(Python 窗口)

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

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

使用所有参数运行此工具

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeLocationAllocationAnalysisLayer(network, "NewStores",
                                    "Driving Time", "TO_FACILITIES",
                                    "MAXIMIZE_ATTENDANCE", 3, 5, "POWER", 2, "",
                                    "", "1/1/1900 9:00 AM", "UTC",
                                    "STRAIGHT_LINES", ["TravelTime", "Meters"])
MakeLocationAllocationAnalysisLayer 示例 3(工作流)

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

# Name: MakeLocationAllocationAnalysisLayer_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 the maximize attendance
#              problem type.
# Requirements: Network Analyst Extension

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

try:
    #Check out Network Analyst license if available. Fail if the Network Analyst license is not available.
    if arcpy.CheckExtension("network") == "Available":
        arcpy.CheckOutExtension("network")
    else:
        raise arcpy.ExecuteError("Network Analyst Extension license is not available.")
    
    #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"
    travel_mode = "Driving Time"
    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.MakeLocationAllocationAnalysisLayer(network,
                                    layer_name, travel_mode, "TO_FACILITIES",
                                    "MAXIMIZE_ATTENDANCE", cutoff=20,
                                    number_of_facilities_to_find=3)

    #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, "",
                                                                            "")

    #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")

    #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, "")

    #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))