diff --git a/README.md b/README.md index dfdd1dc..2367a03 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,54 @@ # shsmi_sysdb_nex -重构代码 \ No newline at end of file +## Description +本程序用于将SDE数据库中的增量入库数据同步到本地mdo文件中,用于更新上海院的版本库。 + +## 同步原理 +1. 从SDE数据库中读取增量入库数据到本地gdb,包括新增、修改、删除三个gdb数据文件; +2. 将本地gdb数据文件同步到mdo文件中,包括新增、修改、删除三个mdo数据文件;这步转换需要EPS; +3. 将gdb三文件,通过标准转换py脚本,转换为gdb二文件的旧标准格式; +4. 将gdb二文件的旧标准格式,进行秘密信息处理,生产保密的gdb二文件; + +## 使用方法 +1. 将程序部署到服务器上,例如:D:\shsmi_sysdb_nex +2. 在D:\shsmi_sysdb_nex\SdeSyncSetting.config中配置同步参数,例如: +``` +[System] +# 配置EPS.EXE的文件路径 +eps_path=C:/EPS20221017/eps.exe +# 配置python.exe的路径,要用arcgis默认安装的2.7 +python_path=C:/Python27/ArcGIS10.2/python.exe +# 配置EPS的模板文件名,用于mdo转换使用 +template_name="上海新型测绘_地理实体.mdt" +# 配置EPS的vbs文件名,用于mdo转换使用 +eps_vbs=.\上海数据库同步\自动输出MDO.vbs +# 配置SDE数据库的scheme名称 +sde_scheme=SHDLG500 +# 配置EPS输出mdo是是否显示EPS子进程界面 +eps_show=show +# 配置SDE同步gdb时,只同步图元数据,还是同步所有数据 +sync_type=ALL +[UpdateRegion] +# 配置SDE库中的更新区域图层名称 +layer_name=UpdateRegion_A +# 配置SDE库中的更新区域图层的更新时间字段名称 +updatetime_field=UpdateTime +# 配置SDE库中的更新区域历史图层的更新时间字段名称(即删除时间) +updatetime_field_history=DeleteTime +``` + +3. 在D:\shsmi_sysdb_nex\ExportGdbSetting.config 中配置新标准转换旧标准的对照规则 +4. 创建一个bat文件,例如:D:\shsmi_sysdb_nex\run.bat,内容如下: +``` +@echo off +cd /d %~dp0 +C:/Python27/ArcGIS10.2/python.exe main.py +pause +``` +5. 在windows计划任务中,配置定时执行run.bat文件,例如每天凌晨1点执行一次。(或者使用消息队列监管程序,定时执行run.bat文件) + +## 注意事项 +1. 本程序需要EPS软件的支持,EPS软件需要单独购买,EPS软件的安装路径需要在SdeSyncSetting.config中配置; +2. 本程序需要ArcGIS软件的支持,ArcGIS软件需要单独购买; +3. 本程序需要ArcGIS的python环境,ArcGIS的python环境需要单独安装,ArcGIS的python环境的安装路径需要在SdeSyncSetting.config中配置; +4. 本程序基于ArcGIS的python环境开发,python版本为2.7,ArcGIS版本为10.2.2; diff --git a/functions.py b/functions.py index f9fbe14..8ec782f 100644 --- a/functions.py +++ b/functions.py @@ -10,10 +10,6 @@ import time import ctypes import urllib import urllib2 -from imp import reload - -reload(sys) -sys.setdefaultencoding('utf8') def run_command(command): diff --git a/logger.py b/logger.py index 24ccb6e..b3fd69b 100644 --- a/logger.py +++ b/logger.py @@ -2,10 +2,6 @@ import os import sys import logging -from imp import reload - -reload(sys) -sys.setdefaultencoding('utf8') class Logger: diff --git a/main.py b/main.py index 83d2899..d4da2ca 100644 --- a/main.py +++ b/main.py @@ -1,8 +1,7 @@ # coding=utf-8 import inspect -import os -import sys from imp import reload + from sde_sync import SdeSynchronous from logger import Logger from functions import * diff --git a/sde_sync.py b/sde_sync.py index e8668d4..90089e4 100644 --- a/sde_sync.py +++ b/sde_sync.py @@ -3,13 +3,10 @@ import fnmatch import os import sys import arcpy -from imp import reload from functions import * from sys_config import SysConfig from logger import Logger -reload(sys) -sys.setdefaultencoding('utf8') # EPS SDE 系统表列表 g_sys_tb = ['SS_BDCDYHINFO', 'SS_GISDBLINKINFO', 'SS_LOGINFO', 'SS_ROLEINFO', 'SS_ROLEMXDINFO', @@ -36,7 +33,7 @@ class SdeSynchronous: self.logger.error("src_sde Connection file not exist!") else: self.create_gdb_files() - txt_path = self.out_gdb_path + "\\" + str(u"图层数量统计.txt").encode("utf-8") + txt_path = self.out_gdb_path + "\\" + str(u"图层数量统计.txt").encode("gb2312") self.txt_ct_file = open(txt_path, "wb+", buffering=0) # 开始编辑SDE edit = self.start_edit() @@ -58,12 +55,9 @@ class SdeSynchronous: ds_list = arcpy.ListDatasets("*", "Feature") # 逐个数据集输出 for DS in ds_list: - str_msg = "Process Dataset: " + DS.encode("gb2312") - print(str_msg) - index = DS.rfind('.') - ds_name = DS[index + 1:] - desc = arcpy.Describe(DS) - sr = desc.spatialReference + print("Process Dataset: " + DS.encode("gb2312")) + ds_name = DS[DS.rfind('.') + 1:] + sr = arcpy.Describe(DS).spatialReference # 更改工作空间回到SDE arcpy.env.workspace = self.src_sde # 获取数据集中fc列表 @@ -71,7 +65,7 @@ class SdeSynchronous: # 输出增量 self.sde2gdb_feature_list(fc_list) # 获取关联关系表列表 - re_table_list = arcpy.ListTables("SHDLG500.*", "all") + re_table_list = arcpy.ListTables("{}.*".format(self.config.sde_scheme()), "all") self.sde2gdb_table_list(re_table_list) bool_save = True if self.error_count == 0 else False @@ -114,7 +108,7 @@ class SdeSynchronous: try: # 创建输出GDB tt = self.config.curr_sync_datetime - self.out_gdb_path = self.config.pathname + "\\" + u"NEWGDB\\" + tt[:tt.find(' ')] + self.out_gdb_path = self.config.pathname + "\\" + "NEWGDB\\" + tt[:tt.find(' ')] create_dir(self.out_gdb_path) self.out_gdb_files = {"Add": "addFeatures.gdb", "Edit": "editFeatures.gdb", "Delete": "deleteFeatures.gdb"} for key in self.out_gdb_files.keys(): @@ -129,13 +123,13 @@ class SdeSynchronous: """获取SDE连接""" for fileName in os.listdir(self.config.pathname + "\\" + sub_path.encode("gb2312")): if fnmatch.fnmatch(fileName, '*.sde'): - return self.config.pathname + "\\" + sub_path + "\\" + fileName + return self.config.pathname + "\\" + sub_path.encode('gb2312') + "\\" + fileName return "" def start_edit(self): """开始编辑""" arcpy.env.workspace = self.src_sde - print(str(self.src_sde).encode('gb2312')) + print(self.src_sde.decode("gb2312")) edit = arcpy.da.Editor(self.src_sde) edit.startEditing(False, False) edit.startOperation() @@ -249,6 +243,8 @@ class SdeSynchronous: if index0 == 0: return fc_history = "history" + fc_name + if not arcpy.Exists(fc_history): + return expression_add, expression_edit, expression_delete = self.get_export_expression(fc_name) self.logger.log("Exporting Layer:" + fc_name.encode("gb2312")) try: @@ -288,6 +284,8 @@ class SdeSynchronous: if index0 == 0: return tb_history = "history" + tb_name + if not arcpy.Exists(tb_history): + return entity_index = tb_name.find("ReEnt_") tb_type = "entity_rela" if entity_index == 0 else "elem_rela" @@ -455,10 +453,10 @@ class SdeSynchronous: """启动python子进程输出feature或者table到gdb""" python_path = str(self.config.python_path() + u' ').encode('gb2312') script = str(u'sde_fc2fc.py ').encode('gb2312') - src_sde = str(self.src_sde + u' ') + src_sde = str(self.src_sde + ' ') type_cmd = str(fc_type + u' ').encode('gb2312') fc_name_cmd = str(fc_name + u' ').encode('gb2312') - out_cmd = str(out + u' ').encode('gb2312') + out_cmd = str(out + ' ') fc_cur_cmd = str(fc_cur + u' ').encode('gb2312') exp_cmd = str(u'"' + expression + u'" ') # 启动命令参数 @@ -505,7 +503,7 @@ class SdeSynchronous: python_path = str(self.config.python_path() + u' ').encode('gb2312') script = str(u'translate2old.py ').encode('gb2312') # 启动命令参数 - command1 = python_path + script + self.out_gdb_path.encode('gb2312') + command1 = python_path + script + self.out_gdb_path run_command(command1) self.logger.log("--End Translate TO old--") # 移动文件 diff --git a/sys_config.py b/sys_config.py index d0e36d7..025d401 100644 --- a/sys_config.py +++ b/sys_config.py @@ -2,10 +2,6 @@ import os import sys import ConfigParser -from imp import reload - -reload(sys) -sys.setdefaultencoding('utf8') class BaseConfig(object): diff --git a/test_arcpy.py b/test_arcpy.py new file mode 100644 index 0000000..aef6b35 --- /dev/null +++ b/test_arcpy.py @@ -0,0 +1,30 @@ +# coding=utf-8 +import arcpy +from functions import * + +# Set the workspace +arcpy.env.workspace = u"C:\\Users\\Administrator\\PycharmProjects\\shsmi_sysdb_nex\\源库SDE连接\\shdlg500.sde" + +# Get the list of the feature classes in the workspace +# fc_list = arcpy.ListFeatureClasses() +# # 循环验证每个fc是否为有效的sde创建的fc +# for fc in fc_list: +# fc = fc[fc.find(".")+1:] +# if fc.find("history") == 0: +# continue +# fc_his = "history" + fc.lower() +# if not arcpy.Exists(fc_his): +# print("Not exists: " + fc_his) +# else: +# print(fc_his) + +tb_list = arcpy.ListTables() +for tb in tb_list: + tb = tb[tb.find(".")+1:] + if tb.find("history") == 0: + continue + tb_his = "history" + tb.lower() + if not arcpy.Exists(tb_his): + print("Not exists: " + tb_his) + else: + print(tb_his) diff --git a/test_functions.py b/test_functions.py index f55b7d0..3ca5973 100644 --- a/test_functions.py +++ b/test_functions.py @@ -16,3 +16,5 @@ class TestFunctions(unittest.TestCase): rst, out = run_command(command_string) print(out) self.assertEqual(rst, True) + +