openclaw矢量数据按字段导出shp# -*- coding: utf-8 -*-"""按"省级"字段分割要素类 - 动态查找路径版"""import arcpyimport osimport sys# 设置输出output_dir = r"C:\Users\yl\Desktop\GIS"split_field = "省级"# 确保输出目录存在if not os.path.exists(output_dir): os.makedirs(output_dir)print("=" * 60)print("按省级字段分割要素类")print("=" * 60)# 设置环境arcpy.env.workspace = r"E:\2026\Pro\data\data\china"arcpy.env.overwriteOutput = True# 1. 动态查找 GDB 和要素类print("\n[1/5] 查找数据源...")gdbs = arcpy.ListWorkspaces("*.gdb")input_fc = Nonefor gdb in gdbs: arcpy.env.workspace = os.path.join(gdb, "ds") fcs = arcpy.ListFeatureClasses("T2024*县级*")if fcs: input_fc = os.path.join(gdb, "ds", fcs[0]) print(" GDB: {}".format(os.path.basename(gdb))) print(" 要素类:{}".format(fcs[0]))breakif not input_fc: print(" 错误:未找到要素类") sys.exit(1)print(" 路径:{}".format(input_fc))# 2. 验证字段print("\n[2/5] 验证字段...")fields = arcpy.ListFields(input_fc)field_names = [f.name for f in fields]# 查找省级字段prov_field = Nonefor fn in field_names:if "省" in fn: prov_field = fnbreakif not prov_field: print(" 错误:未找到省级字段") print(" 可用字段:{}".format(", ".join(field_names[:10]))) sys.exit(1)print(" 分割字段:{} (类型:{})".format(prov_field, [f.type for f in fields if f.name == prov_field][0]))# 3. 获取唯一值print("\n[3/5] 获取省级唯一值...")values = set()with arcpy.da.SearchCursor(input_fc, [prov_field]) as cursor:for row in cursor:if row[0]: values.add(row[0])values = sorted(list(values))print(" 共 {} 个省级单位:".format(len(values)))for v in values: print(" {}".format(v))# 4. 分割print("\n[4/5] 开始分割...")success = 0failed = 0for i, prov in enumerate(values, 1):# 清理文件名safe_name = "".join(c for c in prov if c not in r'\/:*?"<>|').strip() output_shp = os.path.join(output_dir, "{}.shp".format(safe_name))try:# SQL 表达式where = "\"{}\" = '{}'".format(prov_field, prov)# 分割arcpy.analysis.Select(input_fc, output_shp, where)# 检查cnt = int(arcpy.GetCount_management(output_shp)[0])if cnt > 0:# 创建.cpg 文件cpg = output_shp.replace(".shp", ".cpg")with open(cpg, "w") as f: f.write("CP936") print(" [{}/{}] {} ({}要素)".format(i, len(values), safe_name, cnt)) success += 1else:if os.path.exists(output_shp): arcpy.Delete_management(output_shp) failed += 1except Exception as e: print(" [{}/{}] {} - 错误".format(i, len(values), safe_name)) failed += 1# 5. 统计print("\n[5/5] 统计结果:")print(" 成功:{} 个".format(success))print(" 失败:{} 个".format(failed))print("\n生成的 SHP 文件:")shp_files = sorted([f for f in os.listdir(output_dir) if f.endswith(".shp") and not f.endswith(".xml")])total = 0for f in shp_files:try: cnt = int(arcpy.GetCount_management(os.path.join(output_dir, f))[0]) total += cnt print(" - {} ({}要素)".format(f, cnt))except: print(" - {}".format(f))print("\n 总计:{} 要素".format(total))print("\n" + "=" * 60)print("完成!")print("=" * 60)