349 lines
12 KiB
Python
349 lines
12 KiB
Python
# 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)
|