Spatial Join (Analysis)

Summary

Joins attributes from one feature to another based on the spatial relationship. The target features and the joined attributes from the join features are written to the output feature class.

Learn more about Spatial Join relationships by feature type

Usage

  • A spatial join matches rows from the Join Features values to the Target Features values based on their relative spatial locations.

  • By default, all attributes of the join features are appended to attributes of the target features and copied to the output feature class. You can define which attributes will be written to the output using the Field Map parameter.

  • Two new fields, Join_Count and TARGET_FID, will be added to the output feature class. The Join_Count field indicates the number of join features that match each target feature (TARGET_FID).

    Another new field, JOIN_FID, will be added to the output when Join one to many is specified for the Join Operation parameter.

  • When the Join Operation parameter is set to Join one to many, there can be more than one row in the output feature class for each target feature. Use the JOIN_FID field to determine which feature is joined to which target feature (TARGET_FID). A value of -1 for the JOIN_FID field means no feature meets the specified spatial relationship with the target feature.

  • All input target features will be written to the output feature class if both of the following apply:

    • Join Operation is set to Join one to one.
    • Keep All Target Features is checked.

  • To permanently transfer fields to the target feature class, use the Add Spatial Join tool with its Permanently Join Fields parameter checked.

  • Use the Field Map parameter to manage the fields and their content in the output dataset.

    • Add and remove fields from the fields list, reorder the fields list, and rename fields.
    • The default data type of an output field is the same as the data type of the first input field (of that name) it encounters. You can change the data type to another valid data type.
    • Use an action to determine how values from one or multiple input fields will be merged into a single output field. The available actions are First, Last, Concatenate, Sum, Mean, Median, Mode, Minimum, Maximum, Standard Deviation, and Count.
    • When using the Concatenate action, you can specify a delimiter such as a comma or other characters. Click the start of the Delimiter text box to add the delimiter characters.
    • Standard Deviation is not a valid option for single input values.
    • Use the Slice Text button on text source fields to choose which characters from an input value will be extracted to the output field. To access the Slice Text button, hover over a text field in the input fields list; then specify the start and end character positions.
    • Fields can also be mapped using Python scripts.

  • Actions specified in the Field Map parameter only apply to attributes from the join features and when more than one feature is matched to a target feature (when Join_Count > 1). For example, if three features with DEPTH attribute values of 15.5, 2.5, and 3.3 are joined, and the Mean action is applied, the output field will have a value of 6.1. Null values in join fields are ignored for statistic calculation. For example, 15.5, a null value, and 2.5 will result in 9.0 for Mean and 2 for Count.

  • When the Match Option parameter is set to Closest or Closest geodesic, two or more join features may be the same distance from the target feature. When this occurs, one of the join features will be randomly selected as the matching feature (the join feature's object ID does not influence this random selection). To find the second, third, or nth closest feature, use the Generate Near Table tool.

    Learn more about how proximity is calculated

  • If a join feature has a spatial relationship with multiple target features, it will be counted as many times as it is matched with the target feature. For example, if a point is in three polygons, the point will be counted three times, once for each polygon.

  • The Matching Attributes parameter filters the features that will be matched by the spatial relationship specified in the Match Option parameter. Specify fields from the join and target features that must have matching attributes in addition to their spatial relationship.

  • For more information about using the Intersect 3D and Within a distance 3D spatial relationships, see Select By Location: 3D relationships.

Parameters

LabelExplanationData Type
Target Features

The attributes from the target features and the attributes from the joined features will be transferred to the output feature class. However, a subset of attributes can be defined by the field map parameter.

Feature Layer
Join Features

The attributes from the join features will be joined to the attributes of the target features. See the explanation of the Join Operation parameter for details on how the aggregation of joined attributes are affected by the type of join operation.

Feature Layer
Output Feature Class

A new feature class containing the attributes of the target and join features. By default, all attributes of the target features and the attributes of the joined features will be written to the output. However, the set of attributes to be transferred can be defined by the field map parameter.

Feature Class
Join Operation
(Optional)

The operation that will join the target features and join features in the output feature class if multiple join features are found that have the same spatial relationship with a single target feature.

  • Join one to oneIf multiple join features are found that have the same spatial relationship with a single target feature, the attributes from the multiple join features will be aggregated using a field map merge rule. For example, if a point target feature is found within two separate polygon join features, the attributes from the two polygons will be aggregated before being transferred to the output point feature class. If one polygon has an attribute value of 3 and the other has a value of 7, and a Sum merge rule is specified, the aggregated value in the output feature class will be 10. This is the default.
  • Join one to manyIf multiple join features are found that have the same spatial relationship with a single target feature, the output feature class will contain multiple copies (records) of the target feature. For example, if a single point target feature is found within two separate polygon join features, the output feature class will contain two copies of the target feature: one record with the attributes of one polygon and another record with the attributes of the other polygon.
String
Keep All Target Features
(Optional)

Specifies whether all target features will be maintained in the output feature class (an outer join) or only those that have the specified spatial relationship with the join features (an inner join).

  • Checked—All target features will be maintained in the output (outer join). This is the default.
  • Unchecked—Only those target features that have the specified spatial relationship with the join features will be maintained in the output feature class (inner join). For example, if a point feature class is specified for the target features, and a polygon feature class is specified for the join features with a Match Option value of Within, the output feature class will only contain those target features that are within a polygon join feature. Any target features not within a join feature will be excluded from the output.
Boolean
Field Map
(Optional)

The fields that will be included in the output feature class with their respective properties and source fields. The output includes all fields from the join and target features by default.

Use the field map to add, delete, rename, and reorder fields, as well as change other field properties.

The field map can be used to combine values from two or more input fields into a single output field.

Field Mappings
Match Option
(Optional)

Specifies the criteria that will be used to match rows.

  • IntersectThe features in the join features will be matched if they intersect a target feature. This is the default. Specify the distance in the Search Radius parameter.
  • Intersect 3D The features in the join features will be matched if they intersect a target feature in three-dimensional space (x, y, and z). Specify the distance in the Search Radius parameter.
  • Within a distanceThe features in the join features will be matched if they are within a specified distance of a target feature. Specify the distance in the Search Radius parameter.
  • Within a distance geodesicThis is the same as Within a distance except that geodesic distance is used rather than planar distance. Distance between features will be calculated using a geodesic formula that takes into account the curvature of the spheroid and correctly handles data near and across the dateline and poles. Use this option if the data covers a large geographic extent or the coordinate system of the inputs is unsuitable for distance calculations.
  • Within a distance 3DThe features in the join features will be matched if they are within a specified distance of a target feature in three-dimensional space. Specify the distance in the Search Radius parameter.
  • ContainsThe features in the join features will be matched if a target feature contains them. The target features must be polygons or polylines. For this option, the target features cannot be points, and the join features can only be polygons when the target features are also polygons.
  • Completely containsThe features in the join features will be matched if a target feature completely contains them. A polygon can completely contain any feature. A point cannot completely contain any feature, not even a point. A polyline can completely contain only polyline and point features.
  • Contains ClementiniThis spatial relationship produces the same results as Completely contains except that if the join feature is entirely on the boundary of the target feature (no part is properly inside or outside) the feature will not be matched. Clementini defines the boundary polygon as the line separating inside and outside, the boundary of a line is defined as its end points, and the boundary of a point is always empty.
  • WithinThe features in the join features will be matched if a target feature is within them. This is the opposite of Contains. For this option, the target features can only be polygons when the join features are also polygons. A point can be a join feature only if a point is the target.
  • Completely withinThe features in the join features will be matched if a target feature is completely within them. This is the opposite of Completely contains.
  • Within ClementiniThe result will be identical to Within except if the entirety of the feature in the join features is on the boundary of the target feature, the feature will not be matched. Clementini defines the boundary polygon as the line separating inside and outside, the boundary of a line is defined as its end points, and the boundary of a point is always empty.
  • Are identical toThe features in the join features will be matched if they are identical to a target feature. Both join and target feature must be of the same shape type—point to point, line to line, or polygon to polygon.
  • Boundary touchesThe features in the join features will be matched if they have a boundary that touches a target feature. When the target and join features are lines or polygons, the boundary of the join feature can only touch the boundary of the target feature and no part of the join feature can cross the boundary of the target feature.
  • Share a line segment withThe features in the join features will be matched if they share a line segment with a target feature. The join and target features must be lines or polygons.
  • Crossed by the outline ofThe features in the join features will be matched if a target feature is crossed by their outline. The join and target features must be lines or polygons. If polygons are used for the join or target features, the polygon's boundary (line) will be used. Lines that cross at a point will be matched; lines that share a line segment will not be matched.
  • Have their center inThe features in the join features will be matched if a target feature's center falls within them. The center of the feature is calculated as follows: For polygon and multipoint, the geometry's centroid is used, and for line input, the geometry's midpoint is used. Specify the distance in the Search Radius parameter.
  • ClosestThe feature in the join features that is closest to a target feature will be matched. See the usage tip for more information. Specify the distance in the Search Radius parameter.
  • Closest geodesicThis is the same as Closest except that geodesic distance is used rather than planar distance. Use this option if the data covers a large geographic extent or the coordinate system of the inputs is unsuitable for distance calculations
  • Largest overlapThe feature in the join features will be matched with the target feature with the largest overlap.
String
Search Radius
(Optional)

Join features within this distance of a target feature will be considered for the spatial join. A search radius is only valid when the spatial relationship is specified (the Match Option parameter is set to Intersect, Within a distance, Within a distance geodesic, Have their center in, Closest, or Closest geodesic). For example, using a search radius of 100 meters with the Within a distance spatial relationship will join feature within 100 meters of a target feature. For the three within-a-distance relationships, if no value is specified for Search Radius, a distance of 0 is used.

Linear Unit
Distance Field Name
(Optional)

The name of the field that contains the distance between the target feature and the closest join feature. This field will be added to the output feature class. This parameter is only valid when the spatial relationship is specified (Match Option is set to Closest or Closest geodesic). The value of this field is -1 if no feature is matched within a search radius. If no field name is provided, the field will not be added to the output feature class.

String
Match Fields
(Optional)

Pairs of fields from the join features and target features that will be used for attribute matching. Only the records from the join features that share match field values with the target features will participate in the spatial join.

Value Table

arcpy.analysis.SpatialJoin(target_features, join_features, out_feature_class, {join_operation}, {join_type}, {field_mapping}, {match_option}, {search_radius}, {distance_field_name}, {match_fields})
NameExplanationData Type
target_features

The attributes from the target features and the attributes from the joined features will be transferred to the output feature class. However, a subset of attributes can be defined by the field map parameter.

Feature Layer
join_features

The attributes from the join features will be joined to the attributes of the target features. See the explanation of the join_operation parameter for details on how the aggregation of joined attributes are affected by the type of join operation.

Feature Layer
out_feature_class

A new feature class containing the attributes of the target and join features. By default, all attributes of the target features and the attributes of the joined features will be written to the output. However, the set of attributes to be transferred can be defined by the field map parameter.

Feature Class
join_operation
(Optional)

The operation that will join the target features and join features in the output feature class if multiple join features are found that have the same spatial relationship with a single target feature.

  • JOIN_ONE_TO_ONEIf multiple join features are found that have the same spatial relationship with a single target feature, the attributes from the multiple join features will be aggregated using a field map merge rule. For example, if a point target feature is found within two separate polygon join features, the attributes from the two polygons will be aggregated before being transferred to the output point feature class. If one polygon has an attribute value of 3 and the other has a value of 7, and a Sum merge rule is specified, the aggregated value in the output feature class will be 10. This is the default.
  • JOIN_ONE_TO_MANYIf multiple join features are found that have the same spatial relationship with a single target feature, the output feature class will contain multiple copies (records) of the target feature. For example, if a single point target feature is found within two separate polygon join features, the output feature class will contain two copies of the target feature: one record with the attributes of one polygon and another record with the attributes of the other polygon.
String
join_type
(Optional)

Specifies whether all target features will be maintained in the output feature class (an outer join) or only those that have the specified spatial relationship with the join features (an inner join).

  • KEEP_ALLAll target features will be maintained in the output (outer join). This is the default.
  • KEEP_COMMON Only those target features that have the specified spatial relationship with the join features will be maintained in the output feature class (inner join). For example, if a point feature class is specified for the target features, and a polygon feature class is specified for the join features with a match_option value of WITHIN, the output feature class will only contain those target features that are within a polygon join feature. Any target features not within a join feature will be excluded from the output.
Boolean
field_mapping
(Optional)

The fields that will be included in the output feature class with their respective properties and source fields. The output includes all fields from the join and target features by default.

Use the field map to add, delete, rename, and reorder fields, as well as change other field properties.

The field map can be used to combine values from two or more input fields into a single output field.

In Python, use the FieldMappings class to define this parameter.

Field Mappings
match_option
(Optional)

Specifies the criteria that will be used to match rows.

  • INTERSECTThe features in the join features will be matched if they intersect a target feature. This is the default. Specify the distance in the search_radius parameter.
  • INTERSECT_3D The features in the join features will be matched if they intersect a target feature in three-dimensional space (x, y, and z). Specify the distance in the search_radius parameter.
  • WITHIN_A_DISTANCEThe features in the join features will be matched if they are within a specified distance of a target feature. Specify the distance in the search_radius parameter.
  • WITHIN_A_DISTANCE_GEODESICThis is the same as WITHIN_A_DISTANCE except that geodesic distance is used rather than planar distance. Distance between features will be calculated using a geodesic formula that takes into account the curvature of the spheroid and correctly handles data near and across the dateline and poles. Use this option if the data covers a large geographic extent or the coordinate system of the inputs is unsuitable for distance calculations.
  • WITHIN_A_DISTANCE_3DThe features in the join features will be matched if they are within a specified distance of a target feature in three-dimensional space. Specify the distance in the search_radius parameter.
  • CONTAINSThe features in the join features will be matched if a target feature contains them. The target features must be polygons or polylines. For this option, the target features cannot be points, and the join features can only be polygons when the target features are also polygons.
  • COMPLETELY_CONTAINSThe features in the join features will be matched if a target feature completely contains them. A polygon can completely contain any feature. A point cannot completely contain any feature, not even a point. A polyline can completely contain only polyline and point features.
  • CONTAINS_CLEMENTINIThis spatial relationship produces the same results as COMPLETELY_CONTAINS except that if the join feature is entirely on the boundary of the target feature (no part is properly inside or outside) the feature will not be matched. Clementini defines the boundary polygon as the line separating inside and outside, the boundary of a line is defined as its end points, and the boundary of a point is always empty.
  • WITHINThe features in the join features will be matched if a target feature is within them. This is the opposite of CONTAINS. For this option, the target features can only be polygons when the join features are also polygons. A point can be a join feature only if a point is the target.
  • COMPLETELY_WITHINThe features in the join features will be matched if a target feature is completely within them. This is the opposite of COMPLETELY_CONTAINS.
  • WITHIN_CLEMENTINIThe result will be identical to WITHIN except if the entirety of the feature in the join features is on the boundary of the target feature, the feature will not be matched. Clementini defines the boundary polygon as the line separating inside and outside, the boundary of a line is defined as its end points, and the boundary of a point is always empty.
  • ARE_IDENTICAL_TOThe features in the join features will be matched if they are identical to a target feature. Both join and target feature must be of the same shape type—point to point, line to line, or polygon to polygon.
  • BOUNDARY_TOUCHESThe features in the join features will be matched if they have a boundary that touches a target feature. When the target and join features are lines or polygons, the boundary of the join feature can only touch the boundary of the target feature and no part of the join feature can cross the boundary of the target feature.
  • SHARE_A_LINE_SEGMENT_WITHThe features in the join features will be matched if they share a line segment with a target feature. The join and target features must be lines or polygons.
  • CROSSED_BY_THE_OUTLINE_OFThe features in the join features will be matched if a target feature is crossed by their outline. The join and target features must be lines or polygons. If polygons are used for the join or target features, the polygon's boundary (line) will be used. Lines that cross at a point will be matched; lines that share a line segment will not be matched.
  • HAVE_THEIR_CENTER_INThe features in the join features will be matched if a target feature's center falls within them. The center of the feature is calculated as follows: For polygon and multipoint, the geometry's centroid is used, and for line input, the geometry's midpoint is used. Specify the distance in the search_radius parameter.
  • CLOSESTThe feature in the join features that is closest to a target feature will be matched. See the usage tip for more information. Specify the distance in the search_radius parameter.
  • CLOSEST_GEODESICThis is the same as CLOSEST except that geodesic distance is used rather than planar distance. Use this option if the data covers a large geographic extent or the coordinate system of the inputs is unsuitable for distance calculations
  • LARGEST_OVERLAPThe feature in the join features will be matched with the target feature with the largest overlap.
String
search_radius
(Optional)

Join features within this distance of a target feature will be considered for the spatial join. A search radius is only valid when the spatial relationship is specified (the match_option parameter is set to INTERSECT, WITHIN_A_DISTANCE, WITHIN_A_DISTANCE_GEODESIC, HAVE_THEIR_CENTER_IN, CLOSEST, or CLOSEST_GEODESIC). For example, using a search radius of 100 meters with the WITHIN_A_DISTANCE spatial relationship will join feature within 100 meters of a target feature. For the three within-a-distance relationships, if no value is specified for the search_radius, a distance of 0 is used.

Linear Unit
distance_field_name
(Optional)

The name of the field that contains the distance between the target feature and the closest join feature. This field will be added to the output feature class. This parameter is only valid when the spatial relationship is specified (match_option is set to CLOSEST or CLOSEST_GEODESIC. The value of this field is -1 if no feature is matched within a search radius. If no field name is provided, the field will not be added to the output feature class.

String
match_fields
[[join_field, target_field],...]
(Optional)

Pairs of fields from the join features and target features that will be used for attribute matching. Only the records from the join features that share match field values with the target features will participate in the spatial join.

Value Table

Code sample

SpatialJoin example 1 (Python window)

The following script demonstrates how to use the SpatialJoin function in a Python window.

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.analysis.SpatialJoin(target_features, join_features, out_feature_class)
SpatialJoin example 2 (stand-alone script)

The following stand-alone script demonstrates how to use the SpatialJoin function to join attributes of cities to states.

# Name: SpatialJoin_Example2.py
# Description: Join attributes of cities to states based on spatial relationships.

# 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.analysis.SpatialJoin(targetFeatures, joinFeatures, outfc, "#", "#", fieldmappings)