分享

用Python创建你第一个GIS程序[3]:前后端搭建

 GIS荟 2021-09-19
前言:为了区分说明,我们这里也用前端后端这个概念来阐述。本章节使用简单的案例,分别展示前后端的代码,包括一个简单前端 GUI 界面的搭建流程和代码。


后端

为了区分说明,我们这里也用前端后端这个概念来阐述。
后端在这里就是我们的核心运行代码,是我们程序功能的实现。
而在这里我们要实现一个怎样的功能呢?
由于是制作一个简单的程序,所以我们也选了一个较为简单的功能,所以选了下面这个文章
《Python和ArcGIS自动化制图完全指南》第一节中展示的功能:把线矢量转换成面,然后给面添加4个新字段。
 
因为之前的文章讲过,所以这里就多说。普普通通的源代码如下:


# -*- coding:utf-8 -*-

# ---------------------------------------------------------------------------

# Author: LiaoChenchen

# Created on: 2021/1/17 14:53

# arcpy自动化制图完全指南(一):使用arcpy完成工作流

import arcpy

import os

class InitPath(object):

   """初始化工作空间,创建gdb数据库(如果没有的话)"""

   def __new__(cls, *args, **kwargs):

       if not hasattr(cls, "_instance"):

           # if not cls._instance:

           cls._instance = object.__new__(cls)

       return cls._instance

   def __init__(self):

       """_________________________create folder____________________________"""

       scratch_path = "D:\doc\Scratch"

       try:

           if not os.path.isdir(scratch_path):

               os.makedirs(scratch_path)

       except:

           scratch_path = "E:\doc\Scratch"

           if not os.path.isdir(scratch_path):

               os.makedirs(scratch_path)

       """_________________________create folder____________________________"""

       # make gdb

       scratch_gdb = os.path.join(scratch_path, "Scratch.gdb")

       if not arcpy.Exists(scratch_gdb):

           arcpy.CreateFileGDB_management(scratch_path, "Scratch")

       arcpy.env.workspace = scratch_path

       arcpy.env.overwriteOutput = True

       

       self.scratch_path = scratch_path

       self.scratch_gdb = scratch_gdb

   

   def __iter__(self):

       return (i for i in (self.scratch_path, self.scratch_gdb))

folder_path, gdb_path = InitPath()

arcpy.env.workspace = gdb_path

arcpy.env.overwriteOutput = True

"""********************************流程代码**********************************"""

line = "data/line_data.shp"

# 线要素转面,生成的面矢量名称为 polygon

arcpy.FeatureToPolygon_management (line, "polygon")

# 给 polygon 图层添加字段

for name in ["CJQYMC", "CJQYDM", "XJQYMC", "XJQYDM"]:

   arcpy.AddField_management("polygon", name, "TEXT", field_length = 100)

 
可是只是目前这种状况的话,还是这能在黑乎乎的命令行窗口运行。完全没有达到我们之前的预期,所以接下来,就需要编写 GUI 程序了(图形用户界面程序)。
 

前端

《用Python创建你第一个GIS程序》第二章讲解过不同的 GUI 库的选择。所以这里的 GUI 界面我们使用 Python 自带的 Tkinter库 来编写。
Note: 在 Python2 中叫 Tkinter,而在 Python3 中叫 tkinter。
 

1.创建基本界面

GUI 图形界面本质上就是一个无限循环程序,只有系统崩溃和人为干预才会退出。先完成一个基本的 GUI,代码如下:

# -*- coding:utf-8 -*-

import Tkinter as tk

class MyGUI(object):

   def __init__(self):

       self.root = tk.Tk()

       self.root.mainloop() # 执行循环

if __name__ == '__main__':

   MyGUI()

self.root 是这个 GUI 程序的根基,或者说母体,后续的按钮、输入框都是创建在 self.root 的基础上。他的创建方式是固定化的,不需要理解。
 
生成的图形界面如下,是一个空白的界面。但这是重要的一步

 

2.添加输入框和按钮

按钮和输入框无处不在,是人类和现代计算机程序发生交互的重要单位之一。
下面讲解如何创建你的第一个按钮和输入框。
先创建出第一个按钮

# -*- coding:utf-8 -*-

import Tkinter as tk

class MyGUI(object):

   def __init__(self):

       self.root = tk.Tk()

       self.root.geometry("450x600+800+200") # 设置程序窗口大小和打开位置

       self.root.title("GIS") # 设置程序名称

       self.create_widget()

       self.root.mainloop() # 执行循环

   def create_widget(self):

       self.but = tk.Button(self.root, text=u"输入线要素", relief="groove") # <<<注释1>>>

       self.but.pack() # <<<注释2>>>

   

if __name__ == '__main__':

   MyGUI()

方式 create_widget 用于生成各种小部件,并将它们“安装”到 self.root 上。
 
<<<注释1>>>:生成代码按钮,Button类,正如名字所示,该类是用于生成按钮。
<<<注释2>>>:摆放按钮。
运行效果如下:

 
增加了一些细节

# -*- coding:utf-8 -*-

import Tkinter as tk

class MyGUI(object):

   def __init__(self):

       self.root = tk.Tk()

       self.root.geometry("450x600+800+200") # 设置程序窗口大小和打开位置

       self.root.title("GIS") # 设置程序名称

       self.create_widget()

       self.create_run_button()

       self.root.mainloop() # 执行循环

   def create_widget(self):

       self.frame1 = tk.Frame(self.root, relief="raised", bd=3) #<<<注释1>>>

       self.frame1.pack(fill="x")

       self.entry = tk.Entry(self.frame1) #<<<注释2>>>

       self.entry.pack(side="left",expand=True, fill="x", pady=8, padx=10)

       self.but = tk.Button(

           self.frame1, text=u"输入线要素", relief="groove", width=10)

       self.but.pack(side="right", pady=8)

       

   def create_run_button(self): #<<<注释3>>>

       # 生成下方的“运行”按钮

       self.bottom_frame = tk.Frame(self.root,relief="raised",bd=3)

       self.bottom_frame.pack(side="bottom",fill="x",anchor="s")

       self.ok_button=tk.Button(

           self.bottom_frame,text=u"运行",relief="groove", width=10)

       self.ok_button.pack(side="right", pady=8)

       

       

if __name__ == '__main__':

   MyGUI()

<<<注释1>>>:使用 tk.Frame 类创建了一个”框“,将按钮和输入库装了进去,方便排列。
<<<注释2>>>:使用 tk.Entry类创建输入框,就下方图片中的白色长条。
<<<注释3>>>:在界面的最低端创建了一个“运行”组件:使用"框"将按钮包住放最小面。该按钮最后调用后端的核心功能来运行程序。
 
运行结果如下:

 
那么我们的简单前端就搭建完毕了,非常简单把。
 

结束语

该指南的一个中心思想不是做的大而全、尽善尽美,而是带领带领大家了解一个简单 GIS 程序的构建过程,了解基本的概念、了解如何把 GUI 和 核心的功能代码连接起来、了解运行程序后前端卡死怎么解决。
这才是这一指南的目的。
那么下一章就是讲解如何把前端的 GUI 界面和后端功能代码连接起来。
 

分享GIS,不止于Python。
荟GIS精粹,关注我,带你飞!
我叫 GIS荟
(长按扫码也行)

欢迎交流点击留言

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多