摘要
SolveLocationAllocation 工具用于从一组输入位置中选择最佳位置。
该工具的输入包括设施点(用于提供货物或服务)和请求点(消费这些货物和服务)。旨在查找可最有效提供请求点的设施点。此工具通过分析各种将请求点分配到不同设施点的方法来解决此问题。解决方案是将最需要请求的点分配到设施点中并最小化总体行驶的方案。输出包括设施点解、与已分配设施点相关的请求点以及连接请求点与其设施点的线。
可配置位置分配工具以解决特定的问题类型。示例包括以下内容:
零售店要查看需要开发哪些潜在店面位置以占有该区域百分之十的零售市场份额。
消防部门要确定消防站的位置,以便在四分钟的反应时间内可达到社区百分之九十的地方。
警察局会根据以往夜间的犯罪活动预先部署警力。
在暴风雨过后,灾难响应机构要寻找建立伤检分类设施点的最佳位置(具有限病人容量)以帮助受到影响的人员。
插图
用法
如果测量单位参数是基于时间的,则该工具会根据行驶时间选择最好设施点。若测量单位是基于距离的,则工具会基于行驶距离。
为成功执行该工具,您至少需要指定一个设施点和一个请求点。最多可加载 1,000 个设施点和 10,000 请求点。
最多可以添加 250 个点障碍。您可以添加任意数量的线障碍或面障碍,但线障碍的相交数不能超过 500 个街道要素,面障碍的相交数不能超过 2,000 个要素。
求解时可选择使用道路等级以更快地生成结果,但解决方案可能欠佳。
无论是否选中应用等级参数 (True),只要代表请求点或设施点的任何一对要素之间的直线距离大于 50 英里(80.46 公里),便会始终使用等级。
当出行模式设置为步行时或者设置为自定义并且使用步行约束条件时,代表请求点或设施点的任意一对要素之间的直线距离不得大于 50 英里(80.46 千米)。
如果输入点与其最近的可穿过街道之间的距离大于 12.42 英里(20 千米),则将从分析中排除该点。
此工具可在 ArcGIS Pro、ArcMap、ArcGlobe 和 ArcScene 中运行,但不适用于 ArcCatalog。
语法
SolveLocationAllocation_naagol (Facilities, Demand_Points, {Analysis_Region}, Measurement_Units, {Problem_Type}, {Number_of_Facilities_to_Find}, {Default_Measurement_Cutoff}, {Default_Capacity}, {Target_Market_Share}, {Measurement_Transformation_Model}, {Measurement_Transformation_Factor}, {Travel_Direction}, {Time_of_Day}, {Time_Zone_for_Time_of_Day}, {UTurn_Policy}, {Point_Barriers}, {Line_Barriers}, {Polygon_Barriers}, {Use_Hierarchy_in_Analysis}, {Restrictions}, {Attribute_Parameter_Values}, {Allocation_Line_Shape}, {Travel_Mode}, {Impedance}, {Save_Output_Network_Analysis_Layer}, {Overrides})
参数 | 说明 | 数据类型 |
Facilities | 指定一个或多个设施点(最多为 1,000 个)。工具会从您在此处指定的一组设施点中选择最佳位置。 在尝试寻找最具竞争力位置的竞争性分析中,竞争设施点也是在此处指定的。 定义设施点后,可通过使用特性为每个设施点设置属性,例如设施点名称或类型。可通过以下字段指定设施点: Name - 设施点的名称。如果设施点为解的一部分,则该名称将包含在输出分配线的名称中。 FacilityType - 指定设施点是候选设施点、必选设施点、还是竞争设施点。该字段值可指定为以下整数之一(请使用数值代码而非括号中的名称):
Weight - 设施点的相对权重,用于评定设施点的吸引力、有利条件或一个设施点较之另一个设施点的差异。 例如,一个值为 2.0 的权重更好地体现了客户的购物意愿,客户在高权重设施点处购物的意愿强于普通权重设施点处的购物意愿,差距达到 2 倍。可能影响设施点权重的因素包括建筑物面积、街区环境以及建筑物的使用年限。非 1 权重值仅适用于最大化市场份额与目标市场份额两种问题类型;在其他问题类型中会将其忽略。 Capacity - Capacity 字段特定于“最大化有容量限制的覆盖范围”问题类型;其他问题类型将忽略此字段。 容量用于指定该设施点能够供应多少加权请求。即使请求在设施点的默认测量中断范围内,求解程序也不会将超出容量的请求分配到设施点。 分配到 Capacity 字段的任意值会覆盖给定设施点的默认容量参数(Python 中的 Default_Capacity)。 CurbApproach - 指定车辆到达或离开设施点的方向。该字段值可指定为以下整数之一(请使用数值代码而非括号中的名称):
CurbApproach 属性是专为使用以下两种国家驾驶标准而设计的:右侧通行(美国)和左侧通行(英国)。首先,考虑位于车辆左侧的设施点。不管车辆行驶在左车道还是右车道,停靠点始终位于车辆的左侧。不同国家的驾驶标准可能会要求您从这两种方向中的其中一个接近设施点,也就是说,只能从车辆的右侧或左侧接近设施点。例如,如果要到达一个设施点并且在车辆与事件点之间不存在其他交通车道,那么在美国应该选择“车辆的右侧”(1),而在英国应该选择“车辆的左侧”(2)。 | Feature Set |
Demand_Points | 指定一个或多个请求点(最多为 10,000 个)。工具在很大程度上会根据这些设施点对此处所指定的请求点的服务状况来选择最佳设施点。 定义请求点后,可通过使用特性为每个请求点设置属性,例如请求点名称或权重。可通过以下字段指定请求点: Name - 请求点的名称。如果请求点为解的一部分,则该名称将包含在输出分配线的名称中。 GroupName - 请求点所在组的名称。最大化有容量限制的覆盖范围、目标市场份额及最大化市场份额问题类型将忽略此属性。 如果请求点共享组名称,则求解程序会将组的所有成员分配给同一设施点。(如果某些约束(如中断距离)阻止组中的任意请求点到达同一设施点,则不对任何请求点进行分配。) Weight - 请求点的相对权重。权重值为 2.0 表示请求点的重要性是该值为 1.0 的请求点的两倍。如果请求点代表家庭,则权重可表示每个家庭中的人数。 Cutoff_Time - 如果设施点超出此处所示的行驶时间,则无法将请求点分配至该设施点。此字段值将覆盖默认测量中断参数值。 该属性值的单位由测量单位参数指定。仅在测量单位基于时间时,才能在分析中引用属性值。默认值为空,这表示不存在覆盖中断。 Cutoff_Distance - 如果设施点超出此处所示的行驶距离,则无法将请求点分配至该设施点。此字段值将覆盖默认测量中断参数值。 该属性值的单位由测量单位参数指定。仅在测量单位基于距离时,才能在分析中引用属性值。默认值为空,这表示不存在覆盖中断。 CurbApproach - 指定车辆到达或离开请求点的方向。该字段值可指定为以下整数之一(请使用数值代码而非括号中的名称):
CurbApproach 属性是专为使用以下两种国家驾驶标准而设计的:右侧通行(美国)和左侧通行(英国)。首先,考虑位于车辆左侧的请求点。不管车辆行驶在左车道还是右车道,停靠点始终位于车辆的左侧。您决定从哪个方向到达请求点(也就是说,请求点必须位于车辆的右侧还是左侧)可能会随国家驾驶标准而有所不同。例如,如果要到达一个请求点并且在车辆与请求点之间不存在其他交通车道,那么在美国应该选择“车辆的右侧”(1),而在英国应该选择“车辆的左侧”(2)。 | Feature Set |
Analysis_Region (可选) | 指定要进行分析的区域。如果未对此参数指定值,工具会基于输入点的位置自动计算区域名称。为加快工具执行,建议设置区域名称。要指定区域,请使用以下值之一:
| String |
Measurement_Units | 指定用于测量请求点和设施点之间行驶时间或行驶距离的单位。工具将根据哪些设施点可通过最少量的行程达到最大量的加权请求,或者通过最少量的行程实现最大量的加权请求可到达哪些设施点来选择最佳设施点。 输出分配线使用不同的单位来报告行驶距离或行驶时间,其中包括您为此参数指定的单位。这些选择包括
| String |
Problem_Type (可选) | 指定位置分配分析的目标。默认的目标为最小化阻抗。
| String |
Number_of_Facilities_to_Find (可选) | 指定求解程序应选择的设施点数。默认值为 1。 始终要首先选择 FacilityType 字段值为 1(必选项)的设施点。要选择的任何额外设施点都将从候选设施点中选取,它们的 FacilityType 字段值为 2。 在求解前所有 FacilityType 值为 3(已选项)的设施点在求解时都将视为候选设施点。 如果要查找的设施点数低于必选设施点数,则出现错误。 对于“最小化设施点数”和“目标市场份额”问题类型,禁用了要查找的设施点数,因为求解程序需要确定满足目标时所需的设施点的最少个数。 | Long |
Default_Measurement_Cutoff (可选) | 指定请求点与其分配到的设施点之间所允许的最大行驶时间或行驶距离。如果请求点位于设施点中断范围之外,则不会被分配给此设施点。 默认值为无,表示不应用中断限制。 该参数的单位与通过测量单位参数指定的单位相同。 行驶时间或距离中断是按照沿道路行驶的最短路径测量的。 此属性可用于对人们为前往商店而愿意行进的最大距离,以及消防站到达社区中任一请求点所允许的最大时间进行建模。 请注意,请求点具有 Cutoff_Time 和 Cutoff_Distance 字段,如果进行相应设置,这些字段将覆盖默认测量中断参数。您可能会发现,乡村居民愿意走 10 英里远去往某个设施点,而城镇居民则只愿意走 2 英里的路程。假设将测量单位设置为英里,可按如下方式对此行为进行建模:将默认测量中断设置为 10 并将城区中请求点的 Cutoff_Distance 字段值设置为 2。 | Double |
Default_Capacity (可选) | 此属性特定于“最大化有容量限制的覆盖范围”问题类型。它是在分析中分配到所有设施点的默认容量。您可以通过在设施点的容量字段中指定值来覆盖设施点的默认容量。 默认值为 1。 | Double |
Target_Market_Share (可选) | 此参数特定于“目标市场份额”问题类型。它是您希望已选和必选设施点占总请求权重的百分比。求解程序会求出为占有此处所指定目标市场份额所需的最小设施点数。 默认值为 10%。 | Double |
Measurement_Transformation_Model (可选) | 此属性可设置对设施点与请求点间网络成本进行变换的方程。它还可与阻抗参数结合使用,指定设施点与请求点间的网络阻抗对于求解程序选择设施点的影响的严重程度。 在以下变换选项的列表中,d 指的是请求点,f 指的是设施点。阻抗是指两个位置之间的最短行驶距离或时间。所以阻抗df 即为请求点 d 与设施点 f 之间的最短路径(时间或距离),成本df 即为设施点与请求点之间变换的行驶时间或距离。Lambda (λ) 表示阻抗参数。测量单位设置决定了是分析行驶时间还是行驶距离。
| String |
Measurement_Transformation_Factor (可选) | 为测量变换模型参数中指定的方程提供参数值。当阻抗变换的类型为线性时会忽略参数值。对于幂阻抗变换和指数阻抗变换,应设置非零值。 默认值为 1。 | Double |
Travel_Direction (可选) | 指定是测量从设施点到请求点还是从请求点到设施点的行驶时间或行驶距离。默认值是测量从设施点到请求点的行驶时间或距离。
行驶时间和距离可能会随行驶方向的不同而发生改变。由于单行道和转弯限制,从点 A 行驶到点 B 时可能会比从点 B 行驶到点 A 时交通更畅通或者路径更短。例如,从点 A 行驶到点 B 可能只需要 10 分钟,而反过来可能需要 15 分钟。这些测量差异可能会影响到请求点是否因中断而能够被分配到特定的设施点,或者在分配请求的问题类型中,可能会影响所争取到的请求数量。 消防部门通常按从设施点到请求点的方向进行测量,因为他们需要关注从消防站行驶到紧急救援位置所花的时间。零售商店则更关注顾客到达商店所花的时间;因此,商店通常按从请求点到设施点的方向进行测量。 行驶方向还决定了所提供的任何开始时间的意义。有关详细信息,请参阅时间参数。 | String |
Time_of_Day (可选) | 指定行进的开始时间。如果测量单位不是基于时间的,则忽略此属性。默认值是无时间或日期。如果未指定时间,求解程序将使用通用速度,通常为所发布限速要求中的速度。 在实际生活中,交通流量是不断变化的,设施点和请求点之间的行驶时间也会随着交通流量的变化而波动。因此,通过多次分析指示的不同时间和日期值可能会影响到将请求分配给设施点的方式以及和结果中所选的设施点。 时间始终表示开始时间。但行驶可能从设施点也可能从请求点开始;具体取决于对行驶方向参数进行的选择。 时间的时区参数指定该时间和日期是参考 UTC 还是设施点或请求点所在时区。 | Date |
Time_Zone_for_Time_of_Day (可选) | 指定时间参数的时区。默认值为本地地理位置。
无论时间的时区如何设置,如果您的设施点和请求点在多个时区中,则工具将强制执行以下规则:
| String |
UTurn_Policy (可选) | 交汇点的 U 形转弯策略。允许 U 形转弯表示求解程序可以在交汇点处转向并沿同一街道往回行驶。考虑到交汇点表示街道交叉路口和死角,不同的车辆可以在某些交汇点转弯,而在其他交汇点则不行 - 这取决于交汇点是交叉路口还是死角。为适应此情况,U 形转弯策略参数由连接到交汇点的边数或街道数隐性指定,这称为交汇点原子价。此参数可接受的值如下所列;每个值的后面是根据交汇点原子价对其含义的描述。
除非将出行模式设置为自定义,否则会忽略此参数。 | String |
Point_Barriers (可选) | 指定一个或多个点作为临时限制,或显示在基础街道上行驶可能需要的附加时间或距离。例如,点障碍可用来显示一棵沿街倒下的树或是铁路道口上的时间延迟。 工具限制了可添加为障碍的点不得超过 250 个。 指定点障碍后,可通过使用特性为每个事件点设置属性,例如其名称或障碍类型。可通过以下属性指定点障碍: Name:障碍名称。 BarrierType:指定点障碍是完全限制通行还是增加通过障碍时的时间或距离。此特性值可指定为以下整数之一(请使用数值代码而非括号中的名称):
Additional_Time:表示穿越障碍时会增加的行驶时间。此字段仅适用于增加成本型障碍且仅在测量单位基于时间时适用。此字段的值必须大于或等于零,并且其单位与“测量单位”参数中指定的单位相同。 Additional_Distance:表示穿越障碍时会增加的距离。此字段仅适用于增加成本型障碍且仅在测量单位基于距离时适用。此字段的值必须大于或等于零,并且其单位与“测量单位”参数中指定的单位相同。 | Feature Set |
Line_Barriers (可选) | 指定一条或多条线,这些线相交的街道上禁止通行。例如,线障碍可用于对阻塞若干个路段交通的游行或抗议队伍进行建模。线障碍还可用于快速隔离多条道路使其禁止被穿越,从而在可能的路径中去除不符合要求的街道网络部分。 该工具限制了您可以使用“线障碍”参数限制的街道数量。可指定为线障碍的线数没有限制时,所有线的相交街道的合并数不能超过 500。 指定线障碍时,可使用以下特性为每个障碍设置名称属性: Name:障碍名称。 | Feature Set |
Polygon_Barriers (可选) | 指定面,该面完全限制通行或按比例调整行驶在面相交的街道上所需的行驶时间或距离。 该服务限制了您可以使用“面障碍”参数限制的街道数量。可指定为面障碍的面数没有限制时,所有面的相交街道的合并数不能超过 2,000。 指定面障碍时,可通过使用特性为每个面障碍设置属性,例如名称或障碍类型。可通过以下属性指定面障碍: Name:障碍名称。 BarrierType:指定障碍的存在会完全禁止通行还是按比例调整行程时间或距离。该字段值可指定为以下整数之一(请使用数值代码而非括号中的名称):
ScaledTimeFactor:它是与障碍相交街道的行驶时间要乘以的因子。此字段仅适用于调整成本型障碍且仅在测量单位基于时间时适用。该字段值必须大于零。 ScaledDistanceFactor:它是与障碍相交街道的距离要乘以的因子。此属性仅适用于调整成本型障碍且仅在测量单位基于距离时适用。该属性值必须大于零。 | Feature Set |
Use_Hierarchy_in_Analysis (可选) | 指定是否应在查找设施点和请求点之间的最短路径时使用等级。
如果设施点和请求点间的直线距离大于 50 英里,即使您已设置此参数为不使用等级,工具也会自动转换为使用等级。 | Boolean |
Restrictions (可选) | 指定查找设施点和请求点间的最佳路径时工具应使用的约束条件。 限制表示行驶偏好或要求。大多数情况下,限制条件会导致道路禁行。例如,使用“避开收费公路”限制的结果是,仅在访问某一事件点或设施点必须借道收费公路时,才会生成一条包含该收费公路的路径。高度限制则使您可以绕开低于车辆高度的间隙。如果车辆上装载着腐蚀性物质,使用“禁止任何危险物品”限制可以防止在标记着运输腐蚀性材料为非法行为的路上运输这些材料。 以下是可用限制的列表和简短描述。 该工具支持以下限制:
| String |
Attribute_Parameter_Values (可选) | 指定某些限制需要的其他值,例如“重量限制”要求的车辆重量。您也可以使用属性参数指定限制对使用限制的行程是禁止、避免还是首选。如果该限制要避免或首选道路,您可以使用此参数进一步指定要避免或首选的程度。例如,您可以选择从不使用收费公路,尽可能地避开它们,或甚至格外倾向于使用它们。 如果指定了要素类的“属性参数值”参数,则要素类上的字段名称必须如下所示与字段相匹配: AttributeName:列出限制名称。 ParameterName:列出与限制相关的参数名称。限制根据其用途可有一个或多个 ParameterName 字段值。 ParameterValue:工具在评估限制时使用的 ParameterName 的值。 “属性参数值”取决于“限制”参数。仅当限制名称指定为“限制”参数值时,ParameterValue 字段才可用。 在“属性参数值”中,每个限制(以 AttributeName 形式列出)具有一个 ParameterName 字段值,指定限制的行程是禁止、避免还是首选的“限制用法”与道路选择避免或首选的限制和程度相关联。可为限制用法 ParameterName 分配下列字符串值,或在括号内列出等效数值:
大多数情况下,如果限制取决于车辆特征(如车辆高度),则可以使用“限制用法”的默认值 PROHIBITED。但是在某些情况下,“限制用法”的值取决于您的路径偏好。例如,“避开收费公路”限制具有“限制用法”参数的默认值 AVOID_MEDIUM。这表示在使用限制时,在可能的情况下工具会试图绕开收费公路。AVOID_MEDIUM 也表示查找最佳路径时避开收费公路的重要性,即优先级为中等。选择 AVOID_LOW 会降低避开收费公路的重要性;而选择 AVOID_HIGH 则会增加其重要性,因此服务为避开收费公路而生成更长的路径时更容易为人所接受。选择 PROHIBITED 则会完全不允许在收费公路上行驶,因此路径不可能经过收费公路的所有部分。但是请注意,避开或禁止收费公路并由此避开公路通行费只是一部分人的目的;对另外一部分人来说,因为避开拥堵的交通比交一些公路通行费更为重要,会宁愿走收费公路。在后一种情况中,您可以选择 PREFER_LOW、PREFER_MEDIUM 或 PREFER_HIGH 作为“限制用法”的值。首选的等级越高,工具为了在与限制相关的道路上行驶就会绕行更远的路程。 | Record Set |
Allocation_Line_Shape (可选) | 默认值为输出直线。 指定工具输出的线要素的类型。参数可接受以下值之一:
无论选择哪种分配线形状参数值, 最短路径始终通过最大限度地缩短行驶时间或行驶距离,而不是使用请求点和设施点间的直线距离来确定。也就是说,此参数只更改输出线形状;而不更改测量方法。 | String |
Travel_Mode (可选) | 指定用于在分析中建模的交通模式。出行模式在 ArcGIS Online 中进行管理,组织管理员可通过对其进行配置更好地反映组织工作流。您需要指定组织所支持的出行模式名称。 要获取受支持出行模式名称的列表,请使用与访问此工具时使用的相同 GIS 服务器连接,并在实用程序工具箱中运行 GetTravelModes。GetTravelModes 会将表和支持的出行模式添加到应用程序中。可将“支持的出行模式”表中“出行模式名称”字段的任何值指定为输入。您还可以将“出行模式设置”字段中的值指定为输入。由于工具不必查找基于出行模式名称的设置,因而加快了工具执行。 默认值,自定义,可以使用自定义出行模式参数(在交汇点处 U 形转弯、应用等级、限制、属性参数值和阻抗)配置您自己的出行模式。自定义出行模式参数的默认值对使用汽车的出行方式建模。您可能希望选择自定义并设置上述自定义出行模式参数,从而以快速步行速度对行人建模,或以给定高度、重量和特定危险材料货物对卡车建模。您可以选择执行此操作来尝试不同的设置以获取想得到的分析结果。一旦确定了分析设置,您应该使用组织管理员身份并将这些设置保存为新建或现有出行模式的一部分,以便您组织中的所有人均返回相同设置的分析。 | String |
Impedance (可选) | 指定阻抗,其值表示沿交通网络的路段或其他部分行进所需的精力或成本。 行程距离是一种阻抗,可将以千米表示的道路长度作为阻抗。从这个意义上,行程距离对所有模式均相同,即对行人而言 1 千米的距离对汽车而言也是 1 千米。(但不同模式所允许行进的线路可能会有变化,而这会影响两点间的距离,可通过出行模式设置对此进行建模。) 行程时间也可以是一种阻抗,比如,汽车花费一分钟沿空无一人的道路行驶一公里。行程时间会随出行模式的不同而不同(行人可能需要 20 多分钟才能走完一公里),所以在建模时为出行模式选择正确的阻抗非常重要。 从以下阻抗值中选择:
除非将出行模式设置为自定义(这是默认值),否则会忽略您为此参数提供的值。 如果选择行驶时间、货运时间或步行时间,则必须将测量单位参数设置为基于时间的值,如果为阻抗选择了行程距离,则测量单位必须为基于距离的值。 | String |
Save_Output_Network_Analysis_Layer (可选) | 指定工具是否应将分析设置保存为网络分析图层文件。即使在 ArcGIS Desktop 应用程序(例如 ArcMap)中打开文件,仍然无法直接使用此文件。需要将其发送至 Esri 技术支持以诊断工具所返回结果的质量。
| Boolean |
Overrides (可选) | 求解网络分析问题时,指定可影响求解程序行为的其他设置。 需要在 JavaScript 对象表示法 (JSON) 中指定此参数的值。例如,有效值的格式如下:{"overrideSetting1" : "value1", "overrideSetting2" : "value2"}。覆盖设置名称始终以双引号括起。该值可以是数字、布尔值或字符串。 此参数的默认值为无值,表示不覆盖任何求解程序设置。 覆盖是高级设置,应仅在谨慎分析应用设置前后得到的结果之后使用。要获得每个求解程序支持的覆盖设置及其可接受值的列表,请联系 Esri 技术支持。 | string |
代码示例
求解位置分配示例
以下 Python 脚本演示了如何在脚本中使用 SolveLocationAllocation 工具。
import arcpy
import time
import sys
username = "<your user name>"
password = "<your password>"
LA_service = "http://logistics.arcgis.com/arcgis/services;World/LocationAllocation;{0};{1}".format(username, password)
#Add the geoprocessing service as a toolbox. Use an alias when importing
arcpy.ImportToolbox(LA_service, "agol")
#Set the variables to call the tool
facilities = r'C:/data/Inputs.gdb/Stores'
demandPoints = r'C:/data/Inputs.gdb/Customers'
output_lines = r'C:/data/Results.gdb/Lines'
output_facilities = r'C:/data/Results.gdb/Facilities'
output_demandPoints = r'C:/data/Results.gdb/DemandPoints'
#Call the tool
result = arcpy.agol.SolveLocationAllocation(facilities, demandPoints, "Minutes",
Problem_Type="Maximize Attendance",
Number_of_Facilities_to_Find=2,
Default_Measurement_Cutoff=10.0)
#Check the status of the result object every 0.5 seconds
#until it has a value of 4(succeeded) or greater
while result.status < 4:
time.sleep(0.5)
#print any warning or error messages returned from the tool
result_severity = result.maxSeverity
if result_severity == 2:
print "An error occured when running the tool"
print result.getMessages(2)
sys.exit(2)
elif result_severity == 1:
print "Warnings were returned when running the tool"
print result.getMessages(1)
#Get the output routes and save to a local geodatabase
result.getOutput(1).save(output_lines)
result.getOutput(2).save(output_facilities)
result.getOutput(3).save(output_demandPoints)
环境
此工具不使用任何地理处理环境。