2024arcpy数据库要素自动接边

# -- 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()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值