zoukankan      html  css  js  c++  java
  • 用Python作GIS之五:从示例入手—example函数

    进入STARS后,最简单的学习方法就是演示示例数据。对于源码的分析也可以从这里入手。

          

    以下为出发菜单项“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()

    加粗标注的几行代码可作进一步详细了解:

    (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

    (2)ReadProjectFile:
    代码如下所示
    def ReadProjectFile(self,fileName):
            #assumes extension is passed into fileName

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


                # 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"

                # 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," >")

  • 相关阅读:
    B树和B+树的插入、删除图文详解
    使用limit分页查询时,做delete操作,会导致丢失数据
    【转载】研发应该懂的binlog知识(下)
    【转载】研发应该懂的binlog知识(上)
    OOM排除与JVM调优
    Intellij IDEA集成JProfiler性能分析神器
    Java程序内存分析:使用mat工具分析内存占用
    mysql 查询结果为空时值时执行后面的sql语句
    mysql 无数据插入,有数据更新
    C# 超大数据量导入 SqlBulkCopy
  • 原文地址:https://www.cnblogs.com/columbus2/p/4298084.html
Copyright © 2011-2022 走看看