乐于分享
好东西不私藏

openclaw矢量数据按字段导出shp

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 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 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 in values:    print("      {}".format(v))# 4. 分割print("\n[4/5] 开始分割...")success = 0failed = 0for i, prov in enumerate(values, 1):清理文件名safe_name = "".join(c for in prov if 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 in os.listdir(output_dir) if f.endswith(".shp"and not f.endswith(".xml")])total = 0for 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)