受邀研究了一下arcpy生成界址点成果表,如有需要定制工具或源码可以联系作者。
2020年11月补充
实现了一个新的模板,详见ArcGIS生成界址点成果表Excel的主要实现方法(arcpy) – 知乎 zhihu.com)
以下是原文
工具与结果如下:
主要实现方式
1.通过getPointListOfPolygon方法获取一个面的节点信息集合
def getDistancepointStartX,pointStartY,pointEndX,pointEndY):
p1=numpy.array[pointStartX,pointStartY])
p2=numpy.array[pointEndX,pointEndY])
p3=p2-p1
p4=math.hypotp3[0],p3[1])
return roundp4,2)
def getPointListOfPolygonrow):
lst=[]
startNum=1
for part in row[0]:
countNum=startNum
for point in part:
if point:
if countNum==startNum:
lst.append[‘J%s‘%countNum,roundpoint.X,3),roundpoint.Y,3),None] )
countNum+=1
else:
lastIndexOflst=lenlst)-1
beforeX=lst[lastIndexOflst][1]
beforeY=lst[lastIndexOflst][2]
thisX=roundpoint.X,3)
thisY=roundpoint.Y,3)
lst.append[‘J%s‘%countNum,thisX,thisY,getDistancebeforeX,beforeY,thisX,thisY)] )
countNum+=1
else:
lastIndexOflst=lenlst)-1
lst[lastIndexOflst][0]=‘J%s‘%startNum
countNum-=1
startNum=countNum
lastIndexOflst=lenlst)-1
lst[lastIndexOflst][0]=‘J%s‘%startNum
return lst
2.通过COM读取Excel模板表,进行写入另存操作,Excel操作类如下。
通过COM操作Excel需要安装pywin32,coder要对Excel的对象模型比较熟悉,建议研究一下Excel-VBA或者Excel-C#以熟悉。
class ExcelWriter:
def __init__self,filename=None):
if os.path.existsfilename):
self.xlApp=win32com.client.DispatchEx‘Excel.Application’)
self.filename=filename
self.xlWb=self.xlApp.Workbooks.openfilename)
def setCurrentSheetself,index):
self.xlWs=self.xlWb.Worksheetsindex)
def createNewSheetFromSheet1self,nameofcopy):
lastSheet=self.xlWb.Worksheetsself.xlWb.Worksheets.Count)
templateSheet=self.xlWb.Worksheets1)
templateSheet.CopyNone,lastSheet)
newSheet=self.xlWb.Worksheetsself.xlWb.Worksheets.Count)
newSheet.Name=nameofcopy
def deleteSheetsExceptSheet1self):
self.xlApp.DisplayAlerts = False
sheetsCount=self.xlWb.Worksheets.Count
if sheetsCount>1:
for i in rangesheetsCount,1,-1):
self.xlWb.Worksheetsi).Delete)
def clearContentsOfSheetself,index):
self.xlWb.Worksheetsindex).Range“A5:G53”).ClearContents)
def setCellself,row,col,val):
self.xlWs.Cellsrow,col).Value=val
def mergeCellself,startRow,startCol,endRow,endCol):
self.xlWs.Rangeself.xlWs.CellsstartRow,startCol),self.xlWs.CellsendRow,endCol)).Merge)
def saveAsself,savePath):
self.xlWb.SaveAssavePath.decode‘utf-8’))
def closeself):
self.xlWb.Close)
self.xlApp.Quit)