Merge branch 'master' into 'main'
base up See merge request wangh/shsmi_sysdb_nex!1
This commit is contained in:
commit
9482f13dce
|
@ -0,0 +1,3 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/log/2023-05-27 15-01-43-SdeSynchronous.txt" charset="GBK" />
|
||||
<file url="file://$PROJECT_DIR$/log/2023-05-27 15-09-33-SdeSynchronous.txt" charset="GBK" />
|
||||
<file url="file://$PROJECT_DIR$/log/2023-05-27 15-11-29-Translate2Old.txt" charset="GBK" />
|
||||
<file url="file://$PROJECT_DIR$/log/2023-05-27 15-20-40-Translate2Old.txt" charset="GBK" />
|
||||
<file url="file://$PROJECT_DIR$/log/2023-05-27 15-32-50-SdeSynchronous.txt" charset="GBK" />
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,17 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ignoredIdentifiers">
|
||||
<list>
|
||||
<option value="arcpy.da.SearchCursor" />
|
||||
<option value="arcpy.ExecuteError" />
|
||||
<option value="arcpy.da.InsertCursor" />
|
||||
<option value="arcpy.da.UpdateCursor" />
|
||||
<option value="arcpy.da.Editor" />
|
||||
<option value="arcpy.env" />
|
||||
</list>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
|
@ -0,0 +1,6 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7" project-jdk-type="Python SDK" />
|
||||
</project>
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/shsmi_sysdb_new.iml" filepath="$PROJECT_DIR$/.idea/shsmi_sysdb_new.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"python.pythonPath": "c:\\Python27\\ArcGIS10.2\\python.exe"
|
||||
}
|
|
@ -0,0 +1,740 @@
|
|||
# 图层对照列表
|
||||
[Layer_River_Normal_L]
|
||||
relationCount=1
|
||||
tagLayerName1=River_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Manager,Owner,Protector
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Pipe_APP_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Pipe_APP_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Administrative_Text]
|
||||
relationCount=1
|
||||
tagLayerName1=Administrative_Text
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Building_Text]
|
||||
relationCount=1
|
||||
tagLayerName1=Building_Text
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Control_Text]
|
||||
relationCount=1
|
||||
tagLayerName1=Control_Text
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Text]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Text
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Land_Text]
|
||||
relationCount=1
|
||||
tagLayerName1=Land_Text
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Other_Text]
|
||||
relationCount=1
|
||||
tagLayerName1=Other_Text
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Pipe_Text]
|
||||
relationCount=1
|
||||
tagLayerName1=Pipe_Text
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Relief_Text]
|
||||
relationCount=1
|
||||
tagLayerName1=Relief_Text
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_River_Text]
|
||||
relationCount=1
|
||||
tagLayerName1=River_Text
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_Text]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_Text
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_UPL_Text]
|
||||
relationCount=1
|
||||
tagLayerName1=UPL_Text
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Building_Simple_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Building_Simple
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Building_APP_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Building_APP_L
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Building_APP_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Building_APP_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Building_APP_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Building_APP_P
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Pole_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Pole_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Pole_No
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Basement_Entrance_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Basement_Entrance_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Ent_Name,Ent_No
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_RailWay_APP_P]
|
||||
relationCount=1
|
||||
tagLayerName1=RailWay_APP_P
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,AppCode
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_RailWay_APP_L]
|
||||
relationCount=1
|
||||
tagLayerName1=RailWay_APP_L
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_RailWay_APP_A]
|
||||
relationCount=1
|
||||
tagLayerName1=RailWay_APP_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_APP_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_APP_P
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('456000','456010','456100','456200','456300','456500','456810','456820','499000')
|
||||
[Layer_Road_GuideBoard_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_APP_P
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,RoadName,Start_No,End_No
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_BusStop_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_APP_P
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,RouteStr,StopName
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_APP_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_APP_L
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Overpass_Pole_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Overpass_Pole_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Pole_No
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_Edge_Ramp]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_Edge_Ramp
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_Edge_Approach]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_Edge_Approach
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Waterway_APP_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Waterway_APP_P
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Waterway_APP_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Waterway_APP_L
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Pipe_APP_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Pipe_APP_P
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,AppCode,BoxType,Owner
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('511400','512400','513000','514100','514300','516100','516200','517000','519000','519100','523100','524000','525000','526000','526100','531500','532500','533500','533600','533700','533800','544000','544100','544200','544300','544400','554000','562000','572000','581000','582000','583000','599000')
|
||||
[Layer_Pipe_APP_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Pipe_APP_L
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Owner
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_River_APP_P]
|
||||
relationCount=1
|
||||
tagLayerName1=River_APP_P
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_River_APP_L]
|
||||
relationCount=1
|
||||
tagLayerName1=River_APP_L
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_River_APP_A]
|
||||
relationCount=1
|
||||
tagLayerName1=River_APP_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Well_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Well_P
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Well_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Well_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_UPL_L]
|
||||
relationCount=1
|
||||
tagLayerName1=UPL_L
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Flood_Wall_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Flood_Wall_P
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_UpdateRegion_A]
|
||||
relationCount=1
|
||||
tagLayerName1=UpdateRegion_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Control_Point_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Control_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Building_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Building
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Story_E,BuildingArea,ConYear,BaseArea,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Building_Construction_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Building
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Building_Shed_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Building_Shed
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Building_Suspended_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Building_Suspended
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Building_Other_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Building_Other
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Wall_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Wall
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Height_A,Width
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('241100','241500','242100','243100','243300','245000','246000','247000','248000')
|
||||
[Layer_Wall_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Wall_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Basement_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Basement
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Doorplate_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Doorplate
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Industry_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,OWNER,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Service_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,OWNER,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('346000','347000','352000','352100','352300','352400','352410','358300','359100','359200','377200')
|
||||
[Layer_Device_Block_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,OWNER,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Other_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,OWNER,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Other_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,OWNER,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Industry_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,OWNER,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Service_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,OWNER,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Sights_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,OWNER,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Block_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,OWNER,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Industry_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Building
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Agriculture_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Building
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Service_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Building
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Other_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Building
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('234400','345200','351100','351200','352800','356100','399400')
|
||||
[Layer_Device_Building_Indst_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Building
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,RiskSource
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Building_OS_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Building
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Story_U
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Building_Sigt_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Building
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Story_U
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Building_Relig_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Building
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Story_U
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Building_Other_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Building
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Story_U
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Land_Service_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Land
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Is_BarrierFree,Owner
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('348000','348500','348600','348700','348710','377000','377300','377400')
|
||||
[Layer_Device_Land_Agricltr_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Land
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Owner
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Land_Other_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Land
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Owner
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('354100')
|
||||
[Layer_Pool_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Pool_FlatRoof
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Owner
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_FlatRoof_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Pool_FlatRoof
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Is_BarrierFree,Owner
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_RailWay_L]
|
||||
relationCount=1
|
||||
tagLayerName1=RailWay
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_Bed_Regular_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_Bed_Regular
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_Edge_Regular_L]
|
||||
relationCount=4
|
||||
tagLayerName1=Road_Edge_Regular
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('430100','430200','430300','430400','421100','421500','422100','422500','423100','423500','424100','424500','425100','425500','426100','426500')
|
||||
tagLayerName2=Road_Edge_Approach
|
||||
expression2=FeatureCode in ('430530')
|
||||
tagLayerName3=Road_Edge_Ramp
|
||||
expression3=FeatureCode in ('430500')
|
||||
tagLayerName4=Overpass_Edge
|
||||
expression4=FeatureCode in ('430600')
|
||||
[Layer_Road_Edge_Normal_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_Edge_Normal
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_Normal_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_Normal
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_Center_Line_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_Center_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Is_Park,Road_Level,Protector,Owner,SpatialType
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_Polygon_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_Polygon
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('421400','421700','422400','422700','423400','423700','424400','424700','425400','425700','426400','426700','430120','430220','430320','430420','430520','430550','430620','441400','442400','444200','468000')
|
||||
[Layer_Road_APP_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_APP_L
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_SeparationFacilt_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_APP_L
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,IsFixed,App_Type,Height
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_Column_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_APP_L
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Name,ColumnType,ColumnNum
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Parking_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Parking_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('456700')
|
||||
[Layer_Nav_Road_App_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_APP_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('458300')
|
||||
[Layer_Road_APP_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Road_APP_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Name
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Road_Interior_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Interior_Road
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Overpass_Edge_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Overpass_Edge
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Bridge_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Bridge
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,LimitA
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Ferry_Pier_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Waterway_APP_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Name,Capacity
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Waterway_APP_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Waterway_APP_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Ferry_Route_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Ferry_Route
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Name,Capacity
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Tunnel_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Tunnel
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Pipe_Line_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Pipe_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Owner
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_River_A]
|
||||
relationCount=1
|
||||
tagLayerName1=River
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Manager,Owner,Protector
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Lake_A]
|
||||
relationCount=1
|
||||
tagLayerName1=River
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Manager,Owner,Protector
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Reservoir_A]
|
||||
relationCount=1
|
||||
tagLayerName1=River
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Manager,Owner,Protector
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Ditch_A]
|
||||
relationCount=1
|
||||
tagLayerName1=River
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Manager,Owner,Protector
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_River_Edge_L]
|
||||
relationCount=1
|
||||
tagLayerName1=River_Edge
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('611200','611400','612200','613200','614300','615100','622500','623000','630100','632000','634200')
|
||||
[Layer_River_Center_Line_L]
|
||||
relationCount=1
|
||||
tagLayerName1=River_Center_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Flood_Control_Wall_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Flood_Control_Wall
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Bank_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Bank
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Ocean_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Ocean_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Ocean_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Ocean_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Ocean_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Ocean_Polygon
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Administrative_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Administrative_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Administrative_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Administrative_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Administrative_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Administrative_Area
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Other_Area_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Other_Area_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Other_Area_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Other_Area
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Mail_Area_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Mail_Area
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Block_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Block
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Community_Area_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Community_Area
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Function
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Service_Area_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Service_Area
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME,Function
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('727000','727100','729100','729200','729300')
|
||||
[Layer_Level_Point_A_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Level_Point_A
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Level_Point_R_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Level_Point_R
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Contour_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Contour
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Relief_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Relief_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Relief_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Relief_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Relief_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Relief_Polygon
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Embankment_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Embankment
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Land_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Land_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Land_L]
|
||||
relationCount=1
|
||||
tagLayerName1=Land_Line
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
expression1=FeatureCode in ('932300','932400','937600','938300','954100','961000','963000','964100','964200','999100','999200','999300','999310')
|
||||
[Layer_Land_Classification_A]
|
||||
relationCount=1
|
||||
tagLayerName1=Land_Classification
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_AncientTree_P]
|
||||
relationCount=1
|
||||
tagLayerName1=AncientTree_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Sights_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
[Layer_Device_Land_Other_P]
|
||||
relationCount=1
|
||||
tagLayerName1=Device_Point
|
||||
removeFieldNames1=DESCRIPTION,PRECISION,FILENAME3D,PROTIME
|
||||
renameFieldNames1=BiLC:MapScale
|
||||
|
||||
|
||||
# 编码对照 old_code:new_code
|
||||
[FeatureCode]
|
||||
relationLayers=Road_Edge_Regular,Road_Bed_Regular,Road_Center_Line,Road_Polygon,Road_Edge_Approach,Overpass_Edge,Overpass_Pole_A,Road_APP_L,Ocean_Polygon,Ocean_Line,RailWay_APP_A,RailWay_APP_P,RailWay_APP_L,Parking_A,Road_Edge_Ramp
|
||||
relationCount=73
|
||||
changeCode1=421100:431100
|
||||
changeCode2=421200:431200
|
||||
changeCode3=421300:431300
|
||||
changeCode4=421400:431400
|
||||
changeCode5=421500:431500
|
||||
changeCode6=421600:431600
|
||||
changeCode7=421700:431700
|
||||
changeCode8=422100:432100
|
||||
changeCode9=422200:432200
|
||||
changeCode10=422300:432300
|
||||
changeCode11=422400:432400
|
||||
changeCode12=422500:432500
|
||||
changeCode13=422600:432600
|
||||
changeCode14=422700:432700
|
||||
changeCode15=423100:433100
|
||||
changeCode16=423200:433200
|
||||
changeCode17=423300:433300
|
||||
changeCode18=423400:433400
|
||||
changeCode19=423500:433500
|
||||
changeCode20=423600:433600
|
||||
changeCode21=423700:433700
|
||||
changeCode22=424100:434100
|
||||
changeCode23=424200:434200
|
||||
changeCode24=424300:434300
|
||||
changeCode25=424400:434400
|
||||
changeCode26=424500:434500
|
||||
changeCode27=424600:434600
|
||||
changeCode28=424700:434700
|
||||
changeCode29=425100:435100
|
||||
changeCode30=425200:435200
|
||||
changeCode31=425300:435300
|
||||
changeCode32=425400:435400
|
||||
changeCode33=425500:435500
|
||||
changeCode34=425600:435600
|
||||
changeCode35=425700:435700
|
||||
changeCode36=426100:436100
|
||||
changeCode37=426200:436200
|
||||
changeCode38=426300:436300
|
||||
changeCode39=426400:436400
|
||||
changeCode40=426500:436500
|
||||
changeCode41=426600:436600
|
||||
changeCode42=426700:436700
|
||||
changeCode43=430500:440000
|
||||
changeCode44=430510:440100
|
||||
changeCode45=430520:440200
|
||||
changeCode46=430530:440500
|
||||
changeCode47=430540:440600
|
||||
changeCode48=430550:440700
|
||||
changeCode49=430600:446000
|
||||
changeCode50=430610:446100
|
||||
changeCode51=430620:446200
|
||||
changeCode52=430630:446300
|
||||
changeCode53=430640:446400
|
||||
changeCode54=459300:447100
|
||||
changeCode55=459310:447200
|
||||
changeCode56=616000:487800
|
||||
changeCode57=616100:487900
|
||||
changeCode58=419501:421100
|
||||
changeCode59=419502:421200
|
||||
changeCode60=419503:421300
|
||||
changeCode61=419504:422100
|
||||
changeCode62=419505:422200
|
||||
changeCode63=419506:421200
|
||||
changeCode64=419507:423200
|
||||
changeCode65=419508:424100
|
||||
changeCode66=419509:424200
|
||||
changeCode67=419510:424300
|
||||
changeCode68=419511:425000
|
||||
changeCode69=419512:426000
|
||||
changeCode70=419513:427000
|
||||
changeCode71=419514:428100
|
||||
changeCode72=419515:428400
|
||||
changeCode73=456700:456720
|
|
@ -0,0 +1,13 @@
|
|||
# 同步系统设置
|
||||
[System]
|
||||
eps_path=C:/EPS20221017/eps.exe
|
||||
python_path=C:/Python27/ArcGIS10.2/python.exe
|
||||
template_name="上海新型测绘_地理实体.mdt"
|
||||
eps_vbs=.\上海数据库同步\自动输出MDO.vbs
|
||||
sde_scheme=SHDLG500
|
||||
eps_show=show
|
||||
sync_type=ALL
|
||||
[UpdateRegion]
|
||||
layer_name=UpdateRegion_A
|
||||
updatetime_field=UpdateTime
|
||||
updatetime_field_history=DeleteTime
|
|
@ -0,0 +1,96 @@
|
|||
# coding=utf-8
|
||||
import json
|
||||
import os
|
||||
import socket
|
||||
import sys
|
||||
import shutil
|
||||
import datetime
|
||||
import subprocess
|
||||
import time
|
||||
import ctypes
|
||||
import urllib
|
||||
import urllib2
|
||||
from imp import reload
|
||||
|
||||
reload(sys)
|
||||
sys.setdefaultencoding('utf8')
|
||||
|
||||
|
||||
def run_command(command):
|
||||
"""call shell-command and either return its output or kill it
|
||||
if it doesn't normally exit within timeout seconds and return None"""
|
||||
cmd = command
|
||||
start = datetime.datetime.now()
|
||||
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
stdout, stderr = process.communicate()
|
||||
if stderr:
|
||||
return False, "Error:" + stderr.decode()
|
||||
else:
|
||||
return True, stdout.decode()
|
||||
|
||||
|
||||
def timeout_command(command, timeout):
|
||||
"""call shell-command and either return its output or kill it
|
||||
if it doesn't normally exit within timeout seconds and return None"""
|
||||
cmd = command
|
||||
start = datetime.datetime.now()
|
||||
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
while process.poll() is None:
|
||||
time.sleep(0.2)
|
||||
now = datetime.datetime.now()
|
||||
if (now - start).seconds > timeout:
|
||||
try:
|
||||
handle = ctypes.windll.kernel32.OpenProcess(1, False, process.pid)
|
||||
ctypes.windll.kernel32.TerminateProcess(handle, 0)
|
||||
except OSError:
|
||||
print(OSError)
|
||||
pass
|
||||
return None
|
||||
return process.stdout.readlines()
|
||||
|
||||
|
||||
def create_dir(path):
|
||||
"""递归创建目录"""
|
||||
if not os.path.exists(path):
|
||||
os.makedirs(path)
|
||||
|
||||
|
||||
def write_event_log(log_type, log_keyno, log_status, log_filelocalpos, log_remark):
|
||||
"""调用ERP的WriteEventLog通用接口"""
|
||||
url = 'http://localhost/SG_ERP/sg_webapi/erpsvc/common/erp.common.eventlog.WriteEventLog'
|
||||
log_soft = "python"
|
||||
soft_version = "python2.7"
|
||||
user = "admin"
|
||||
pc_name = socket.gethostname()
|
||||
ipaddr = socket.gethostbyname(pc_name)
|
||||
event_log = [{"log_type": log_type, "log_keyno": log_keyno, "log_status": log_status, "log_soft": log_soft,
|
||||
"softversion": soft_version, "log_filelocalpos": log_filelocalpos,
|
||||
"pcname": pc_name, "ipaddr": ipaddr, "user": user, "log_remark": log_remark}]
|
||||
|
||||
json_event_log = json.dumps(event_log, ensure_ascii=False)
|
||||
values = {'access_token': "", 'api': "erp.common.eventlog.WriteEventLog", 'eventLog': json_event_log}
|
||||
data = urllib.urlencode(values)
|
||||
req = urllib2.Request(url + '?' + data)
|
||||
response = urllib2.urlopen(req)
|
||||
print(response.read())
|
||||
|
||||
|
||||
def output_map_result(iid, result, filename, maptype):
|
||||
url = "http://localhost/SG_ERP/sg_webapi/erpsvc/common/erp.pro.shchy.outputmapresult"
|
||||
values = {'access_token': "", 'api': "erp.pro.shchy.outputmapresult", 'iid': iid, 'result': result,
|
||||
'filename': filename, 'maptype': maptype}
|
||||
data = urllib.urlencode(values)
|
||||
|
||||
req = urllib2.Request(url + '?' + data)
|
||||
print(url + '?' + data)
|
||||
response = urllib2.urlopen(req)
|
||||
print(response.code)
|
||||
print(str(response.read()).encode('gbk'))
|
||||
|
||||
|
||||
def get_tag_tablespace(fc_name):
|
||||
"""根据feature class截取表空间名"""
|
||||
index1 = fc_name.rfind('\\')
|
||||
index2 = fc_name.rfind('.')
|
||||
tablespace = fc_name[index1 + 1:index2 - index1 - 1]
|
||||
return tablespace
|
|
@ -0,0 +1,44 @@
|
|||
# coding=utf-8
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
from imp import reload
|
||||
|
||||
reload(sys)
|
||||
sys.setdefaultencoding('utf8')
|
||||
|
||||
|
||||
class Logger:
|
||||
def __init__(self, log_file):
|
||||
self.logger = logging.getLogger(__name__)
|
||||
self.logger.setLevel(logging.DEBUG)
|
||||
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||
file_handler = logging.FileHandler(log_file)
|
||||
file_handler.setLevel(logging.DEBUG)
|
||||
file_handler.setFormatter(formatter)
|
||||
self.logger.addHandler(file_handler)
|
||||
|
||||
def log(self, message):
|
||||
self.logger.info(message)
|
||||
|
||||
def error(self, message):
|
||||
self.logger.error(message)
|
||||
|
||||
def warning(self, message):
|
||||
self.logger.warning(message)
|
||||
|
||||
def debug(self, message):
|
||||
self.logger.debug(message)
|
||||
|
||||
# 关闭日志
|
||||
def close(self):
|
||||
self.logger.removeHandler(self.logger.handlers[0])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
logger = Logger('log/TestLog.log')
|
||||
logger.log(u'################ SdeSynchronous ################\n\n')
|
||||
logger.log(u"输出增量MDO完成")
|
||||
logger.error(u"输出层信息失败!")
|
||||
logger.warning(u"信息不对等,请注意!")
|
||||
logger.debug(u"这里的数值是1")
|
|
@ -0,0 +1,42 @@
|
|||
# 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 *
|
||||
from sys_config import SysConfig
|
||||
|
||||
reload(sys)
|
||||
sys.setdefaultencoding('utf8')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
"""程序入口"""
|
||||
# 获取当前路径
|
||||
caller_file = inspect.getfile(inspect.currentframe())
|
||||
work_pathname = os.path.abspath(os.path.dirname(caller_file))
|
||||
# 同步开始时间
|
||||
curr_sync_date = time.strftime("%Y-%m-%d", time.localtime())
|
||||
curr_sync_time = time.strftime("%H-%M-%S", time.localtime())
|
||||
# 设置当前工作路径
|
||||
config = SysConfig()
|
||||
config.pathname = work_pathname
|
||||
config.curr_sync_datetime = curr_sync_date + " " + curr_sync_time
|
||||
# 日志记录
|
||||
create_dir(work_pathname + "\\log")
|
||||
config.logfile_name = work_pathname + "\\log\\" + config.curr_sync_datetime + "-SdeSynchronous.txt"
|
||||
logger = Logger(config.logfile_name)
|
||||
logger.log("==SdeSynchronous Started==")
|
||||
logger.log("Process begin at " + str(curr_sync_date) + " " + str(curr_sync_time) + ".")
|
||||
|
||||
sde_db_sync = SdeSynchronous(config, logger)
|
||||
sde_db_sync.run()
|
||||
|
||||
# 同步结束时间
|
||||
end_date = time.strftime("%Y-%m-%d", time.localtime())
|
||||
end_time = time.strftime("%H-%M-%S", time.localtime())
|
||||
logger.log("Process completed at " + str(end_date) + " " + str(end_time) + ".")
|
||||
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
# coding=utf-8
|
||||
import sys
|
||||
from imp import reload
|
||||
import arcpy
|
||||
|
||||
reload(sys)
|
||||
sys.setdefaultencoding('utf8')
|
||||
|
||||
|
||||
# 获取参数
|
||||
args = sys.argv[1:]
|
||||
|
||||
if not args or len(args) < 6:
|
||||
sys.exit("参数不足:需要文件路径")
|
||||
else:
|
||||
src_sde = args[0]
|
||||
type_name = args[1]
|
||||
fc_name = args[2]
|
||||
outLocation = args[3]
|
||||
fc_cur = args[4]
|
||||
expression = args[5]
|
||||
arcpy.env.workspace = src_sde
|
||||
if type_name == u'feature':
|
||||
print(' [sde_fc2fc.py]: ' + '##output feature##')
|
||||
fc_out = arcpy.FeatureClassToFeatureClass_conversion(fc_name, outLocation, fc_cur, expression)
|
||||
print(' [sde_fc2fc.py]: ' + str(arcpy.GetCount_management(fc_out)))
|
||||
elif type_name == u'table':
|
||||
print(' [sde_fc2fc.py]: ' + '##output table##')
|
||||
fc_out = arcpy.TableToTable_conversion(fc_name, outLocation, fc_cur, expression)
|
||||
print(' [sde_fc2fc.py]: ' + str(arcpy.GetCount_management(fc_out)))
|
|
@ -0,0 +1,557 @@
|
|||
# coding=utf-8
|
||||
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',
|
||||
'SS_TABSAPCEPERMISSIONINFO', 'SS_USERINFO', 'SUNWAY_INIINFO', 'SS_LAYERINFO',
|
||||
'GE_ENTITYCODE', 'GE_ENTITYIDTB']
|
||||
|
||||
|
||||
class SdeSynchronous:
|
||||
def __init__(self, conf, log):
|
||||
self.config = conf
|
||||
self.logger = log
|
||||
self.error_count = 0
|
||||
self.src_sde = None
|
||||
self.txt_ct_file = None # 记录数量的txt文件
|
||||
self.out_gdb_path = None
|
||||
self.out_gdb_files = {}
|
||||
self.only_changed_layers = False
|
||||
|
||||
def run(self):
|
||||
"""同步的主函数"""
|
||||
# 1.连接SDE数据库
|
||||
self.src_sde = self.get_connection(str(u"源库SDE连接"))
|
||||
if self.src_sde == "" or self.src_sde is None:
|
||||
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")
|
||||
self.txt_ct_file = open(txt_path, "wb+", buffering=0)
|
||||
# 开始编辑SDE
|
||||
edit = self.start_edit()
|
||||
# 获取上次同步的时间
|
||||
last_sync_datetime = self.get_last_sync_datetime()
|
||||
if last_sync_datetime == "":
|
||||
self.config.last_sync_datetime = self.config.curr_sync_datetime
|
||||
else:
|
||||
self.config.last_sync_datetime = last_sync_datetime
|
||||
self.logger.log('===' + self.config.last_sync_datetime + "==TO==" + self.config.curr_sync_datetime + "===")
|
||||
# 获取fc列表
|
||||
fc_list = arcpy.ListFeatureClasses("*", "all")
|
||||
# 获取同步工程信息
|
||||
last_gongch, last_yewbh = self.get_projects_info()
|
||||
self.write_start_event_logs(last_gongch)
|
||||
# 输出增量
|
||||
self.sde2gdb_feature_list(fc_list)
|
||||
# 获取数据集列表
|
||||
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
|
||||
# 更改工作空间回到SDE
|
||||
arcpy.env.workspace = self.src_sde
|
||||
# 获取数据集中fc列表
|
||||
fc_list = arcpy.ListFeatureClasses(feature_dataset=DS)
|
||||
# 输出增量
|
||||
self.sde2gdb_feature_list(fc_list)
|
||||
# 获取关联关系表列表
|
||||
re_table_list = arcpy.ListTables("SHDLG500.*", "all")
|
||||
self.sde2gdb_table_list(re_table_list)
|
||||
|
||||
bool_save = True if self.error_count == 0 else False
|
||||
if bool_save:
|
||||
# 记录同步成功时间
|
||||
self.set_last_sync_datetime()
|
||||
# 停止编辑
|
||||
self.stop_edit(edit, bool_save)
|
||||
|
||||
# 执行回调返回gdb增量输出结果
|
||||
self.return_result("gdb", bool_save, last_gongch, last_yewbh)
|
||||
# 结果输出到日志信息
|
||||
str_message = u"输出增量GDB完成" if bool_save else u"输出增量GDB失败"
|
||||
self.logger.log(str_message.encode("gb2312"))
|
||||
arcpy.env.workspace = self.out_gdb_path + "\\" + self.out_gdb_files["Delete"]
|
||||
delete_fcs = arcpy.ListFeatureClasses()
|
||||
for FC in delete_fcs:
|
||||
arcpy.AddField_management(FC, "FEATUREGUIDCOPY", "TEXT")
|
||||
arcpy.CalculateField_management(FC, "FEATUREGUIDCOPY", "[FEATUREGUID]", "VB")
|
||||
arcpy.DeleteIdentical_management(FC, ["FEATUREGUIDCOPY"])
|
||||
arcpy.DeleteField_management(FC, ["FEATUREGUIDCOPY"])
|
||||
|
||||
if bool_save:
|
||||
# 开始输出mdo
|
||||
# self.copy_to_mdo(str(self.out_gdb_path).encode('gbk'))
|
||||
# 转换到旧标准的gdb
|
||||
self.trans_to_old()
|
||||
# 输出保密的gdb
|
||||
self.output_security_gdb()
|
||||
# TODO 写旧标准输出完成的标记文档
|
||||
# WriteFinishFlag
|
||||
|
||||
# 执行回调返回mdo输出结果
|
||||
self.return_result("mdo", bool_save, last_gongch, last_yewbh)
|
||||
# 结果输出到日志信息
|
||||
str_message = u"输出增量MDO完成" if bool_save else u"输出增量MDO失败"
|
||||
self.logger.log(str_message.encode("gb2312"))
|
||||
|
||||
def create_gdb_files(self):
|
||||
try:
|
||||
# 创建输出GDB
|
||||
tt = self.config.curr_sync_datetime
|
||||
self.out_gdb_path = self.config.pathname + "\\" + u"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():
|
||||
gdb_path = self.out_gdb_path + "\\" + self.out_gdb_files[key]
|
||||
if arcpy.Exists(gdb_path):
|
||||
arcpy.Delete_management(gdb_path)
|
||||
arcpy.CreateFileGDB_management(self.out_gdb_path, self.out_gdb_files[key])
|
||||
except Exception as e:
|
||||
self.logger.error("create_gdb error:\n" + str(e))
|
||||
|
||||
def get_connection(self, sub_path):
|
||||
"""获取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 ""
|
||||
|
||||
def start_edit(self):
|
||||
"""开始编辑"""
|
||||
arcpy.env.workspace = self.src_sde
|
||||
print(str(self.src_sde).encode('gb2312'))
|
||||
edit = arcpy.da.Editor(self.src_sde)
|
||||
edit.startEditing(False, False)
|
||||
edit.startOperation()
|
||||
return edit
|
||||
|
||||
def stop_edit(self, edit, bool_save):
|
||||
"""停止编辑"""
|
||||
arcpy.env.workspace = self.src_sde
|
||||
# 停止编辑
|
||||
edit.stopOperation()
|
||||
edit.stopEditing(bool_save)
|
||||
|
||||
def write_start_event_logs(self, last_gongch):
|
||||
"""反查更新的项目编号,并写OA事件"""
|
||||
for GongCH in last_gongch:
|
||||
write_event_log("OutPutMap_GDB",
|
||||
GongCH,
|
||||
u"开始".encode('utf8'),
|
||||
self.config.logfile_name.decode('gbk').encode('utf8'),
|
||||
u"增量输出GDB文件开始".encode('utf8'))
|
||||
# write_event_log("OutPutMap_MDO",
|
||||
# GongCH,
|
||||
# u"开始".encode('utf8'),
|
||||
# self.config.logfile_name.decode('gbk').encode('utf8'),
|
||||
# u"增量输出MDO文件开始".encode('utf8'))
|
||||
|
||||
def get_projects_info(self):
|
||||
feature_class = self.config.sde_scheme() + "." + self.config.updateregion()
|
||||
time_values = {"from_time": self.config.last_sync_datetime, "to_time": self.config.curr_sync_datetime}
|
||||
time_condition = """UPDATETIME>=TO_DATE('{from_time}','YYYY-MM-DD HH24:MI:SS') and
|
||||
DOWNLOADTIME<TO_DATE('{to_time}','YYYY-MM-DD HH24:MI:SS')""".format(**time_values)
|
||||
f1, f2, f3 = "OBJECTID", "GONGCH", "YEWBH"
|
||||
try:
|
||||
with arcpy.da.SearchCursor(feature_class, [f1, f2, f3], where_clause=time_condition,
|
||||
sql_clause=(None, 'ORDER BY OBJECTID DESC')) as cur:
|
||||
gongch_list = [row[1] for row in cur]
|
||||
yewbh_list = [row[2] for row in cur]
|
||||
except arcpy.ExecuteError:
|
||||
print(arcpy.GetMessages().encode('gb2312'))
|
||||
self.logger.error(arcpy.GetMessages().encode('gb2312'))
|
||||
return gongch_list, yewbh_list
|
||||
|
||||
def sde2gdb_feature_list(self, fc_list):
|
||||
"""根据fc列表同步输出增量"""
|
||||
for FC in fc_list:
|
||||
str_msg = "Process Dataset: " + FC.encode("gb2312")
|
||||
index = FC.rfind('.')
|
||||
fc_name = FC[index + 1:]
|
||||
|
||||
# 跳过非指定表空间中的fc
|
||||
tablespace_name = get_tag_tablespace(FC)
|
||||
if tablespace_name != self.config.sde_scheme():
|
||||
continue
|
||||
|
||||
# 跳过updateregion_qp
|
||||
if fc_name in ['UpdateRegion_QP', 'NewCity', 'NewCity_A', 'PlanRegion']:
|
||||
continue
|
||||
|
||||
# 只同步图元时,跳过Et_ historyEt_开头的图层
|
||||
index_et = fc_name.lower().rfind('et_')
|
||||
index_h_et = fc_name.lower().rfind('historyet_')
|
||||
if self.config.sync_type() == "TUY":
|
||||
if index_h_et == 0 or index_et == 0:
|
||||
continue
|
||||
|
||||
# 调试时筛选图层输出
|
||||
if self.config.is_debug:
|
||||
if fc_name not in ['Building_A', 'historyBuilding_A']:
|
||||
continue
|
||||
# 记录图层地物个数
|
||||
self.record_count(fc_name)
|
||||
print(str_msg)
|
||||
# 输出增删改三文件数据
|
||||
self.export_one_layer_3f(fc_name)
|
||||
|
||||
def sde2gdb_table_list(self, table_list):
|
||||
"""增量同步table表记录"""
|
||||
for TB in table_list:
|
||||
str_msg = "Process Table: " + TB.encode("gb2312")
|
||||
tb_name = TB[TB.rfind('.') + 1:]
|
||||
|
||||
# 跳过系统表
|
||||
if tb_name in g_sys_tb:
|
||||
continue
|
||||
# 跳过二三维模型关联表 Re3D_ historyRe3D_ 开头的图层
|
||||
index_3d = tb_name.lower().rfind('re3d_')
|
||||
index_h_3d = tb_name.lower().rfind('historyre3d_')
|
||||
if index_3d == 0 or index_h_3d == 0:
|
||||
continue
|
||||
# 只同步图元时跳过所有table
|
||||
if self.config.sync_type == "TUY":
|
||||
continue
|
||||
|
||||
# 调试时筛选表输出
|
||||
if self.config.is_debug:
|
||||
if tb_name not in ['Re_Building_A',
|
||||
'historyRe_Building_A',
|
||||
'ReEnt_Building_A',
|
||||
'historyReEnt_Building_A']:
|
||||
continue
|
||||
# 记录图层地物个数
|
||||
self.record_count(tb_name)
|
||||
print(str_msg)
|
||||
# 输出增删改三文件数据
|
||||
self.export_one_table_3f(tb_name)
|
||||
|
||||
def export_one_layer_3f(self, fc_name):
|
||||
"""输出一个FeatureClass的增量"""
|
||||
last_max_object_id = self.get_last_max_object_id(fc_name)
|
||||
index0 = fc_name.find("history")
|
||||
if index0 == 0:
|
||||
return
|
||||
fc_history = "history" + fc_name
|
||||
expression_add, expression_edit, expression_delete = self.get_export_expression(fc_name)
|
||||
self.logger.log("Exporting Layer:" + fc_name.encode("gb2312"))
|
||||
try:
|
||||
if self.is_export_one_layer(fc_name):
|
||||
# 输出新增数据
|
||||
add_gdb_path = self.out_gdb_path + "\\" + self.out_gdb_files["Add"]
|
||||
self.featureclass_to_featureclass(fc_name, add_gdb_path, fc_name, expression_add)
|
||||
# 输出修改数据
|
||||
edit_gdb_path = self.out_gdb_path + "\\" + self.out_gdb_files["Edit"]
|
||||
self.featureclass_to_featureclass(fc_name, edit_gdb_path, fc_name, expression_edit)
|
||||
# 记录最大ObjectID
|
||||
max_object_id = self.get_max_object_id(fc_name)
|
||||
self.set_last_max_object_id(fc_name, max_object_id)
|
||||
self.logger.log("LastMaxObjectID:" + str(last_max_object_id) + ", CurMaxObjectID:" + str(max_object_id))
|
||||
elif self.is_export_one_layer(fc_history):
|
||||
# 输出删除数据
|
||||
delete_gdb_path = self.out_gdb_path + "\\" + self.out_gdb_files["Delete"]
|
||||
self.featureclass_to_featureclass(fc_history, delete_gdb_path, fc_name, expression_delete)
|
||||
max_object_id_his = self.get_max_object_id(fc_history)
|
||||
self.set_last_max_object_id(fc_history, max_object_id_his)
|
||||
self.logger.log(
|
||||
"LastMaxObjectID:" + str(last_max_object_id) + ", CurMaxObjectID:" + str(max_object_id_his))
|
||||
else:
|
||||
self.logger.log("No Change Detected!")
|
||||
except arcpy.ExecuteError:
|
||||
str1 = str(arcpy.GetMessages().encode("gb2312"))
|
||||
self.logger.error(str1)
|
||||
self.error_count += 1
|
||||
except Exception as e:
|
||||
str1 = str(e.args[0]).encode("gb2312")
|
||||
self.logger.error(str1)
|
||||
self.error_count += 1
|
||||
|
||||
def export_one_table_3f(self, tb_name):
|
||||
self.logger.log("TableToTable:" + tb_name.encode('gb2312'))
|
||||
index0 = tb_name.find("history")
|
||||
if index0 == 0:
|
||||
return
|
||||
tb_history = "history" + tb_name
|
||||
|
||||
entity_index = tb_name.find("ReEnt_")
|
||||
tb_type = "entity_rela" if entity_index == 0 else "elem_rela"
|
||||
expression_add, expression_edit, expression_delete = self.get_export_expression(tb_name, tb_type)
|
||||
try:
|
||||
# 输出增删改三文件数据
|
||||
add_gdb_path = self.out_gdb_path + "\\" + self.out_gdb_files["Add"]
|
||||
self.table_to_table(tb_name, add_gdb_path, tb_name, expression_add)
|
||||
edit_gdb_path = self.out_gdb_path + "\\" + self.out_gdb_files["Edit"]
|
||||
self.table_to_table(tb_name, edit_gdb_path, tb_name, expression_edit)
|
||||
delete_gdb_path = self.out_gdb_path + "\\" + self.out_gdb_files["Delete"]
|
||||
self.table_to_table(tb_history, delete_gdb_path, tb_name, expression_delete)
|
||||
except arcpy.ExecuteError:
|
||||
errmsg = str(arcpy.GetMessages().encode("gb2312"))
|
||||
self.logger.error(errmsg)
|
||||
self.error_count += 1
|
||||
|
||||
def get_export_expression(self, fc_name, fc_type="fc"):
|
||||
"""获取输出表达式"""
|
||||
fc_history = "history" + fc_name
|
||||
fc_current = fc_name
|
||||
|
||||
sql_dic = {"sys_time": self.get_sys_time_condition(False),
|
||||
"sys_time_his": self.get_sys_time_condition(True),
|
||||
"fc": fc_current,
|
||||
"his_fc": fc_history,
|
||||
"is_in_his": "NOT IN",
|
||||
"last_time": self.config.last_sync_datetime,
|
||||
"curr_time": self.config.curr_sync_datetime,
|
||||
"up_time_field": self.config.updatetime_field(),
|
||||
"del_time_field": self.config.updatetime_field_history(),
|
||||
"guid_field": "FeatureGuid"}
|
||||
|
||||
if fc_type == "entity_rela":
|
||||
sql_dic.update(guid_field="EntityRelaGUID")
|
||||
elif fc_type == "elem_rela":
|
||||
sql_dic.update(guid_field="ElemRelaGUID")
|
||||
|
||||
expression_his = "{sys_time_his} " \
|
||||
"and ({his_fc}.{up_time_field}<TO_DATE('{last_time}','YYYY-MM-DD HH24:MI:SS') " \
|
||||
"or {his_fc}.{up_time_field} IS NULL) " \
|
||||
"and ({guid_field} NOT IN (SELECT {guid_field} FROM {fc}))"
|
||||
|
||||
expression_cur = "{sys_time} and {guid_field} {is_in_his} (SELECT {guid_field} FROM {his_fc} " \
|
||||
"WHERE {del_time_field}>=TO_DATE('{last_time}','YYYY-MM-DD HH24:MI:SS') " \
|
||||
"and {del_time_field}<TO_DATE('{curr_time}','YYYY-MM-DD HH24:MI:SS') " \
|
||||
"and ({up_time_field}<TO_DATE('{last_time}','YYYY-MM-DD HH24:MI:SS') " \
|
||||
"or {up_time_field} IS NULL))"
|
||||
|
||||
expression_del = expression_his.format(**sql_dic)
|
||||
# 新增地物现势表存在,历史表不存在
|
||||
expression_add = expression_cur.format(**sql_dic)
|
||||
# 修改地物现势表存在,历史表也存在
|
||||
sql_dic.update(is_in_his="IN")
|
||||
expression_edit = expression_cur.format(**sql_dic)
|
||||
return expression_add, expression_edit, expression_del
|
||||
|
||||
def get_last_max_object_id(self, fc_name):
|
||||
"""获取上次同步记录的最大ObjectID"""
|
||||
section_name = "{}_SHDB_LayerInfo_LastMaxID".format(self.config.sde_scheme())
|
||||
with arcpy.da.SearchCursor("SUNWAY_INIINFO", ["STRINGVALUE"],
|
||||
"SECTION='{}' and KEYNAME='{}'".format(section_name, fc_name)) as cur:
|
||||
for row in cur:
|
||||
last_id = int(row[0])
|
||||
return last_id
|
||||
return 0
|
||||
|
||||
def get_last_sync_datetime(self):
|
||||
section_name = self.config.sde_scheme() + "_Dbsyn_gdb"
|
||||
key_name = "LastExportTime"
|
||||
expression = "SECTION='{}' and KEYNAME='{}'".format(section_name, key_name)
|
||||
with arcpy.da.SearchCursor("SUNWAY_INIINFO", "STRINGVALUE", expression) as cur:
|
||||
last_time = [row[0] for row in cur]
|
||||
return last_time[0] if last_time else ""
|
||||
|
||||
def set_iniinfo_value_int(self, section_suffix, fc_name, value):
|
||||
"""Helper function to update or insert a value."""
|
||||
section_name = "{}_{}".format(self.config.sde_scheme(), section_suffix)
|
||||
fields = ["SECTION", "KEYNAME", "STRINGVALUE"]
|
||||
|
||||
with arcpy.da.UpdateCursor("SUNWAY_INIINFO",
|
||||
fields,
|
||||
where_clause="SECTION='{}' and KEYNAME='{}'".format(section_name, fc_name)) as cur:
|
||||
try:
|
||||
row = next(cur)
|
||||
last_value = row[2]
|
||||
row[2] = str(value)
|
||||
cur.updateRow(row)
|
||||
except StopIteration: # If the cursor is empty
|
||||
with arcpy.da.InsertCursor("SUNWAY_INIINFO", fields) as insert_cur:
|
||||
insert_cur.insertRow((section_name, fc_name, str(value)))
|
||||
last_value = ""
|
||||
|
||||
print("{}:{} {}-->{}".format(section_name, fc_name, last_value, value))
|
||||
|
||||
def set_last_max_object_id(self, fc_name, objectid):
|
||||
"""记录最大ObjectID"""
|
||||
self.set_iniinfo_value_int("SHDB_LayerInfo_LastMaxID", fc_name, objectid)
|
||||
# 记录同步完成状态
|
||||
self.set_iniinfo_value_int("SHDB_LayerInfo_SynchronousStatus", fc_name, 1)
|
||||
|
||||
def set_last_sync_datetime(self):
|
||||
"""记录同步时间"""
|
||||
section_name = self.config.sde_scheme() + "_Dbsyn_gdb"
|
||||
key_name = "LastExportTime"
|
||||
self.set_iniinfo_value_int(section_name, key_name, self.config.curr_sync_datetime)
|
||||
|
||||
def get_max_object_id(self, fc_name):
|
||||
"""获取图层当前最大ObjectID"""
|
||||
try:
|
||||
with arcpy.da.SearchCursor(fc_name, "OBJECTID", where_clause="ObjectID>0",
|
||||
sql_clause=(None, 'ORDER BY OBJECTID DESC')) as cur:
|
||||
try:
|
||||
return next(cur)[0]
|
||||
except StopIteration:
|
||||
return 0
|
||||
except arcpy.ExecuteError as e:
|
||||
errmsg = str(arcpy.GetMessages(2).encode("gb2312"))
|
||||
print("Error occurred when accessing {}: {}".format(fc_name, errmsg))
|
||||
self.logger.log("Error occurred when accessing {}: {}".format(fc_name, e))
|
||||
return 0
|
||||
|
||||
def get_sys_time_condition(self, is_history):
|
||||
"""当前增量同步时间"""
|
||||
time_field = self.config.updatetime_field_history() if is_history else self.config.updatetime_field()
|
||||
str_sql = "{}>=TO_DATE('{}','YYYY-MM-DD HH24:MI:SS') and {}<TO_DATE('{}','YYYY-MM-DD HH24:MI:SS')"
|
||||
time_condition = str_sql.format(time_field, self.config.last_sync_datetime,
|
||||
time_field, self.config.curr_sync_datetime)
|
||||
return time_condition
|
||||
|
||||
def record_count(self, layer):
|
||||
count = 0
|
||||
layer_lower = layer.lower()
|
||||
if layer_lower.find('history') == 0:
|
||||
return
|
||||
try:
|
||||
with arcpy.da.SearchCursor(layer, ['ObjectID']) as rows:
|
||||
for row in rows:
|
||||
count += 1
|
||||
msg = str(layer).encode("gb2312")
|
||||
self.txt_ct_file.write(
|
||||
str(u"{0}:{1}\r\n").encode('gb2312').format(msg, count))
|
||||
except BaseException as e:
|
||||
self.txt_ct_file.write(e)
|
||||
|
||||
def is_export_one_layer(self, fc_name):
|
||||
"""控制图层是否输出"""
|
||||
last_max_object_id = self.get_last_max_object_id(fc_name)
|
||||
max_object_id = self.get_max_object_id(fc_name)
|
||||
print("last_max_id:" + str(last_max_object_id) + " || current_max_id:" + str(max_object_id))
|
||||
if self.only_changed_layers:
|
||||
return last_max_object_id != max_object_id
|
||||
else:
|
||||
return True
|
||||
|
||||
def featureclass_to_featureclass(self, fc_name, out, fc_cur, expression):
|
||||
"""启动python子进程输出feature到gdb"""
|
||||
return self.fc2fc(fc_name, out, fc_cur, expression, u'feature')
|
||||
|
||||
def table_to_table(self, fc_name, out, fc_cur, expression):
|
||||
"""启动python子进程输出table到gdb"""
|
||||
return self.fc2fc(fc_name, out, fc_cur, expression, u'table')
|
||||
|
||||
def fc2fc(self, fc_name, out, fc_cur, expression, fc_type):
|
||||
"""启动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' ')
|
||||
type_cmd = str(fc_type + u' ').encode('gb2312')
|
||||
fc_name_cmd = str(fc_name + u' ').encode('gb2312')
|
||||
out_cmd = str(out + u' ').encode('gb2312')
|
||||
fc_cur_cmd = str(fc_cur + u' ').encode('gb2312')
|
||||
exp_cmd = str(u'"' + expression + u'" ')
|
||||
# 启动命令参数
|
||||
command_string = python_path + script + src_sde + type_cmd + fc_name_cmd + out_cmd + fc_cur_cmd + exp_cmd
|
||||
success, out_msg = run_command(command_string)
|
||||
print(out_msg)
|
||||
if not success:
|
||||
# 使外部可以捕获异常
|
||||
raise Exception(out_msg)
|
||||
return success
|
||||
|
||||
def return_result(self, file_type, b_save, gongch_list, yewbh_list):
|
||||
"""返回信息"""
|
||||
# file_type "gdb" "mdo" b_save true false
|
||||
log_type = "OutPutMap_GDB" if file_type == "gdb" else "OutPutMap_MDO"
|
||||
log_status = u"成功" if b_save else u"失败"
|
||||
log_remark = u"增量输出文件成功" if b_save else u"增量输出文件失败"
|
||||
result = "true" if b_save else "false"
|
||||
for GongCH in gongch_list:
|
||||
write_event_log(log_type,
|
||||
GongCH,
|
||||
log_status.encode('utf8'),
|
||||
self.config.logfile_name.decode('gbk').encode('utf8'),
|
||||
log_remark.encode('utf8'))
|
||||
for YeWBH in yewbh_list:
|
||||
output_map_result(YeWBH, "true", "", file_type)
|
||||
|
||||
def copy_to_mdo(self, path_name):
|
||||
"""启动EPS输出MDO"""
|
||||
eps_path = str(self.config.eps_path() + u' ').encode('gb2312')
|
||||
template_name = self.config.template_name()
|
||||
runscript = str(u'/runscript ' + template_name + u' ').encode('gb2312')
|
||||
script_path = str(u'"' + self.config.eps_vbs() + u'" ').encode('gb2312')
|
||||
show_setting = str(u'/showwindow "' + self.config.eps_show_window() + u'" /autoexit ').encode('gb2312')
|
||||
share_parameter = str(u'/WriteShareParameter ProjectInfo,pathname,').encode('gb2312')
|
||||
# 启动命令参数
|
||||
command1 = eps_path + runscript + script_path + show_setting + share_parameter + path_name
|
||||
timeout_command(command1, 28800)
|
||||
|
||||
def trans_to_old(self):
|
||||
# 标准降级输出
|
||||
self.logger.log("--Start Translate TO old--")
|
||||
"""启动Python输出OldGDB"""
|
||||
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')
|
||||
run_command(command1)
|
||||
self.logger.log("--End Translate TO old--")
|
||||
# 移动文件
|
||||
# remove_file(g_outFolderPath + "\\" + "OldGDB", g_outNewFolderPath)
|
||||
|
||||
def output_security_gdb(self):
|
||||
# 开始输出保密增删gdb
|
||||
out_security_new_folder_path = self.out_gdb_path + "\\OldGDB\\SecurityGdb"
|
||||
create_dir(out_security_new_folder_path)
|
||||
add_and_edit_gdb = self.out_gdb_path + "\\OldGDB\\addAndEditFeatures.gdb"
|
||||
delete_gdb = self.out_gdb_path + "\\OldGDB\\deleteFeatures.gdb"
|
||||
security_add_and_edit_gdb = out_security_new_folder_path + "\\securityaddAndEditFeatures.gdb"
|
||||
security_delete_gdb = out_security_new_folder_path + "\\securitydeleteFeatures.gdb"
|
||||
arcpy.CreateFileGDB_management(out_security_new_folder_path, "securityaddAndEditFeatures.gdb") # 建立汇总数据库
|
||||
arcpy.CreateFileGDB_management(out_security_new_folder_path, "securitydeleteFeatures.gdb")
|
||||
|
||||
# "增改"文件
|
||||
arcpy.env.workspace = add_and_edit_gdb
|
||||
fcs = arcpy.ListFeatureClasses()
|
||||
print("=== start security trans ===")
|
||||
for fc in fcs:
|
||||
print("addandedit " + fc)
|
||||
if fc == 'Pool_FlatRoof':
|
||||
expression = "FEATURECode not in ('338100','338300')"
|
||||
# 输出"保密增改"文件
|
||||
arcpy.FeatureClassToFeatureClass_conversion(fc, security_add_and_edit_gdb, fc, expression)
|
||||
elif fc not in ["Device_Point", "Device_Line", "Device_Building", "Device_Text", "Pipe_Text",
|
||||
"Ocean_Polygon",
|
||||
"Control_Point", "Control_Text", "UPL_L", "UPL_Text", "Level_Point_A", "Level_Point_R",
|
||||
"Contour", "UpdateRegion_A"]:
|
||||
# 输出"保密增改"文件
|
||||
arcpy.FeatureClassToFeatureClass_conversion(fc, security_add_and_edit_gdb, fc)
|
||||
|
||||
# "删"文件
|
||||
arcpy.env.workspace = delete_gdb
|
||||
fcs = arcpy.ListFeatureClasses()
|
||||
for fc in fcs:
|
||||
print("delete " + fc)
|
||||
if fc == 'Pool_FlatRoof':
|
||||
expression = "FEATURECode not in ('338100','338300')"
|
||||
# 输出"保密删"文件
|
||||
arcpy.FeatureClassToFeatureClass_conversion(fc, security_delete_gdb, fc, expression)
|
||||
elif fc not in ["Device_Point", "Device_Line", "Device_Building", "Device_Text", "Pipe_Text",
|
||||
"Ocean_Polygon",
|
||||
"Control_Point", "Control_Text", "UPL_L", "UPL_Text", "Level_Point_A", "Level_Point_R",
|
||||
"Contour", "UpdateRegion_A"]:
|
||||
# 输出"保密删"文件
|
||||
arcpy.FeatureClassToFeatureClass_conversion(fc, security_delete_gdb, fc)
|
||||
print("=== end security trans ===")
|
|
@ -0,0 +1,78 @@
|
|||
# coding=utf-8
|
||||
import os
|
||||
import sys
|
||||
import ConfigParser
|
||||
from imp import reload
|
||||
|
||||
reload(sys)
|
||||
sys.setdefaultencoding('utf8')
|
||||
|
||||
|
||||
class BaseConfig(object):
|
||||
def __init__(self, file):
|
||||
config_path = os.path.split(os.path.realpath(__file__))[0] + '/' + file
|
||||
self.__config = ConfigParser.ConfigParser()
|
||||
self.__config.read(config_path)
|
||||
|
||||
def _get_config(self, section, key):
|
||||
"""从配置文件读取参数 字符串类型"""
|
||||
try:
|
||||
return self.__config.get(section, key)
|
||||
except ConfigParser.Error:
|
||||
return ""
|
||||
|
||||
def _get_config_int(self, section, key):
|
||||
"""从配置文件读取参数 int类型"""
|
||||
try:
|
||||
return self.__config.getint(section, key)
|
||||
except ConfigParser.Error:
|
||||
return 0
|
||||
|
||||
def _get_config_float(self, section, key):
|
||||
"""从配置文件读取参数 float类型"""
|
||||
try:
|
||||
return self.__config.getfloat(section, key)
|
||||
except ConfigParser.Error:
|
||||
return 0.0
|
||||
|
||||
|
||||
class SysConfig(BaseConfig):
|
||||
def __init__(self):
|
||||
super(SysConfig, self).__init__('SdeSyncSetting.config')
|
||||
# 公共成员变量
|
||||
self.is_debug = True
|
||||
self.changed_layers_only = 0
|
||||
self.last_sync_datetime = None
|
||||
self.curr_sync_datetime = None
|
||||
self.pathname = None
|
||||
self.logfile_name = None
|
||||
|
||||
def eps_path(self):
|
||||
return self._get_config('System', 'eps_path')
|
||||
|
||||
def python_path(self):
|
||||
return self._get_config('System', 'python_path')
|
||||
|
||||
def template_name(self):
|
||||
return self._get_config('System', 'template_name')
|
||||
|
||||
def sde_scheme(self):
|
||||
return self._get_config('System', 'sde_scheme')
|
||||
|
||||
def eps_show_window(self):
|
||||
return self._get_config('System', 'eps_show')
|
||||
|
||||
def eps_vbs(self):
|
||||
return self._get_config('System', 'eps_vbs')
|
||||
|
||||
def sync_type(self):
|
||||
return self._get_config('System', 'sync_type')
|
||||
|
||||
def updateregion(self):
|
||||
return self._get_config('UpdateRegion', 'layer_name') # "UpdateRegion_A"
|
||||
|
||||
def updatetime_field(self):
|
||||
return self._get_config('UpdateRegion', 'updatetime_field') # u'UpdateTime'
|
||||
|
||||
def updatetime_field_history(self):
|
||||
return self._get_config('UpdateRegion', 'updatetime_field_history') # u'DeleteTime'
|
|
@ -0,0 +1,18 @@
|
|||
# coding=utf-8
|
||||
import unittest
|
||||
from functions import *
|
||||
|
||||
|
||||
class TestFunctions(unittest.TestCase):
|
||||
def test_run_command(self):
|
||||
python_path = str(u'C:/Python27/ArcGIS10.2/python.exe ').encode('gb2312')
|
||||
script = str(u'sde_fc2fc.py ').encode('gb2312')
|
||||
type_cmd = str(u'feature ').encode('gb2312')
|
||||
fc_name_cmd = str(u'Building_A ').encode('gb2312')
|
||||
out_cmd = str(u'Building_A ').encode('gb2312')
|
||||
fc_cur_cmd = str(u'Building_A ').encode('gb2312')
|
||||
# exp_cmd = str(u'"" ')
|
||||
command_string = python_path + script + type_cmd + fc_name_cmd + out_cmd + fc_cur_cmd
|
||||
rst, out = run_command(command_string)
|
||||
print(out)
|
||||
self.assertEqual(rst, True)
|
|
@ -0,0 +1,96 @@
|
|||
# coding=utf-8
|
||||
import unittest
|
||||
import inspect
|
||||
import arcpy
|
||||
from functions import *
|
||||
from sys_config import SysConfig
|
||||
from logger import Logger
|
||||
from sde_sync import SdeSynchronous
|
||||
|
||||
|
||||
class TestSdeSynchronous(unittest.TestCase):
|
||||
def setUp(self):
|
||||
# 获取当前路径
|
||||
caller_file = inspect.getfile(inspect.currentframe())
|
||||
work_pathname = os.path.abspath(os.path.dirname(caller_file))
|
||||
# 同步开始时间
|
||||
curr_sync_date = time.strftime("%Y-%m-%d", time.localtime())
|
||||
curr_sync_time = time.strftime("%H-%M-%S", time.localtime())
|
||||
# 设置当前工作路径
|
||||
config = SysConfig()
|
||||
config.pathname = work_pathname
|
||||
config.curr_sync_datetime = curr_sync_date + " " + curr_sync_time
|
||||
# 日志记录
|
||||
create_dir(work_pathname + "\\log")
|
||||
config.logfile_name = work_pathname + "\\log\\" + config.curr_sync_datetime + "-SdeSynchronous.txt"
|
||||
logger = Logger(config.logfile_name)
|
||||
logger.log("==SdeSynchronous Started==")
|
||||
logger.log("Process begin at " + str(curr_sync_date) + " " + str(curr_sync_time) + ".")
|
||||
self.sde_db_sync = SdeSynchronous(config, logger)
|
||||
self.sde_db_sync.src_sde = self.sde_db_sync.get_connection(str(u"源库SDE连接").encode('gb2312'))
|
||||
arcpy.env.workspace = self.sde_db_sync.src_sde
|
||||
self.sde_db_sync.config.last_sync_datetime = self.sde_db_sync.get_last_sync_datetime()
|
||||
self.edit = self.sde_db_sync.start_edit()
|
||||
|
||||
def tearDown(self):
|
||||
self.sde_db_sync.stop_edit(self.edit, False)
|
||||
self.sde_db_sync.logger.close()
|
||||
# 删除log日志文件
|
||||
os.remove(self.sde_db_sync.config.logfile_name)
|
||||
|
||||
def test_get_last_max_object_id(self):
|
||||
self.assertEqual(self.sde_db_sync.get_last_max_object_id("Building_A"), 11)
|
||||
|
||||
def test_get_last_sync_datetime(self):
|
||||
print(self.sde_db_sync.get_last_sync_datetime())
|
||||
|
||||
def test_get_projects_info(self):
|
||||
self.sde_db_sync.config.last_sync_datetime = "2022-10-01 00:00:00"
|
||||
print(self.sde_db_sync.get_projects_info())
|
||||
|
||||
def test_create_gdb_files(self):
|
||||
self.sde_db_sync.create_gdb_files()
|
||||
self.assertTrue(os.path.exists(self.sde_db_sync.out_gdb_path))
|
||||
self.assertTrue(os.path.exists(self.sde_db_sync.out_gdb_path + "\\" + self.sde_db_sync.out_gdb_files["Add"]))
|
||||
self.assertTrue(os.path.exists(self.sde_db_sync.out_gdb_path + "\\" + self.sde_db_sync.out_gdb_files["Edit"]))
|
||||
self.assertTrue(os.path.exists(self.sde_db_sync.out_gdb_path + "\\" + self.sde_db_sync.out_gdb_files["Delete"]))
|
||||
arcpy.Delete_management(self.sde_db_sync.out_gdb_path + "\\" + self.sde_db_sync.out_gdb_files["Add"])
|
||||
arcpy.Delete_management(self.sde_db_sync.out_gdb_path + "\\" + self.sde_db_sync.out_gdb_files["Edit"])
|
||||
arcpy.Delete_management(self.sde_db_sync.out_gdb_path + "\\" + self.sde_db_sync.out_gdb_files["Delete"])
|
||||
|
||||
def test_get_max_object_id(self):
|
||||
self.assertEqual(self.sde_db_sync.get_max_object_id("Building_A"), 1)
|
||||
|
||||
def test_set_last_max_object_id(self):
|
||||
self.sde_db_sync.set_last_max_object_id("Building_A", 11)
|
||||
|
||||
def test_get_sys_time_condition(self):
|
||||
ld = self.sde_db_sync.config.last_sync_datetime
|
||||
cd = self.sde_db_sync.config.curr_sync_datetime
|
||||
str_cond1 = "UpdateTime>=TO_DATE('" + ld + "','YYYY-MM-DD HH24:MI:SS') and UpdateTime<TO_DATE('" + cd + "','YYYY-MM-DD HH24:MI:SS')"
|
||||
str_cond2 = "DeleteTime>=TO_DATE('" + ld + "','YYYY-MM-DD HH24:MI:SS') and DeleteTime<TO_DATE('" + cd + "','YYYY-MM-DD HH24:MI:SS')"
|
||||
self.assertEqual(self.sde_db_sync.get_sys_time_condition(False), str_cond1)
|
||||
self.assertEqual(self.sde_db_sync.get_sys_time_condition(True), str_cond2)
|
||||
|
||||
def test_get_feature_expression(self):
|
||||
ld = self.sde_db_sync.config.last_sync_datetime
|
||||
cd = self.sde_db_sync.config.curr_sync_datetime
|
||||
ss = self.sde_db_sync.get_sys_time_condition(False)
|
||||
cond = "{} and FeatureGuid {} (SELECT FeatureGuid FROM historyBuilding_A WHERE DeleteTime>=TO_DATE('{}','YYYY-MM-DD HH24:MI:SS') and DeleteTime<TO_DATE('{}','YYYY-MM-DD HH24:MI:SS') and (UpdateTime<TO_DATE('{}','YYYY-MM-DD HH24:MI:SS') or UpdateTime IS NULL))"
|
||||
add_cond = cond.format(ss, "NOT IN", ld, cd, ld)
|
||||
edit_cond = cond.format(ss, "IN", ld, cd, ld)
|
||||
ss = self.sde_db_sync.get_sys_time_condition(True)
|
||||
cond = "{} and (historyBuilding_A.UpdateTime<TO_DATE('{last_time}','YYYY-MM-DD HH24:MI:SS') or historyBuilding_A.UpdateTime IS NULL) and (FeatureGuid NOT IN (SELECT FeatureGuid FROM Building_A))"
|
||||
del_cond = cond.format(ss, last_time=ld)
|
||||
c1, c2, c3 = self.sde_db_sync.get_export_expression("Building_A")
|
||||
self.assertEqual(c1, add_cond)
|
||||
self.assertEqual(c2, edit_cond)
|
||||
self.assertEqual(c3, del_cond)
|
||||
|
||||
def test_featureclass_to_featureclass(self):
|
||||
self.sde_db_sync.create_gdb_files()
|
||||
self.sde_db_sync.featureclass_to_featureclass("Building_A", self.sde_db_sync.out_gdb_path + "\\" + self.sde_db_sync.out_gdb_files["Add"], "Building_A", "ObjectID>0")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
|
@ -0,0 +1,52 @@
|
|||
# coding=utf-8
|
||||
import unittest
|
||||
from sys_config import SysConfig
|
||||
|
||||
|
||||
class TestSysConfig(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.config = SysConfig()
|
||||
|
||||
def test_eps_path(self):
|
||||
self.assertEqual(self.config.eps_path(), u'C:/EPS20221017/eps.exe')
|
||||
|
||||
def test_python_path(self):
|
||||
self.assertEqual(self.config.python_path(), u'C:/Python27/ArcGIS10.2/python.exe')
|
||||
|
||||
def test_template_name(self):
|
||||
self.assertEqual(self.config.template_name(), u'"上海新型测绘500.mdt"')
|
||||
|
||||
def test_sde_scheme(self):
|
||||
self.assertEqual(self.config.sde_scheme(), "SHDLG500")
|
||||
|
||||
def test_eps_show_window(self):
|
||||
self.assertEqual(self.config.eps_show_window(), u'show')
|
||||
|
||||
def test_sync_mode(self):
|
||||
self.assertEqual(self.config.sync_mode(), 1)
|
||||
|
||||
def test_sync_type(self):
|
||||
self.assertEqual(self.config.sync_type(), u'ALL')
|
||||
|
||||
def test_updateregion(self):
|
||||
self.assertEqual(self.config.updateregion(), u'UpdateRegion_A') # "UpdateRegion_A"
|
||||
|
||||
def test_updatetime_field(self):
|
||||
self.assertEqual(self.config.updatetime_field(), u'UpdateTime') # u'UpdateTime'
|
||||
|
||||
def test_updatetime_field_history(self):
|
||||
self.assertEqual(self.config.updatetime_field_history(), u'DeleteTime') # u'DeleteTime'
|
||||
|
||||
def test_attr(self):
|
||||
self.config.is_debug = True
|
||||
self.config.changed_layers_only = 1
|
||||
self.config.last_sync_datetime = "1990-05-11 12:00:00"
|
||||
self.config.curr_sync_datetime = "2023-05-11 12:00:00"
|
||||
self.assertEqual(self.config.is_debug, True)
|
||||
self.assertEqual(self.config.changed_layers_only, 1)
|
||||
self.assertEqual(self.config.last_sync_datetime, "1990-05-11 12:00:00")
|
||||
self.assertEqual(self.config.curr_sync_datetime, "2023-05-11 12:00:00")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
|
@ -0,0 +1,350 @@
|
|||
# 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))
|
||||
# 每个图层的FeatureCode字段加索引
|
||||
arcpy.AddIndex_management(fc_name, "FEATURECODE", "FeatureCode_Index", "NON_UNIQUE", "NON_ASCENDING")
|
||||
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)
|
Binary file not shown.
Loading…
Reference in New Issue