# coding=utf-8 import os import shutil import time from imp import reload import arcpy import inspect import ConfigParser import sys reload(sys) sys.setdefaultencoding('utf8') # 增删改gdb add_gdb = 'addFeatures.gdb' edit_gdb = 'editFeatures.gdb' delete_gdb = 'deleteFeatures.gdb' # 输出gdb out_folder = 'OldGDB' out_addedit_gdb = 'addAndeditFeatures.gdb' out_delete_gdb = 'deleteFeatures.gdb' global add_gdb_path global edit_gdb_path global delete_gdb_path global outFolderPath global output def add_log_info(msg): """添加日志记录""" cur_date = time.strftime("%Y-%m-%d", time.localtime()) cur_time = time.strftime("%H-%M-%S", time.localtime()) output.write("[" + cur_date + " " + cur_time + "] " + msg + "\n") output.flush() def create_dir(dir_name): if os.path.exists(dir_name): shutil.rmtree(dir_name) os.mkdir(dir_name) def trim_tablespace_name(fc_name): """去除表空间名""" index = fc_name.rfind('.') if index > 0: fc_name = fc_name[index + 1:] return fc_name def start_edit(src_sde): """开始编辑""" arcpy.env.workspace = src_sde # print str(src_sde).decode('gb2312') edit = arcpy.da.Editor(src_sde) edit.startEditing(False, False) edit.startOperation() return edit def stop_edit(src_sde, edit, bool_save): """停止编辑""" arcpy.env.workspace = src_sde # 停止编辑 edit.stopOperation() edit.stopEditing(bool_save) def get_config(section, key): """从配置文件读取参数""" config = ConfigParser.ConfigParser() path = os.path.split(os.path.realpath(__file__))[0] + '/ExportGdbSetting.config' config.read(path) try: return config.get(section, key) except ConfigParser.Error: return "" def get_config_int(section, key): """从配置文件读取参数""" config = ConfigParser.ConfigParser() path = os.path.split(os.path.realpath(__file__))[0] + '/ExportGdbSetting.config' config.read(path) try: return config.getint(section, key) except ConfigParser.Error: return 0 def get_config_float(section, key): """从配置文件读取参数""" config = ConfigParser.ConfigParser() path = os.path.split(os.path.realpath(__file__))[0] + '/ExportGdbSetting.config' config.read(path) try: return config.getfloat(section, key) except ConfigParser.Error: return 0.0 def get_layer_relation_count(fc_name): """获取图层对照个数""" layer_name = trim_tablespace_name(fc_name) index0 = layer_name.find("history") if index0 == 0: layer_name = layer_name[index0 + 7:] count = get_config_int("Layer_" + layer_name, "relationCount") return count def get_relation_layer(fc_name, index): """获取对照图层信息""" layer_name = trim_tablespace_name(fc_name) index0 = layer_name.find("history") if index0 == 0: layer_name = layer_name[index0 + 7:] tag_layer_name = get_config("Layer_" + layer_name, "tagLayerName" + str(index)) expression = get_config("Layer_" + layer_name, "expression" + str(index)) remove_field_names = get_config("Layer_" + layer_name, "removeFieldNames" + str(index)) rename_field_names = get_config("Layer_" + layer_name, "renameFieldNames" + str(index)) return tag_layer_name, expression, remove_field_names, rename_field_names def get_relation_code_count(): """获取编码对照个数""" code_section = "FeatureCode" count = get_config_int(code_section, "relationCount") return count def get_relation_code(index): """获取对照编码""" code_section = "FeatureCode" name = get_config(code_section, "changeCode" + str(index)) relations = name.split(":") try: # old_code, new_code = relations[0], relations[1] return relations[0], relations[1] except BaseException as e: errmsg = str(e.message.encode("gb2312")) add_log_info(errmsg) return "", "" def get_change_code_layers(): """获取换码图层列表""" code_section = "FeatureCode" rel_layers = get_config(code_section, "relationLayers") layers = rel_layers.split(",") return layers def feature_class_to_feature_class(src_layer_name, out_location, tag_layer_name, where_clause, remove_field_names, rename_field_names): """图层转换输出""" field_mappings = arcpy.FieldMappings() field_mappings.addTable(src_layer_name) # 处理删除字段 remove_list_names = remove_field_names.split(",") for name in remove_list_names: index = field_mappings.findFieldMapIndex(name) if index > -1: field_mappings.removeFieldMap(index) # 处理改名字段 rename_list_names = rename_field_names.split(",") for name in rename_list_names: relations = name.split(":") index0 = field_mappings.findFieldMapIndex(relations[0]) if index0 > -1: field_map = field_mappings.getFieldMap(index0) f_name = field_map.outputField f_name.name = relations[1] f_name.aliasName = relations[1] field_map.outputField = f_name field_mappings.replaceFieldMap(field_mappings.findFieldMapIndex(relations[0]), field_map) # 导出数据 arcpy.FeatureClassToFeatureClass_conversion(src_layer_name, out_location, tag_layer_name, where_clause, field_mappings) def transform_to_feature_class(fc_name, out_location): """根据图层对照转换一个fc""" count = get_layer_relation_count(fc_name) # 没有对照,按原图层输出 if count == 0: return # 有对照获取对照输出 for index in range(1, count + 1): out_fc, expression, rm_fields, rn_fields = get_relation_layer(fc_name, index) expression = "ObjectID>0" if expression == "" else expression # 如果对照为空,则按原图层名 out_fc = fc_name if out_fc == "" else out_fc try: add_log_info(str(fc_name) + "-->" + str(out_fc)) if arcpy.Exists(os.path.join(out_location, out_fc)): # 先转换到内存工作空间 # arcpy.FeatureClassToFeatureClass_conversion(fc_name, "in_memory", "buffer", expression) feature_class_to_feature_class(fc_name, "in_memory", "buffer", expression, rm_fields, rn_fields) # 再从内存工作空间转换输出到目标 arcpy.Append_management("in_memory/buffer", os.path.join(out_location, out_fc), "NO_TEST") # 及时回收内存工作空间 arcpy.Delete_management("in_memory") else: # arcpy.FeatureClassToFeatureClass_conversion(fc_name, out_location, out_fc, expression) feature_class_to_feature_class(fc_name, out_location, out_fc, expression, rm_fields, rn_fields) except BaseException as e: # error_code = arcpy.GetReturnCode(2) add_log_info(str(e.message.encode("gb2312"))) def translate_one_gdb(src_gdb_path, gdb_type): """转换图层输出一个GDB""" if src_gdb_path == "": return # gdb_type 大与0 add; 小于0 delete; 等于0 edit str_type = "add" if gdb_type > 0 else "delete" if gdb_type == 0: str_type = "edit" add_log_info("-----------<" + str_type + ">-----------") arcpy.env.workspace = src_gdb_path fc_list = arcpy.ListFeatureClasses("*", "all") for FC in fc_list: index = FC.rfind('.') fc_name = FC[index + 1:] # 跳过实体图层,et_开头的 if fc_name.lower().find('et_') == 0: continue if gdb_type <= 0: # 删除和修改输出到删除gdb out_location = outFolderPath + "\\" + out_delete_gdb transform_to_feature_class(FC, out_location) if gdb_type >= 0: # 新增和修改输出到增改gdb out_location = outFolderPath + "\\" + out_addedit_gdb transform_to_feature_class(FC, out_location) def translate_to_old(): # 创建输出子目录 create_dir(outFolderPath) # 创建增改gdb arcpy.CreateFileGDB_management(outFolderPath, out_addedit_gdb) # 创建删除gdb arcpy.CreateFileGDB_management(outFolderPath, out_delete_gdb) # 修改env变量,改为覆盖输出 arcpy.env.overwriteOutput = True # 1.新增数据转换输出 translate_one_gdb(add_gdb_path, 1) # 2.删除数据转换输出 translate_one_gdb(delete_gdb_path, -1) # 3.修改数据转换输出 translate_one_gdb(edit_gdb_path, 0) def change_codes_onelayer(fc): """一个图层所有编码遍历换编码""" try: count = get_relation_code_count() for index in range(1, count + 1): old_code, new_code = get_relation_code(index) if old_code == "": continue fields = ["FEATURECODE"] cur = arcpy.da.UpdateCursor(fc, fields, where_clause="FeatureCode='" + old_code + "'") for row in cur: row[0] = new_code cur.updateRow(row) print(old_code + "-->" + new_code) return True except BaseException as e: add_log_info(str(e.message.encode("gb2312"))) return False def change_codes(): """逐层换编码""" out_paths = [outFolderPath + "\\" + out_addedit_gdb, outFolderPath + "\\" + out_delete_gdb] for path in out_paths: if path != "": err_count = 0 edit = start_edit(path) fc_list = arcpy.ListFeatureClasses("*", "all") add_log_info("----------change_codes----------") for fc in fc_list: # 换码图层过滤 if fc not in get_change_code_layers(): continue add_log_info("Layer: " + str(fc)) if not change_codes_onelayer(fc): err_count += 1 b_save = True if err_count == 0 else False stop_edit(path, edit, b_save) # 获取参数 args = sys.argv[1:] if not args or len(args) < 1: sys.exit(str(u"参数不足:需要文件路径").encode("gb2312")) else: try: # 文件路径 filepath = args[0] add_gdb_path = filepath + "\\" + add_gdb edit_gdb_path = filepath + "\\" + edit_gdb delete_gdb_path = filepath + "\\" + delete_gdb outFolderPath = filepath + "\\" + out_folder # 创建日志 Date = time.strftime("%Y-%m-%d", time.localtime()) Time = time.strftime("%I:%M:%S %p", time.localtime()) Time1 = time.strftime("%H-%M-%S", time.localtime()) caller_file = inspect.getfile(inspect.currentframe()) pathname = os.path.abspath(os.path.dirname(caller_file)) out_logfile = pathname + "\\log\\" + Date + " " + Time1 + "-Translate2Old.txt" if not os.path.exists(pathname + "\\log"): os.mkdir(pathname + "\\log") # 打开日志 output = open(out_logfile, "w") # 记录开始时间 add_log_info('################ Transe2Old ################\n\n') Date = time.strftime("%Y-%m-%d", time.localtime()) Time = time.strftime("%H-%M-%S", time.localtime()) add_log_info("Process begin at " + str(Date) + " " + str(Time) + ".") # 换层输出旧标准数据(增删改3文件->增删2文件) translate_to_old() # 逐层换编码 change_codes() # 结束时间日志记录 Date = time.strftime("%Y-%m-%d", time.localtime()) Time = time.strftime("%I:%M:%S %p", time.localtime()) add_log_info("Process completed at " + str(Date) + " " + str(Time) + "." + "\n") output.close() except BaseException as e: errmsg = str(e.message.encode("gb2312")) add_log_info(errmsg)