用Python做GIS之五:從示例入手—example函數

進入STARS後,最簡單的學習方法就是演示示例數據。對於源碼的分析也能夠從這裏入手。app

      

如下爲出發菜單項「Example Project」的函數example:
def example(self):
        """canned loading of data files and matrices for debugging"""
        self.project = SProject("current",self.master,self)
        topDir = options.getSTARSHOME()
        self.project.directory = os.path.join(topDir,"data")
        projectFile = os.path.join(self.project.directory,"csiss.prj")
        t=self.project.ReadProjectFile(projectFile)
        if hasattr(self.project,"coords"):
            self.project.scaleCoords()
        else:
            self.report("no coords in project")
        #self.master.configure(cursor=options.DEFAULTCURSOR)
        #self.Editor.configure(cursor='crosshair')
        self.projectSummary()
        self.enableMenus()
ssh

加粗標註的幾行代碼可做進一步詳細瞭解:ide

(1)SProject:
代碼以下所示
class SProject(Project):
    """Subclass to compose STARS project inside a GUI
   """
    def __init__(self,name,master,app):
        """Constructor
函數

        name (string): name of project
        master (Tk): application top level window
        app (App): App instance
        """
        Project.__init__(self,name)
        self.master = master
        self.app = app
        self.fnt=("Times",10)
        self.screenHeight = self.app.winfo_screenheight()
        self.screenWidth = self.app.winfo_screenwidth()
        if self.screenWidth > 1280:
            self.screenWidth = 1280 # prevent spread across 2-extended displays
        s = str(self.screenWidth) + " " + str(self.screenHeight)
        self.screenDim = s
學習

其中調用了父類Project,打開star.py文件,找到Project類,對其進行分析:
class Project:
    """Stars project.
    
    Example Usage:
        >>> from stars import Project
        >>> s=Project("s")
        >>> s.ReadData("csiss")
        >>> income=s.getVariable("pcincome")
        >>> region=s.getVariable("bea")
        >>> w=spRegionMatrix(region)
        >>> mi=Moran(income,w)
        >>> print(mi.mi[70])
        0.38918107312
    """
    def __init__(self,name):
        self.name = name
        self.dataBase = Database()
        self.getVariable = self.dataBase.getVariable
        self.getMatrix = self.dataBase.getMatrix
        self.addMatrix = self.dataBase.addMatrix
        self.getMatrixNames = self.dataBase.getMatrixNames
        self.getVariableNames = self.dataBase.getVariableNames
        self.getTSVariableNames = self.dataBase.getTSVariableNames
        self.getCSVariableNames = self.dataBase.getCSVariableNames
        self.getCSTSVariableNames = self.dataBase.getCSTSVariableNames
ui

(2)ReadProjectFile:
代碼以下所示
def ReadProjectFile(self,fileName):
        #assumes extension is passed into fileName
debug

        #check for file existence
        if os.path.exists(fileName):
            self.initialize()
            config = ConfigParser.ConfigParser()
            config.read(fileName)
            projectDir = os.path.dirname(fileName)
            #print config.sections()
            for section in config.sections():
                options = config.options(section)
                for option in options:
                    value = config.get(section,option)
            #        print section,option,value
                    sec=self.options[section]
                    opt=sec[option]
                    opt.append(value)
                    sec[option]=opt
                    self.options[section]=sec
           # self.summarizeOptions()
blog


            # read data files
            dataFiles = self.options["data"]["files"]
            for dataFile in dataFiles:
           #     print dataFile
                dfile = os.path.join(projectDir,dataFile)
           #     print dfile
                self.ReadData(dfile)
            #print "data files"
索引

            # read any gal matricies
            try:
                galFiles = self.options["weight"]["gal"][0].split()
                print galFiles
                for galFile in galFiles:
           #         print galFile
                    gfile = os.path.join(projectDir,galFile)
                    self.ReadGalMatrix(gfile)
            #print "gal"
            except:
                print "No Weights Matrices"
ip

            # read any gis boundary files
            self.listGISNames = []
            gisFiles = self.options["gis"]["gis"]
            for gisFile in gisFiles:
                fileName = gisFile+".gis"
                self.listGISNames.append(fileName)
                fileName = os.path.join(projectDir,fileName)
                self.ReadGisFile(fileName)

                fileName = os.path.join(projectDir,gisFile+".cnt")
                if os.path.exists(fileName): 
                    self.readCentroids(fileName)
                else:
                    self.__calcCentroids()
            self.gisResolution = self.options["graphics"]["screen"]
        else:
            print "Error: Cannot read project file: %s"%fileName

該段代碼能夠幫助解析STARS工程文件project的大體結構,打開系統自帶示例的工程文件csiss.prj:
[data]
files: csiss
[weight]
gal: states48

[gis]
gis: us48

[graphics]
screen: 1280 1201

能夠發現該文件分爲四段,前三段分別對應有數據文件、權重文件、GIS文件的鏈接,最後一段爲顯示參數。
·數據文件存儲統計數據信息,又分爲兩個文件:csiss.dht存儲數據索引信息,csiss.dat存儲數據主體信息,其中註釋CS爲空間序列數據,TS爲時間序列數據,CSTS即爲時空序列數據。
·權重文件存儲空間權重信息,後綴名爲gal。此文件第一行爲空間實體數目,從第二行開始每兩行構成固定格式,形如:[第一行]實體序號 權重關聯實體個數[第二行]權重關聯實體序號列表,如此循環至最後一個實體。參見states48.gal文件。
·GIS文件(後綴名爲gis)存儲空間實體的地圖數據,結構形如:[數據頭]空間實體編號 該實體內多邊形編號 該多邊形節點數[數據體]X座標(換行)Y座標。參見us48.gis文件。

(3)projectSummary:
代碼以下所示
def projectSummary(self):
        self.report(self.project.catalogue())

在guimaker.py中找到report函數:
def report(self,message):        """enters messages into main application window. use for        entering results, commands called by gui, etc."""        self.Editor.insert(END,message)        t=len(message)        self.Editor.yview_scroll(t,UNITS)        self.Editor.insert(END,"\n>")

相關文章
相關標籤/搜索