| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- # -*- 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所有处理完成!")
|