spatial_clip_tables.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. # -*- coding: utf-8 -*-
  2. import arcpy
  3. import os
  4. # 设置工作环境
  5. arcpy.env.workspace = r"D:\Python\sde\SDE.sde"
  6. arcpy.env.overwriteOutput = True
  7. def spatial_clip_tables(feature_A, feature_B, output_B_minus_A, output_A_minus_B, where_clause,
  8. temp_workspace=r"D:\Python\sde", mjField="TBMJ"):
  9. try:
  10. # 定义要素类/表名
  11. # feature_A = "SDE.ZXCQ_ZTGH"
  12. # feature_B = "SDE.ZXCQ_LD"
  13. # 使用文件地理数据库作为临时输出
  14. # temp_workspace = r"D:\Python\sde" # 修改为您的临时目录
  15. if not os.path.exists(temp_workspace):
  16. os.makedirs(temp_workspace)
  17. temp_gdb = os.path.join(temp_workspace, "temp_analysis.gdb")
  18. if not arcpy.Exists(temp_gdb):
  19. arcpy.CreateFileGDB_management(temp_workspace, "temp_analysis.gdb")
  20. # 输出要素类名称
  21. # output_B_minus_A = "ZXCQ_LD_WITHOUT_ZTGH"
  22. # output_A_minus_B = "ZXCQ_ZTGH_WITHOUT_LD"
  23. # 构建查询条件
  24. # where_clause = "YDYHFLDM LIKE '1401%' OR YDYHFLDM LIKE '1402%'"
  25. print("正在处理数据...")
  26. # 步骤1: 筛选A表数据到文件地理数据库
  27. temp_A = os.path.join(temp_gdb, "temp_A")
  28. arcpy.Select_analysis(feature_A, temp_A, where_clause)
  29. # 步骤2: 复制B表到文件地理数据库
  30. temp_B = os.path.join(temp_gdb, "temp_B")
  31. arcpy.CopyFeatures_management(feature_B, temp_B)
  32. print("正在计算空间差异...")
  33. # 在文件地理数据库中执行Erase操作
  34. temp_output_B = os.path.join(temp_gdb, "temp_B_minus_A")
  35. temp_output_A = os.path.join(temp_gdb, "temp_A_minus_B")
  36. arcpy.Erase_analysis(temp_B, temp_A, temp_output_B)
  37. arcpy.Erase_analysis(temp_A, temp_B, temp_output_A)
  38. # 将结果复制回SDE
  39. print("正在将结果写入SDE数据库...")
  40. # 删除已存在的输出
  41. for output_name in [output_B_minus_A, output_A_minus_B]:
  42. full_output_path = os.path.join(arcpy.env.workspace, output_name)
  43. if arcpy.Exists(full_output_path):
  44. arcpy.Delete_management(full_output_path)
  45. # 复制到SDE
  46. arcpy.CopyFeatures_management(temp_output_B, os.path.join(arcpy.env.workspace, output_B_minus_A))
  47. arcpy.CopyFeatures_management(temp_output_A, os.path.join(arcpy.env.workspace, output_A_minus_B))
  48. # 清理字段
  49. fields_to_keep = ["YDYHFLDM", "YDYHFLMC", "XXGHBZDYBH", "XXGHBZDYMC", "OBJECTID", "Shape", "SHAPE",
  50. "Shape_Length", "Shape_Area", "SHAPE.LEN", "SHAPE.AREA"]
  51. for output_name in [output_B_minus_A, output_A_minus_B]:
  52. output_path = os.path.join(arcpy.env.workspace, output_name)
  53. field_names = [f.name for f in arcpy.ListFields(output_path)]
  54. for field in field_names:
  55. if field not in fields_to_keep:
  56. try:
  57. arcpy.DeleteField_management(output_path, field)
  58. except:
  59. pass # 忽略无法删除的字段
  60. output_path_B = os.path.join(arcpy.env.workspace, output_B_minus_A)
  61. output_path_A = os.path.join(arcpy.env.workspace, output_A_minus_B)
  62. arcpy.AddField_management(output_path_B, mjField, "DOUBLE")
  63. arcpy.CalculateField_management(output_path_B, mjField, "!shape.area@SQUAREMETERS!", "PYTHON_9.3")
  64. arcpy.AddField_management(output_path_A, mjField, "DOUBLE")
  65. arcpy.CalculateField_management(output_path_A, mjField, "!shape.area@SQUAREMETERS!", "PYTHON_9.3")
  66. print("空间差异分析完成!")
  67. print("B中不与A相交的部分: {0}".format(output_path_B))
  68. print("A中不与B相交的部分: {0}".format(output_path_A))
  69. # 清理临时文件地理数据库
  70. if arcpy.Exists(temp_gdb):
  71. arcpy.Delete_management(temp_gdb)
  72. return output_path_B, output_path_A
  73. except Exception as e:
  74. print("发生错误: {0}".format(str(e)))
  75. import traceback
  76. print(traceback.format_exc())
  77. # 主执行函数
  78. if __name__ == "__main__":
  79. print("=== 空间裁剪分析 ===")
  80. print("\n1. 执行常规空间裁剪...")
  81. # 绿地与详细规划
  82. result1 = spatial_clip_tables(feature_A="SDE.ZXCQ_XXGH",
  83. feature_B="SDE.ZXCQ_LD",
  84. output_B_minus_A="ZXCQ_LD_WITHOUT_XXGH",
  85. output_A_minus_B="ZXCQ_XXGH_WITHOUT_LD",
  86. where_clause="YDYHFLDM LIKE '1401%' OR YDYHFLDM LIKE '1402%'")
  87. # 绿地与总体规划
  88. result1 = spatial_clip_tables(feature_A="SDE.ZXCQ_ZTGH",
  89. feature_B="SDE.ZXCQ_LD",
  90. output_B_minus_A="ZXCQ_LD_WITHOUT_ZTGH",
  91. output_A_minus_B="ZXCQ_ZTGH_WITHOUT_LD",
  92. where_clause="YDYHFLDM LIKE '1401%' OR YDYHFLDM LIKE '1402%'")
  93. # 广场与总体规划
  94. result1 = spatial_clip_tables(feature_A="SDE.ZXCQ_ZTGH",
  95. feature_B="SDE.ZXCQ_GC",
  96. output_B_minus_A="ZXCQ_GC_WITHOUT_ZTGH",
  97. output_A_minus_B="ZXCQ_ZTGH_WITHOUT_GC",
  98. where_clause="YDYHFLDM LIKE '1403%'")
  99. # 广场与详细规划
  100. result1 = spatial_clip_tables(feature_A="SDE.ZXCQ_XXGH",
  101. feature_B="SDE.ZXCQ_GC",
  102. output_B_minus_A="ZXCQ_GC_WITHOUT_XXGH",
  103. output_A_minus_B="ZXCQ_XXGH_WITHOUT_GC",
  104. where_clause="YDYHFLDM LIKE '1403%'")
  105. print("\n所有处理完成!")