arcpy 生成界址點成果表Excel主要實現方法介紹


受邀研究了一下arcpy生成界址點成果表,如有需要定制工具或源碼可以聯系作者。


2021年4月補充

實現原理邏輯及代碼在這個視頻教程里:https://www.51gis.com.cn/kecheng.html?id=641

2020年11月補充

實現了一個新的模板,詳見ArcGIS生成界址點成果表Excel的主要實現方法(arcpy) - 知乎 (zhihu.com)


以下是原文

工具與結果如下:

 

 

 

 

主要實現方式

1.通過getPointListOfPolygon方法獲取一個面的節點信息集合

def getDistance(pointStartX,pointStartY,pointEndX,pointEndY): p1=numpy.array([pointStartX,pointStartY])   
  p2=numpy.array([pointEndX,pointEndY]) p3=p2-p1 p4=math.hypot(p3[0],p3[1]) return round(p4,2) def getPointListOfPolygon(row): lst=[] startNum=1 for part in row[0]: countNum=startNum for point in part: if point: if countNum==startNum: lst.append(['J%s'%countNum,round(point.X,3),round(point.Y,3),None] ) countNum+=1 else: lastIndexOflst=len(lst)-1 beforeX=lst[lastIndexOflst][1] beforeY=lst[lastIndexOflst][2] thisX=round(point.X,3) thisY=round(point.Y,3) lst.append(['J%s'%countNum,thisX,thisY,getDistance(beforeX,beforeY,thisX,thisY)] ) countNum+=1 else: lastIndexOflst=len(lst)-1 lst[lastIndexOflst][0]='J%s'%startNum countNum-=1 startNum=countNum lastIndexOflst=len(lst)-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.exists(filename):
            self.xlApp=win32com.client.DispatchEx('Excel.Application')
            self.filename=filename
            self.xlWb=self.xlApp.Workbooks.open(filename)
    def setCurrentSheet(self,index):
        self.xlWs=self.xlWb.Worksheets(index)
    def createNewSheetFromSheet1(self,nameofcopy):
        lastSheet=self.xlWb.Worksheets(self.xlWb.Worksheets.Count)
        templateSheet=self.xlWb.Worksheets(1)
        templateSheet.Copy(None,lastSheet)
        newSheet=self.xlWb.Worksheets(self.xlWb.Worksheets.Count)
        newSheet.Name=nameofcopy
    def deleteSheetsExceptSheet1(self):
        self.xlApp.DisplayAlerts = False
        sheetsCount=self.xlWb.Worksheets.Count
        if sheetsCount>1:
            for i in range(sheetsCount,1,-1):
                self.xlWb.Worksheets(i).Delete()
    def clearContentsOfSheet(self,index):
        self.xlWb.Worksheets(index).Range("A5:G53").ClearContents()
    def setCell(self,row,col,val):
        self.xlWs.Cells(row,col).Value=val
    def mergeCell(self,startRow,startCol,endRow,endCol):
        self.xlWs.Range(self.xlWs.Cells(startRow,startCol),self.xlWs.Cells(endRow,endCol)).Merge()
    def saveAs(self,savePath):
        self.xlWb.SaveAs(savePath.decode('utf-8'))
    def close(self):
        self.xlWb.Close()
        self.xlApp.Quit()

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM