# -- coding:cp936 –
# -*- #################
#############
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import re
import arcpy
import string
def createDBS(outputfile,name,dbstype,version):
arcpy.env.workspace=outputfile
if version == '#' or not version:
version="CURRENT"
if dbstype.lower()=="mdb":
outputDBS=arcpy.CreatePersonalGDB_management(outputfile,name,version)
arcpy.AddMessage(u"\n成功创建了MDB数据库:"+str(outputDBS))
else:
outputDBS=arcpy.CreateFileGDB_management(outputfile,name,version)
arcpy.AddMessage(u"\n成功创建了GDB数据库:"+str(outputDBS))
return outputDBS
def dissolveFIELDS(fc):
arcpy.env.workspace=os.path.join(inputDBS)
fields=arcpy.ListFields(fc)#列举出该图层fc的所有字段
fields_names=[field.name for field in fields]#由所有字段名称组成的列表
stablefields=["OBJECTID","Shape","Shape_Length","Shape_Area"]#给定固定的与融合无关的字段列表
dissolveFields=[field for field in fields_names if field not in stablefields]#剔除与融合无关的字段并形成新的列表
return dissolveFields#返回融合要素的字段列表
def getdsnamelist(inputDBS):
dsnamelist=[]
arcpy.env.workspace=inputDBS
templist=[]
datasets=arcpy.ListDatasets()
#datasets=['']+datasets if datasets is not None else []
for dataset in datasets:
arcpy.env.workspace=os.path.join(inputDBS,dataset)
templist.append(dataset)
for temp in templist:#过滤重复值
if temp not in dsnamelist:
dsnamelist.append(temp)
return dsnamelist
def getCoordinate_System(inputDBS):
Coordinate_System_list=[]
Coordinate_System_name_list=[]
arcpy.env.workspace=inputDBS
for ds in arcpy.ListDatasets():
for fc in arcpy.ListFeatureClasses():
desc = arcpy.Describe(fc)
CRS = desc.spatialReference
CRS_name=desc.spatialReference.name
if CRS_name not in Coordinate_System_name_list:
Coordinate_System_list.append(CRS)
Coordinate_System_name_list.append(CRS_name)
if len(Coordinate_System_list)==0:
Coordinate_System_Name=u"坐标系:原数据没有坐标系"
arcpy.AddMessage(Coordinate_System_Name)
elif len(Coordinate_System_list)<>1 and len(Coordinate_System_list)<>0:
Coordinate_System_Name=u"坐标系:原数据有多个坐标系"
arcpy.AddMessage(Coordinate_System_Name)
else:
Coordinate_System_Name=(u"坐标系:"+Coordinate_System_name_list[0])
arcpy.AddMessage(Coordinate_System_Name)
return Coordinate_System_list[0]
def createDatasets(outputDBS,dsname,inputDBS,outputfile):
arcpy.env.workspace=os.path.join(outputfile,name)
Coordinate_System=getCoordinate_System(inputDBS)
dataset_out=arcpy.CreateFeatureDataset_management(outputDBS,dsname,Coordinate_System)
#arcpy.AddMessage("Create "+dsname+" succeed!")
def newDB_ds():
arcpy.env.workspace=outputfile
outputDBS=createDBS(outputfile,name,dbstype,version)
dsnamelist=getdsnamelist(inputDBS)
arcpy.env.workspace=os.path.join(outputfile,name)
for dsname in dsnamelist:
createDatasets(outputDBS,dsname,inputDBS,outputfile)
def getDs_Fc_NameList(inputDBS):
arcpy.env.workspace=inputDBS
namelist=arcpy.ListFeatureClasses()
datasets=arcpy.ListDatasets()
datasets=['']+datasets if datasets is not None else []
for dataset in datasets:
datasetpath=os.path.join(inputDBS,dataset)
arcpy.env.workspace=datasetpath
feature_classes=arcpy.ListFeatureClasses()
#feature_classes=['']+feature_classes if feature_classes is not None else []
for feature_class in feature_classes:
feature_classpath=os.path.join(inputDBS,dataset,feature_class)
name=os.path.join(dataset,feature_class)
if name not in namelist:#过滤重复值ds_fc
namelist.append(name)
#arcpy.AddMessage("\nNAMELIST:\n"+str(namelist)+"\n\nALL FECTURES:")
return namelist
def dissolveFC(fc,inputDBS,boundaryLayer,outputDBS):
arcpy.env.workspace=os.path.join(inputDBS)
inputfc_path=os.path.join(inputDBS,fc)#输入原始图层的路径
outputfc_path=os.path.join(str(os.path.join(outputDBS)),fc)#输入成果图层的路径
matchcount = int(arcpy.GetCount_management(fc).getOutput(0))#统计原始要素的个数
arcpy.AddMessage(u" 图层原始要素总个数:"+str(matchcount))#显示原始个数消息
tempLayer=str(fc)+"_temp"#设置临时图层的名称
arcpy.MakeFeatureLayer_management(inputfc_path, tempLayer) #建立临时选择集
arcpy.SelectLayerByLocation_management(tempLayer, 'BOUNDARY_TOUCHES', boundaryLayer,"","NEW_SELECTION")#选择与边界相接的要素并存储在tempLayer,不输出
matchcount = int(arcpy.GetCount_management(tempLayer).getOutput(0)) #统计临时图层tempLayer内的要素个数
arcpy.AddMessage(u" 参与融合的边界个数:"+str(matchcount))#显示临时图层tempLayer内的要素个数消息
if matchcount == 0:#循环条件,判断个数是否为0,若为0执行此项
arcpy.Copy_management(inputfc_path, outputfc_path, "")#由于边界个数为0,故所有要素均不在边界上(包括图层内没有要素的情况),将原始数据拷贝到成果图层
arcpy.AddMessage(u" 无边界要素,已拷贝原图层\n")
else: #循环条件,判断个数是否为0,若不为0执行此项
dissolveFields=dissolveFIELDS(fc)#给定影像是否融合的字段列表,每一字段相同时才会融合
arcpy.Dissolve_management(tempLayer, outputfc_path,dissolveFields,"", "SINGLE_PART", "DISSOLVE_LINES")#融合边界要素并输出到成果图层
arcpy.SelectLayerByLocation_management(tempLayer, 'BOUNDARY_TOUCHES', boundaryLayer,"","NEW_SELECTION")#重新选择与边界相接的要素并存储在tempLayer
arcpy.SelectLayerByAttribute_management(tempLayer,"SWITCH_SELECTION","")#切换选择,即除了边界要素的其他要素
arcpy.Append_management(tempLayer, outputfc_path, "TEST","","")#将其他要素追加到成果图层
matchcount = int(arcpy.GetCount_management(outputfc_path).getOutput(0)) #统计成果图层内的要素个数
arcpy.AddMessage(u" 成果图层的要素个数:"+str(matchcount))
arcpy.AddMessage(u" 融合字段: \n"+u" "+str(dissolveFields)+u"\n")#显示融合字段列表的消息
def autoLink():
arcpy.env.workspace=outputfile
outputDBS=createDBS(outputfile,name,dbstype,version)
dsnamelist=getdsnamelist(inputDBS)
arcpy.env.workspace=os.path.join(outputfile,name)
for dsname in dsnamelist:
createDatasets(outputDBS,dsname,inputDBS,outputfile)
arcpy.AddMessage(u"成功创建了所有数据集:"+"\n"+" "+str(dsnamelist))
feature_classes =getDs_Fc_NameList(inputDBS)#列举出工作空间内的所有要素图层
arcpy.AddMessage(u"\n开始遍历图层:")
for fc in feature_classes:
arcpy.AddMessage(u" "+fc)
dissolveFC(fc,inputDBS,boundaryLayer,outputDBS)
inputDBS=""
boundaryLayer=""
outputfile=""
name =""
dbstype=""
version=""
#main process
try:
inputDBS = arcpy.GetParameterAsText(0)
boundaryLayer = arcpy.GetParameterAsText(1)
outputfile = arcpy.GetParameterAsText(2)
name = arcpy.GetParameterAsText(3)
dbstype = arcpy.GetParameterAsText(4)
version = arcpy.GetParameterAsText(5)
autoLink()
except arcpy.ExecuteError:
arcpy.GetMessages()
2024arcpy数据库要素自动接边
最新推荐文章于 2025-08-08 12:00:00 发布
1万+

被折叠的 条评论
为什么被折叠?



