|
本帖最后由 ☆北风タ冽 于 2024-4-27 16:35 编辑
#自己编写的源码 -*- coding: cp936 -*-
#---------------------------------------------------------------------------
# Purpose : Arcpy脚本实现三调地类统计
# Author :付贵友
# Date :2020.08.05
# Version :
# ArcGIS 10.2.2
# Email :604825527@qq.com
# Notes :
#
#---------------------------------------------------------------------------
import arcpy,os,time,sys,openpyxl
import numpy as np
from openpyxl import Workbook
from openpyxl.styles import PatternFill,Border,Side,Alignment,Protection,Font,colors
from openpyxl.utils import get_column_letter, column_index_from_string
# reload(sys)
# sys.setdefaultencoding('utf8')
feaCls=arcpy.GetParameterAsText(0)
feaClsSDTB=arcpy.GetParameterAsText(1)
fieldDKBH=arcpy.GetParameterAsText(2)
xlsFile=arcpy.GetParameterAsText(3)
sumType=arcpy.GetParameterAsText(4)
class tabSD:
rowDLMC=["ZMJ","NYD","NYD00","0303","0304","0306","0402","NYD01","0101","0102","0103",
"NYD02","0201","0202","0203","0204","NYD03","0301","0302","0305","0307","NYD04","0401","0403",
"1006","NYD11","1103","1104","1107","NYD12","1202","1203","JSYD","JSYD05","05H1","0508","JSYD06",
"0601","0602","0603","JSYD07","0701","0702","JSYD08","08H1","08H2","0809","0810","09","JSYD10",
"1001","1002","1003","1004","1005","1007","1008","1009","1109","1201","WLYD","WLYD00","1105","1106",
"1108","0404","WLYD11","1101","1102","1110","WLYD12","1204","1205","1206","1207"]
def __init__(self):
self.tDic = {}
self.sumRow=[0.00 for i in range(0, 75)]
def add(self,head,DLBM,Area):
cId=self.rowDLMC.index(DLBM[0:4])
if not head in self.tDic.keys():
self.tDic[head]=[0.00 for i in range(0, 75)]
self.tDic[head][cId]+=Area
self.sum(self.tDic[head])
def convert(self,cof,scale):
unit=float("0.{0:0>{1}}1".format(0,scale-1))
listID=[x for x in range(3,7)]
listID.extend([x for x in range(8,11)])
listID.extend([x for x in range(12, 16)])
listID.extend([x for x in range(17, 21)])
listID.extend([x for x in range(22, 25)])
listID.extend([x for x in range(26, 29)])
listID.extend([x for x in range(30, 32)])
listID.extend([x for x in range(34, 36)])
listID.extend([x for x in range(37, 40)])
listID.extend([x for x in range(41, 43)])
listID.extend([x for x in range(44, 49)])
listID.extend([x for x in range(50, 60)])
listID.extend([x for x in range(62, 65)])
listID.extend([x for x in range(67, 70)])
listID.extend([x for x in range(71, 75)])
sumMJ = self.getSumRow(self.tDic)[0]
covSumMJ = round(sumMJ * cof, scale)
cDic = {}
for x, value in self.tDic.items():
covList = [round(v / sumMJ * covSumMJ, scale) for v in value]
self.sum(covList)
cDic[x] = covList
while abs(self.getSumRow(cDic)[0] - covSumMJ) >=abs(unit)/2:
for x, value in self.tDic.items():
diffList = [cDic[x][x0] - self.tDic[x][x0] * cof for x0 in listID]
if self.getSumRow(cDic)[0] - covSumMJ > 0:
mId = diffList.index(max(diffList))
if cDic[x][listID[mId]]>0:cDic[x][listID[mId]] -= abs(unit)
self.sum(cDic[x])
elif self.getSumRow(cDic)[0] - covSumMJ < 0:
mId = diffList.index(min(diffList))
if cDic[x][listID[mId]]>0:cDic[x][listID[mId]] += abs(unit)
self.sum(cDic[x])
self.tDic = cDic
def getSumRow(self,dic):
return np.sum([x for x in dic.values()],axis=0)
def sum(self,tb):
tb[2] = np.sum(tb[3:7], axis=0)
tb[7] = np.sum(tb[8:11], axis=0)
tb[11] = np.sum(tb[12:16], axis=0)
tb[16] = np.sum(tb[17:21], axis=0)
tb[21] = np.sum(tb[22:24], axis=0)
tb[25] = np.sum(tb[26:29], axis=0)
tb[29] = np.sum(tb[30:32], axis=0)
tb[33] = np.sum(tb[34:36], axis=0)
tb[36] = np.sum(tb[37:40], axis=0)
tb[40] = np.sum(tb[41:43], axis=0)
tb[43] = np.sum(tb[44:48], axis=0)
tb[49] = np.sum(tb[50:58], axis=0)
tb[61] = np.sum(tb[62:65], axis=0)
tb[66] = np.sum(tb[67:70], axis=0)
tb[70] = np.sum(tb[71:75], axis=0)
tb[1] = tb[2] + tb[7] + tb[11] + tb[16] + \
tb[21] + tb[24] + tb[25] + tb[29]
tb[32] = tb[33] + tb[36] + tb[40] + tb[43] + \
tb[48] + tb[49] + tb[58] + tb[59]
tb[60] = tb[61] + tb[65] + tb[66] + tb[70]
tb[0] = tb[1] + tb[32] + tb[60]
def getAreaTableSD(feaClsSDTB,feaClsDK,fieldDKBH):
desc = arcpy.Describe(feaClsDK)
inFeatures = [feaClsSDTB,feaClsDK]
if hasattr(desc, "path"):
envPath = desc.path
arcpy.AddMessage("desc.path:" + desc.path)
arcpy.env.workspace = os.path.split(desc.path)[0]
arcpy.env.overwriteOutput = True
else:
arcpy.AddMessage("Get workspace error...")
sys.exit(0)
if hasattr(desc, "name"):
inName=desc.name
if "shp" in desc.name:
arcpy.AddMessage("The workspace is shape!")
inName=os.path.basename(desc.name).rstrip(os.path.splitext(desc.name)[1])
intersectOutput = u"{0}\{1}_Temp.shp".format(envPath, inName)
else:
arcpy.AddMessage("The workspace is GDB!")
intersectOutput = u"{0}\{1}_Temp".format(envPath, inName)
else:
sys.exit(0)
clusterTolerance = 0.0001
arcpy.Intersect_analysis(inFeatures, intersectOutput, "", clusterTolerance, "INPUT")
##添加信息存储字段
m_field_names = [f.name for f in arcpy.ListFields(intersectOutput)]
if "cTBMJ" in m_field_names:
arcpy.DeleteField_management(intersectOutput, ["cTBMJ"])
arcpy.AddField_management(intersectOutput, "cTBMJ", "double", "", "", "", "")
if "cKCMJ" in m_field_names:
arcpy.DeleteField_management(intersectOutput, ["cKCMJ"])
arcpy.AddField_management(intersectOutput, "cKCMJ", "double", "", "", "", "")
if "cTBDLMJ" in m_field_names:
arcpy.DeleteField_management(intersectOutput, ["cTBDLMJ"])
arcpy.AddField_management(intersectOutput, "cTBDLMJ", "double", "", "", "", "")
arcpy.CalculateField_management(intersectOutput, "cTBMJ", "!shape.area!", "PYTHON")
arcpy.CalculateField_management(intersectOutput, "cKCMJ", "round([cTBMJ] * [KCXS] ,2)", "VB")
arcpy.CalculateField_management(intersectOutput, "cTBDLMJ", "[cTBMJ]-[cKCMJ]", "VB")
dicMJ={}
inFields = [fieldDKBH, "DLBM", "QSXZ", "ZLDWMC", "cKCMJ", "cTBDLMJ"]
if sumType.split(',')[1]=="QSDWMC":inFields = [fieldDKBH, "DLBM","QSXZ","QSDWMC","cKCMJ","cTBDLMJ"]
result = arcpy.GetCount_management(intersectOutput)
count = int(result.getOutput(0))
if count==0:
arcpy.AddError("Intersect result is NULL...")
sys.exit(0)
feaCursor = arcpy.da.SearchCursor(intersectOutput, inFields)
for row in feaCursor:
if row[0]in[None,""] or sumType.split(',')[0]==u"/":dkbh=u"/"
else:dkbh=row[0]
qsxz = u"国有"
if row[2] in ["30", "40"]: qsxz = u"集体"
if sumType.split(',')[2]== u"/":qsxz = u"/"
dwmc=row[3]
if sumType.split(',')[1]==u"/":dwmc=u"/"
if sumType.split(',')[0] == u"/":
key=dwmc
info="/,{0}".format(qsxz)
else:
key =dkbh
info="{0},{1}".format(dwmc,qsxz)
if not key in dicMJ.keys():dicMJ[key] =tabSD()
dicMJ[key].add(info, row[1], row[5])
dicMJ[key].add(info, "1203", row[4])
del feaCursor
return dicMJ
###创建表格样式
font=Font(name=u"宋体",size=10,bold=False,italic=False,color="FF000000")
alignA=Alignment(horizontal='center', vertical='center', wrap_text=True)
alignB=Alignment(horizontal='center', vertical='center')
align_left=Alignment(horizontal="left",vertical="center")
#定义边框样式
def my_border(t_border, b_border, l_border, r_border):
border = Border(top=Side(border_style=t_border, color=colors.BLACK),
bottom=Side(border_style=b_border, color=colors.BLACK),
left=Side(border_style=l_border, color=colors.BLACK),
right=Side(border_style=r_border, color=colors.BLACK))
return border
#初始化指定区域边框的线eg:("A","D",1,8)
def format_border(s_column,e_column,s_index, e_index,sheet):
for row in tuple(sheet[s_column + str(s_index):e_column + str(e_index)]):
for cell in row:
cell.border = my_border('thin', 'thin', 'thin', 'thin')
#指定区域设置字体和对齐、是否自动换行
def set_cell_font(rowMin,rowMax,colMin,colMax,font,align,sheet):
i=rowMin
j=colMin
for i in range(rowMin,rowMax+1):
for j in range(colMin,colMax+1):
cell = sheet.cell(row=i, column=j)
cell.font=font
cell.alignment=align
#指定区域外框设置粗框线(1,5,1,5,sheet)
def set_border_bold(rowMin,rowMax,colMin,colMax,ws):
# 设置左粗框线
for i in range(rowMin,rowMax+1):
cell=ws.cell(row=i,column=colMin)
cell.border = my_border(cell.border.top.style, cell.border.bottom.style,'medium', cell.border.right.style)
# 设置右粗框线
for i in range(rowMin,rowMax+1):#设置右粗框线
cell=ws.cell(row=i,column=colMax)
cell.border = my_border(cell.border.top.style, cell.border.bottom.style,cell.border.left.style, 'medium')
# 设置上粗框线
for i in range(colMin,colMax+1):
cell=ws.cell(row=rowMin,column=i)
cell.border = my_border('medium', cell.border.bottom.style,cell.border.left.style, cell.border.right.style)
# 设置下粗框线
for i in range(colMin,colMax+1):
cell=ws.cell(row=rowMax,column=i)
cell.border = my_border(cell.border.top.style, 'medium',cell.border.left.style, cell.border.right.style)
def fillSheet(dicMJ,title,sheet):
arcpy.AddMessage("Start Fill data...")
fillSub = PatternFill(patternType="solid", fgColor="FFEFD5")
fill = PatternFill(patternType="solid", fgColor="FFDEAD")
sheet.column_dimensions['B'].width =20
sheet.column_dimensions['C'].width =20
sheet.merge_cells(start_row=3, end_row=5, start_column=2, end_column=2)
sheet.cell(row=3, column=2, value=U"地块编号")
sheet.merge_cells(start_row=3, end_row=5, start_column=3, end_column=3)
sheet.cell(row=3, column=3, value=U"单位名称")
sheet.merge_cells(start_row=3, end_row=5, start_column=4, end_column=4)
sheet.cell(row=3, column=4, value=U"权属类别")
sheet.merge_cells(start_row=3, end_row=5, start_column=5, end_column=5)
sheet.cell(row=3, column=5, value=U"面积总计\n(公顷)")
sheet.merge_cells(start_row=3, end_row=3, start_column=6, end_column=36)
sheet.cell(row=3, column=6, value=U"农用地")
sheet.merge_cells(start_row=4, end_row=5, start_column=6, end_column=6)
sheet.cell(row=4, column=6, value=U"农用地小计")
sheet.merge_cells(start_row=4, end_row=4, start_column=7, end_column=11)
sheet.cell(row=4, column=7, value=U"湿地(00)")
sheet.cell(row=5, column=7, value=U"小计")
sheet.cell(row=5, column=8, value=U"红树林地\n(0303)")
sheet.cell(row=5, column=9, value=U"森林沼泽\n(0304)")
sheet.cell(row=5, column=10, value=U"灌丛沼泽\n(0306)")
sheet.cell(row=5, column=11, value=U"沼泽草地\n(0402)")
sheet.merge_cells(start_row=4, end_row=4, start_column=12, end_column=15)
sheet.cell(row=4, column=12, value=U"耕地(01)")
sheet.cell(row=5, column=12, value=U"小计")
sheet.cell(row=5, column=13, value=U"水田\n(0101)")
sheet.cell(row=5, column=14, value=U"水浇地\n(0102)")
sheet.cell(row=5, column=15, value=U"旱地\n(0103)")
sheet.merge_cells(start_row=4, end_row=4, start_column=16, end_column=20)
sheet.cell(row=4, column=16, value=U"园地(02)")
sheet.cell(row=5, column=16, value=U"小计")
sheet.cell(row=5, column=17, value=U"果园\n(0201)")
sheet.cell(row=5, column=18, value=U"茶园\n(0202)")
sheet.cell(row=5, column=19, value=U"橡胶园\n(0203)")
sheet.cell(row=5, column=20, value=U"其他园地\n(0203)")
sheet.merge_cells(start_row=4, end_row=4, start_column=21, end_column=25)
sheet.cell(row=4, column=21, value=U"林地(03)")
sheet.cell(row=5, column=21, value=U"小计")
sheet.cell(row=5, column=22, value=U"乔木林地\n(0301)")
sheet.cell(row=5, column=23, value=U"竹林地\n(0302)")
sheet.cell(row=5, column=24, value=U"灌木林地\n(0305)")
sheet.cell(row=5, column=25, value=U"其他林地\n(0307)")
sheet.merge_cells(start_row=4, end_row=4, start_column=26, end_column=28)
sheet.cell(row=4, column=26, value=U"草地(04)")
sheet.cell(row=5, column=26, value=U"小计")
sheet.cell(row=5, column=27, value=U"天然牧草地\n(0401)")
sheet.cell(row=5, column=28, value=U"人工牧草地\n(0403)")
sheet.cell(row=4, column=29, value=U"交通运输用地(10)")
sheet.cell(row=5, column=29, value=U"农村道路\n(1006)")
sheet.merge_cells(start_row=4, end_row=4, start_column=30, end_column=33)
sheet.cell(row=4, column=30, value=U"水域及水利设施用地(11)")
sheet.cell(row=5, column=30, value=U"小计")
sheet.cell(row=5, column=31, value=U"水库水面\n(1103)")
sheet.cell(row=5, column=32, value=U"坑塘水面\n(1104)")
sheet.cell(row=5, column=33, value=U"沟渠\n(1107)")
sheet.merge_cells(start_row=4, end_row=4, start_column=34, end_column=36)
sheet.cell(row=4, column=34, value=U"其他土地(12)")
sheet.cell(row=5, column=34, value=U"小计")
sheet.cell(row=5, column=35, value=U"设施农用地\n(1202)")
sheet.cell(row=5, column=36, value=U"田坎\n(1203)")
sheet.merge_cells(start_row=3, end_row=3, start_column=37, end_column=64)
sheet.cell(row=3, column=37, value=U"建设用地")
sheet.merge_cells(start_row=4, end_row=5, start_column=37, end_column=37)
sheet.cell(row=4, column=37, value=U"建设用地\n小计")
sheet.merge_cells(start_row=4, end_row=4, start_column=38, end_column=40)
sheet.cell(row=4, column=38, value=U"商业服务业用地(05)")
sheet.cell(row=5, column=38, value=U"小计\n(05)")
sheet.cell(row=5, column=39, value=U"商业服务业设施用地\n(05H1)")
sheet.cell(row=5, column=40, value=U"物流仓储用地\n(0508)")
sheet.merge_cells(start_row=4, end_row=4, start_column=41, end_column=44)
sheet.cell(row=4, column=41, value=U"工矿用地(06)")
sheet.cell(row=5, column=41, value=U"小计\n(06)")
sheet.cell(row=5, column=42, value=U"工业用地\n(0601)")
sheet.cell(row=5, column=43, value=U"采矿用地\n(0602)")
sheet.cell(row=5, column=44, value=U"盐田\n(0603)")
sheet.merge_cells(start_row=4, end_row=4, start_column=45, end_column=47)
sheet.cell(row=4, column=45, value=U"住宅用地(07)")
sheet.cell(row=5, column=45, value=U"小计\n(07)")
sheet.cell(row=5, column=46, value=U"城镇住宅用地\n(0701)")
sheet.cell(row=5, column=47, value=U"农村宅基地\n(0702)")
sheet.merge_cells(start_row=4, end_row=4, start_column=48, end_column=52)
sheet.cell(row=4, column=48, value=U"公共管理与公共服务用地(08)")
sheet.cell(row=5, column=48, value=U"小计\n(08)")
sheet.cell(row=5, column=49, value=U"机关团体新闻出版用地\n(08H1)")
sheet.cell(row=5, column=50, value=U"科教文卫用地\n(08H2)")
sheet.cell(row=5, column=51, value=U"公共设施用地\n(0809)")
sheet.cell(row=5, column=52, value=U"公园绿地\n(0810)")
sheet.merge_cells(start_row=4, end_row=5, start_column=53, end_column=53)
sheet.cell(row=4, column=53, value=U"特殊用地\n(09)")
sheet.merge_cells(start_row=4, end_row=4, start_column=54, end_column=62)
sheet.cell(row=4, column=54, value=U"交通运输用地(10)")
sheet.cell(row=5, column=54, value=U"小计\n(10)")
sheet.cell(row=5, column=55, value=U"铁路用地\n(1001)")
sheet.cell(row=5, column=56, value=U"轨道交通用地\n(1002)")
sheet.cell(row=5, column=57, value=U"公路用地\n(1003)")
sheet.cell(row=5, column=58, value=U"城镇村道路用地\n(1004)")
sheet.cell(row=5, column=59, value=U"交通服务场站用地\n(1005)")
sheet.cell(row=5, column=60, value=U"机场用地\n(1007)")
sheet.cell(row=5, column=61, value=U"港口码头用地\n(1008)")
sheet.cell(row=5, column=62, value=U"管道运输\n(1009)")
sheet.merge_cells(start_row=4, end_row=5, start_column=63, end_column=63)
sheet.cell(row=4, column=63, value=U"水工建筑用地\n(1109)")
sheet.merge_cells(start_row=4, end_row=5, start_column=64, end_column=64)
sheet.cell(row=4, column=64, value=U"空闲地\n(1201)")
sheet.merge_cells(start_row=3, end_row=3, start_column=65, end_column=79)
sheet.cell(row=3, column=65, value=U"未利用地")
sheet.merge_cells(start_row=4, end_row=5, start_column=65, end_column=65)
sheet.cell(row=4, column=65, value=U"未利用地\n小计")
sheet.merge_cells(start_row=4, end_row=4, start_column=66, end_column=69)
sheet.cell(row=4, column=66, value=U"湿地(00)")
sheet.cell(row=5, column=66, value=U"小计")
sheet.cell(row=5, column=67, value=U"沿海滩涂\n(1105)")
sheet.cell(row=5, column=68, value=U"内陆滩涂\n(1106)")
sheet.cell(row=5, column=69, value=U"沼泽地\n(1108)")
sheet.cell(row=4, column=70, value=U"草地\n(04)")
sheet.cell(row=5, column=70, value=U"其他草地\n(0404)")
sheet.merge_cells(start_row=4, end_row=4, start_column=71, end_column=74)
sheet.cell(row=4, column=71, value=U"水域及水利设施用地(11)")
sheet.cell(row=5, column=71, value=U"小计")
sheet.cell(row=5, column=72, value=U"河流水面\n(1101)")
sheet.cell(row=5, column=73, value=U"湖泊水面\n(1102)")
sheet.cell(row=5, column=74, value=U"冰川及永久积雪\n(1110)")
sheet.merge_cells(start_row=4, end_row=4, start_column=75, end_column=79)
sheet.cell(row=4, column=75, value=U"其他土地(12)")
sheet.cell(row=5, column=75, value=U"小计")
sheet.cell(row=5, column=76, value=U"盐碱地\n(1204)")
sheet.cell(row=5, column=77, value=U"沙地\n(1205)")
sheet.cell(row=5, column=78, value=U"裸土地\n(1206)")
sheet.cell(row=5, column=79, value=U"裸岩石砾地\n(1207)")
roId = 6
listGY = []
listJT = []
listHJ = []
for key in sorted(dicMJ.keys()):
value = dicMJ[key]
value.convert(0.0001, 4)
for key0 in sorted(value.tDic.keys()):
value0 = value.tDic[key0]
sheet.cell(row=roId, column=2, value=key)
sheet.cell(row=roId, column=3, value=key0.split(',')[0])
sheet.cell(row=roId, column=4, value=key0.split(',')[1])
listHJ.append(value0)
if u"国有" in key0: listGY.append(value0)
if u"集体" in key0: listJT.append(value0)
coId = 5
for x in value0:
sheet.cell(row=roId, column=coId, value=x)
coId += 1
roId += 1
if len(value.tDic.keys()) >= 2:
coId = 5
sumRow = value.getSumRow(value.tDic) ##小计行
sheet.cell(row=roId, column=2, value=key).fill = fillSub
sheet.cell(row=roId, column=3, value="小计").fill = fillSub
sheet.cell(row=roId, column=4, value="/").fill = fillSub
for x in sumRow:
sheet.cell(row=roId, column=coId, value=x).fill = fillSub
coId += 1
roId += 1
sumHJ = [0.00 for i in range(0, 75)]
sumHJ = np.sum(np.array(listHJ), axis=0)
sheet.cell(row=roId, column=2, value=u"面积总计").fill = fill
sheet.cell(row=roId, column=3, value="/").fill = fill
sheet.cell(row=roId, column=4, value="/").fill = fill
coId = 5
for x in sumHJ:
sheet.cell(row=roId, column=coId, value=None).fill = fill
if x >= 0.00005: sheet.cell(row=roId, column=coId, value=x).fill = fill
coId += 1
roId += 1
if len(listJT) >= 1:
sumJT = np.sum(np.array(listJT), axis=0)
sheet.cell(row=roId, column=2, value=u"其中集体土地")
sheet.cell(row=roId, column=3, value="/")
sheet.cell(row=roId, column=4, value=u"集体")
coId = 5
for x in sumJT:
sheet.cell(row=roId, column=coId, value=x)
coId += 1
roId += 1
if len(listGY) >= 1:
sumGY = np.sum(np.array(listGY), axis=0)
sheet.cell(row=roId, column=2, value=u"其中国有土地")
sheet.cell(row=roId, column=3, value="/")
sheet.cell(row=roId, column=4, value=u"国有")
coId = 5
for x in sumGY:
sheet.cell(row=roId, column=coId, value=x)
coId += 1
roId += 1
set_cell_font(3, roId, 2, 79, font, alignA, sheet)
format_border("B", "CA", 3, roId, sheet) # 设置边框
set_border_bold(3, roId, 2, 79, sheet) # 设置外框
areaTableSD=getAreaTableSD(feaClsSDTB,feaCls,fieldDKBH)
wb=Workbook()
ws=wb.create_sheet(title=u"AreaTableSD",index=0)
fillSheet(areaTableSD,areaTableSD,ws)
wb.save(xlsFile)
del wb |
评分
-
查看全部评分
|