空间连接 (Analysis)
用法
空间连接是指根据要素的相对空间位置将连接要素中的行匹配到目标要素中的行。
默认情况下,连接要素的所有属性会被追加到目标要素的属性中并复制到输出要素类。通过在连接要素的字段映射参数中控制这些属性,可以定义将写入到输出中的属性。
始终会向输出要素类添加两个新字段:Join_Count 和 TARGET_FID。Join_Count 指示与每个目标要素 (TARGET_FID) 匹配的连接要素数量。
在连接操作参数中指定 JOIN_ONE_TO_MANY 时,将另一个新的字段 JOIN_FID 添加到输出。
当连接操作参数为 JOIN_ONE_TO_MANY 时,输出要素类中的每个目标要素都可以包含一个或多个行。使用 JOIN_FID 字段更易于确定所连接的要素与目标要素 (TARGET_FID) 的具体对应关系。JOIN_FID 字段的值为 -1,表示没有任何要素符合使用目标要素指定的空间关系。
将所有输入目标要素写入到输出要素类的前提是:
- 将连接操作设置为 JOIN_ONE_TO_ONE,并且选中
- 保留所有目标要素(在脚本中设置为 KEEP_ALL)。
连接要素的字段映射参数中指定的合并规则仅适用于连接要素中的属性,且仅适用于多个要素与目标要素匹配 (Join_Count > 1) 的情况。例如,如果连接 DEPTH 属性值分别为 15.5、2.5 和 3.3 的三个要素,并应用“平均值”合并规则,则输出字段的值为 6.1。在进行统计计算时忽略连接字段中的空值。例如,15.5、<空> 和 2.5 将得出的结果为:“平均值”为 9.0,“计数”为 2。
将匹配选项设置为“CLOSEST”时,可能会出现两个或多个连接要素与目标要素距离相等的情况。如果发生这种情况,将随机选择其中一个连接要素作为匹配要素(连接要素的 FID 对随机选择过程没有影响)。如果要查找排在第 2 位、第 3 位或第 N 位的最近要素,请使用生成近邻表工具。
如果连接要素与多个目标要素具有空间关系,则在根据目标要素对其进行匹配时进行多次计数。例如,如果点位于三个面内,则该点将计数三次,即每个面计数一次。
语法
参数 | 说明 | 数据类型 |
target_features |
目标要素的属性和被连接要素的属性被传递到输出要素类。但是,可以在字段映射参数中定义属性的子集。目标要素可以是 ArcGIS 支持的任意空间数据源。 | Feature Layer |
join_features |
连接要素的属性将被连接到目标要素的属性中。有关连接操作的类型对所连接属性聚合的影响的详细信息,请参阅连接操作参数的说明。 | Feature Layer |
out_feature_class |
包含目标要素和连接要素的属性的新要素类。默认情况下,目标要素的所有属性和被连接要素的属性都被写入到输出。但是,可通过字段映射参数来控制要传递的属性集。 | Feature Class |
join_operation (可选) |
在具有相同空间关系的目标要素和连接要素之间存在一对多关系时,确定输出要素类中目标要素和连接要素之间的连接方式。
| String |
join_type (可选) |
确定是在输出要素类中保留所有目标要素(称为外部连接),还是仅保留那些与连接要素有指定空间关系的目标要素(称为内部连接)。
| Boolean |
field_mapping (可选) |
控制输出要素类中要包含的属性字段。初始列表包含目标要素和连接要素中的所有字段。可以添加、删除、重命名字段或更改字段的属性。目标要素中的所选字段按原样传递,但连接要素中的所选字段可能会根据合并规则进行聚合。有关字段映射的详细信息,请参阅使用字段映射控件和将输入字段映射到输出字段。可以指定多个字段和统计数据组合。 | Field Mappings |
match_option (可选) |
定义用于匹配行的条件。匹配选项包括:
| String |
search_radius (可选) |
如果连接要素与目标要素的距离在此范围内,则有可能进行空间连接。仅当指定了空间关系(匹配选项) INTERSECT、WITHIN_A_DISTANCE、HAVE_THEIR_CENTER_IN 或 CLOSEST 时,搜索半径才有效。空间关系为 INTERSECT 时使用 100 米作为搜索半径表示:如果连接要素位于目标要素周围 100 米范围内,则认为该连接要素匹配。 | Linear unit |
distance_field_name (可选) |
添加到输出要素类中的字段的名称,其中包含目标要素和最近连接要素之间的距离。仅当将空间关系(匹配选项)指定为 CLOSEST 时,此选项才有效。如果在搜索半径内没有任何匹配的要素,则此字段的值为 -1。如果未指定字段名称,将不会向输出要素类中添加该字段。 | String |
代码实例
以下脚本演示了如何在 Python 窗口中使用空间连接 (SpatialJoin) 函数。
import arcpy
target_features = "C:/data/usa.gdb/states"
join_features = "C:/data/usa.gdb/cities"
out_feature_class = "C:/data/usa.gdb/states_cities"
arcpy.SpatialJoin_analysis(target_features, join_features, out_feature_class)
以下独立脚本演示了如何使用空间连接 (SpatialJoin) 将城市的属性连接到州。
# Name: SpatialJoin_Example2.py
# Description: Join attributes of cities to states based on spatial relationships.
# Requirements: os module
# Import system modules
import arcpy
import os
# Set local variables
workspace = r"C:\gpqa\mytools\spatialjoin\usa.gdb"
outWorkspace = r"C:\gpqa\mytools\spatialjoin\output.gdb"
# Want to join USA cities to states and calculate the mean city population
# for each state
targetFeatures = os.path.join(workspace, "states")
joinFeatures = os.path.join(workspace, "cities")
# Output will be the target features, states, with a mean city population field (mcp)
outfc = os.path.join(outWorkspace, "states_mcp2")
# Create a new fieldmappings and add the two input feature classes.
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(targetFeatures)
fieldmappings.addTable(joinFeatures)
# First get the POP1990 fieldmap. POP1990 is a field in the cities feature class.
# The output will have the states with the attributes of the cities. Setting the
# field's merge rule to mean will aggregate the values for all of the cities for
# each state into an average value. The field is also renamed to be more appropriate
# for the output.
pop1990FieldIndex = fieldmappings.findFieldMapIndex("POP1990")
fieldmap = fieldmappings.getFieldMap(pop1990FieldIndex)
# Get the output field's properties as a field object
field = fieldmap.outputField
# Rename the field and pass the updated field object back into the field map
field.name = "mean_city_pop"
field.aliasName = "mean_city_pop"
fieldmap.outputField = field
# Set the merge rule to mean and then replace the old fieldmap in the mappings object
# with the updated one
fieldmap.mergeRule = "mean"
fieldmappings.replaceFieldMap(pop1990FieldIndex, fieldmap)
# Delete fields that are no longer applicable, such as city CITY_NAME and CITY_FIPS
# as only the first value will be used by default
x = fieldmappings.findFieldMapIndex("CITY_NAME")
fieldmappings.removeFieldMap(x)
y = fieldmappings.findFieldMapIndex("CITY_FIPS")
fieldmappings.removeFieldMap(y)
#Run the Spatial Join tool, using the defaults for the join operation and join type
arcpy.SpatialJoin_analysis(targetFeatures, joinFeatures, outfc, "#", "#", fieldmappings)