# -*- coding: utf-8 -*- import arcpy import os # 设置工作环境 arcpy.env.workspace = r"D:\Python\sde\SDE.sde" arcpy.env.overwriteOutput = True def spatial_clip_tables(feature_A, feature_B, output_B_minus_A, output_A_minus_B, where_clause, temp_workspace=r"D:\Python\sde", mjField="TBMJ"): try: # 定义要素类/表名 # feature_A = "SDE.ZXCQ_ZTGH" # feature_B = "SDE.ZXCQ_LD" # 使用文件地理数据库作为临时输出 # temp_workspace = r"D:\Python\sde" # 修改为您的临时目录 if not os.path.exists(temp_workspace): os.makedirs(temp_workspace) temp_gdb = os.path.join(temp_workspace, "temp_analysis.gdb") if not arcpy.Exists(temp_gdb): arcpy.CreateFileGDB_management(temp_workspace, "temp_analysis.gdb") # 输出要素类名称 # output_B_minus_A = "ZXCQ_LD_WITHOUT_ZTGH" # output_A_minus_B = "ZXCQ_ZTGH_WITHOUT_LD" # 构建查询条件 # where_clause = "YDYHFLDM LIKE '1401%' OR YDYHFLDM LIKE '1402%'" print("正在处理数据...") # 步骤1: 筛选A表数据到文件地理数据库 temp_A = os.path.join(temp_gdb, "temp_A") arcpy.Select_analysis(feature_A, temp_A, where_clause) # 步骤2: 复制B表到文件地理数据库 temp_B = os.path.join(temp_gdb, "temp_B") arcpy.CopyFeatures_management(feature_B, temp_B) print("正在计算空间差异...") # 在文件地理数据库中执行Erase操作 temp_output_B = os.path.join(temp_gdb, "temp_B_minus_A") temp_output_A = os.path.join(temp_gdb, "temp_A_minus_B") arcpy.Erase_analysis(temp_B, temp_A, temp_output_B) arcpy.Erase_analysis(temp_A, temp_B, temp_output_A) # 将结果复制回SDE print("正在将结果写入SDE数据库...") # 删除已存在的输出 for output_name in [output_B_minus_A, output_A_minus_B]: full_output_path = os.path.join(arcpy.env.workspace, output_name) if arcpy.Exists(full_output_path): arcpy.Delete_management(full_output_path) # 复制到SDE arcpy.CopyFeatures_management(temp_output_B, os.path.join(arcpy.env.workspace, output_B_minus_A)) arcpy.CopyFeatures_management(temp_output_A, os.path.join(arcpy.env.workspace, output_A_minus_B)) # 清理字段 fields_to_keep = ["YDYHFLDM", "YDYHFLMC", "XXGHBZDYBH", "XXGHBZDYMC", "OBJECTID", "Shape", "SHAPE", "Shape_Length", "Shape_Area", "SHAPE.LEN", "SHAPE.AREA"] for output_name in [output_B_minus_A, output_A_minus_B]: output_path = os.path.join(arcpy.env.workspace, output_name) field_names = [f.name for f in arcpy.ListFields(output_path)] for field in field_names: if field not in fields_to_keep: try: arcpy.DeleteField_management(output_path, field) except: pass # 忽略无法删除的字段 output_path_B = os.path.join(arcpy.env.workspace, output_B_minus_A) output_path_A = os.path.join(arcpy.env.workspace, output_A_minus_B) arcpy.AddField_management(output_path_B, mjField, "DOUBLE") arcpy.CalculateField_management(output_path_B, mjField, "!shape.area@SQUAREMETERS!", "PYTHON_9.3") arcpy.AddField_management(output_path_A, mjField, "DOUBLE") arcpy.CalculateField_management(output_path_A, mjField, "!shape.area@SQUAREMETERS!", "PYTHON_9.3") print("空间差异分析完成!") print("B中不与A相交的部分: {0}".format(output_path_B)) print("A中不与B相交的部分: {0}".format(output_path_A)) # 清理临时文件地理数据库 if arcpy.Exists(temp_gdb): arcpy.Delete_management(temp_gdb) return output_path_B, output_path_A except Exception as e: print("发生错误: {0}".format(str(e))) import traceback print(traceback.format_exc()) # 主执行函数 if __name__ == "__main__": print("=== 空间裁剪分析 ===") print("\n1. 执行常规空间裁剪...") # 绿地与详细规划 result1 = spatial_clip_tables(feature_A="SDE.ZXCQ_XXGH", feature_B="SDE.ZXCQ_LD", output_B_minus_A="ZXCQ_LD_WITHOUT_XXGH", output_A_minus_B="ZXCQ_XXGH_WITHOUT_LD", where_clause="YDYHFLDM LIKE '1401%' OR YDYHFLDM LIKE '1402%'") # 绿地与总体规划 result1 = spatial_clip_tables(feature_A="SDE.ZXCQ_ZTGH", feature_B="SDE.ZXCQ_LD", output_B_minus_A="ZXCQ_LD_WITHOUT_ZTGH", output_A_minus_B="ZXCQ_ZTGH_WITHOUT_LD", where_clause="YDYHFLDM LIKE '1401%' OR YDYHFLDM LIKE '1402%'") # 广场与总体规划 result1 = spatial_clip_tables(feature_A="SDE.ZXCQ_ZTGH", feature_B="SDE.ZXCQ_GC", output_B_minus_A="ZXCQ_GC_WITHOUT_ZTGH", output_A_minus_B="ZXCQ_ZTGH_WITHOUT_GC", where_clause="YDYHFLDM LIKE '1403%'") # 广场与详细规划 result1 = spatial_clip_tables(feature_A="SDE.ZXCQ_XXGH", feature_B="SDE.ZXCQ_GC", output_B_minus_A="ZXCQ_GC_WITHOUT_XXGH", output_A_minus_B="ZXCQ_XXGH_WITHOUT_GC", where_clause="YDYHFLDM LIKE '1403%'") print("\n所有处理完成!")