日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

用Python創(chuàng)建你第一個(gè)GIS程序[3]:前后端搭建

 GIS薈 2021-09-19
前言:為了區(qū)分說明,我們這里也用前端后端這個(gè)概念來闡述。本章節(jié)使用簡單的案例,分別展示前后端的代碼,包括一個(gè)簡單前端 GUI 界面的搭建流程和代碼。


后端

為了區(qū)分說明,我們這里也用前端后端這個(gè)概念來闡述。
后端在這里就是我們的核心運(yùn)行代碼,是我們程序功能的實(shí)現(xiàn)。
而在這里我們要實(shí)現(xiàn)一個(gè)怎樣的功能呢?
由于是制作一個(gè)簡單的程序,所以我們也選了一個(gè)較為簡單的功能,所以選了下面這個(gè)文章
《Python和ArcGIS自動(dòng)化制圖完全指南》第一節(jié)中展示的功能:把線矢量轉(zhuǎn)換成面,然后給面添加4個(gè)新字段。
 
因?yàn)橹暗奈恼轮v過,所以這里就多說。普普通通的源代碼如下:


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

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

# Author: LiaoChenchen

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

# arcpy自動(dòng)化制圖完全指南(一):使用arcpy完成工作流

import arcpy

import os

class InitPath(object):

   """初始化工作空間,創(chuàng)建gdb數(shù)據(jù)庫(如果沒有的話)"""

   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"

# 線要素轉(zhuǎn)面,生成的面矢量名稱為 polygon

arcpy.FeatureToPolygon_management (line, "polygon")

# 給 polygon 圖層添加字段

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

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

 
可是只是目前這種狀況的話,還是這能在黑乎乎的命令行窗口運(yùn)行。完全沒有達(dá)到我們之前的預(yù)期,所以接下來,就需要編寫 GUI 程序了(圖形用戶界面程序)。
 

前端

《用Python創(chuàng)建你第一個(gè)GIS程序》第二章講解過不同的 GUI 庫的選擇。所以這里的 GUI 界面我們使用 Python 自帶的 Tkinter庫 來編寫。
Note: 在 Python2 中叫 Tkinter,而在 Python3 中叫 tkinter。
 

1.創(chuàng)建基本界面

GUI 圖形界面本質(zhì)上就是一個(gè)無限循環(huán)程序,只有系統(tǒng)崩潰和人為干預(yù)才會(huì)退出。先完成一個(gè)基本的 GUI,代碼如下:

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

import Tkinter as tk

class MyGUI(object):

   def __init__(self):

       self.root = tk.Tk()

       self.root.mainloop() # 執(zhí)行循環(huán)

if __name__ == '__main__':

   MyGUI()

self.root 是這個(gè) GUI 程序的根基,或者說母體,后續(xù)的按鈕、輸入框都是創(chuàng)建在 self.root 的基礎(chǔ)上。他的創(chuàng)建方式是固定化的,不需要理解。
 
生成的圖形界面如下,是一個(gè)空白的界面。但這是重要的一步

 

2.添加輸入框和按鈕

按鈕和輸入框無處不在,是人類和現(xiàn)代計(jì)算機(jī)程序發(fā)生交互的重要單位之一。
下面講解如何創(chuàng)建你的第一個(gè)按鈕和輸入框。
先創(chuàng)建出第一個(gè)按鈕

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

import Tkinter as tk

class MyGUI(object):

   def __init__(self):

       self.root = tk.Tk()

       self.root.geometry("450x600+800+200") # 設(shè)置程序窗口大小和打開位置

       self.root.title("GIS") # 設(shè)置程序名稱

       self.create_widget()

       self.root.mainloop() # 執(zhí)行循環(huán)

   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>>>:擺放按鈕。
運(yùn)行效果如下:

 
增加了一些細(xì)節(jié)

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

import Tkinter as tk

class MyGUI(object):

   def __init__(self):

       self.root = tk.Tk()

       self.root.geometry("450x600+800+200") # 設(shè)置程序窗口大小和打開位置

       self.root.title("GIS") # 設(shè)置程序名稱

       self.create_widget()

       self.create_run_button()

       self.root.mainloop() # 執(zhí)行循環(huán)

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

       # 生成下方的“運(yùn)行”按鈕

       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"運(yùn)行",relief="groove", width=10)

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

       

       

if __name__ == '__main__':

   MyGUI()

<<<注釋1>>>:使用 tk.Frame 類創(chuàng)建了一個(gè)”框“,將按鈕和輸入庫裝了進(jìn)去,方便排列。
<<<注釋2>>>:使用 tk.Entry類創(chuàng)建輸入框,就下方圖片中的白色長條。
<<<注釋3>>>:在界面的最低端創(chuàng)建了一個(gè)“運(yùn)行”組件:使用"框"將按鈕包住放最小面。該按鈕最后調(diào)用后端的核心功能來運(yùn)行程序。
 
運(yùn)行結(jié)果如下:

 
那么我們的簡單前端就搭建完畢了,非常簡單把。
 

結(jié)束語

該指南的一個(gè)中心思想不是做的大而全、盡善盡美,而是帶領(lǐng)帶領(lǐng)大家了解一個(gè)簡單 GIS 程序的構(gòu)建過程,了解基本的概念、了解如何把 GUI 和 核心的功能代碼連接起來、了解運(yùn)行程序后前端卡死怎么解決。
這才是這一指南的目的。
那么下一章就是講解如何把前端的 GUI 界面和后端功能代碼連接起來。
 

分享GIS,不止于Python。
薈GIS精粹,關(guān)注我,帶你飛!
我叫 GIS薈
(長按掃碼也行)

歡迎交流點(diǎn)擊留言

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多