Thanks for your reply! As it turns out, the Find Identical tool has some limitations and does not allow you to use different xy tolerance values for different types within the same feature class. My solution was to break down each type into its own feature dataset and assign a global xy tolerance to each type. The SRID was set to WGS84 in this case, but it could be changed as needed.
import arcpy
import re
arcpy.env.workspace = r"host_gdb_location"
input_feature_layer = "Railroad_POI_1"
field_name = "TYPE1"
unique_values = set()
with arcpy.da.SearchCursor(input_feature_layer, field_name) as cursor:
for row in cursor:
if row[0] is not None: # Exclude null values
unique_values.add(row[0])
xy_tolerances = {
"Depot": "100 Meters",
"Station": "100 Meters" ,
"Stop": "5 Meters",
"Yard": "100 Meters",
"Switch": "5 Meters",
"Level_Crossing": "5 Meters"
}
for value in unique_values:
sql_expression = f"{arcpy.AddFieldDelimiters(input_feature_layer, field_name)} = '{value}'"
arcpy.SelectLayerByAttribute_management(input_feature_layer, "NEW_SELECTION", sql_expression)
selection_count = int(arcpy.GetCount_management(input_feature_layer).getOutput(0))
if selection_count > 0:
sanitized_value = re.sub(r'[^a-zA-Z0-9_]', '', value)[:40]
if not sanitized_value:
sanitized_value = "Unknown"
feature_dataset_name = f"FeatureDataset_{sanitized_value}"
arcpy.CreateFeatureDataset_management(arcpy.env.workspace, feature_dataset_name, arcpy.SpatialReference(4326))
feature_class_name = f"FeatureClass_{sanitized_value}"
feature_class_path = arcpy.CreateFeatureclass_management(feature_dataset_name, feature_class_name, "POINT", "", "DISABLED", "DISABLED")
arcpy.management.CopyFeatures(input_feature_layer, feature_class_path)
xy_tolerance = xy_tolerances.get(sanitized_value, None)
if xy_tolerance:
arcpy.env.XYTolerance = xy_tolerance
find_identical_output = f"FindIdentical_{feature_class_name}"
arcpy.FindIdentical_management(feature_class_path, find_identical_output, ["Shape"], output_record_option="ONLY_DUPLICATES" )
arcpy.env.workspace, identical_output_table, where_clause="FEAT_SEQ >= 1")
arcpy.env.XYTolerance = None
print(f"{selection_count} features of type '{value}' processed.")
else:
print(f"No features of type '{value}' selected.")
arcpy.SelectLayerByAttribute_management(input_feature_layer, "CLEAR_SELECTION")