《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 腳本引擎在三維GIS系統(tǒng)中的設計與實現(xiàn)
腳本引擎在三維GIS系統(tǒng)中的設計與實現(xiàn)
2017年微型機與應用第10期
李勇
中國人民解放軍92941部隊96分隊,遼寧 葫蘆島 125001
摘要: GIS(地理信息系統(tǒng))是個復雜的系統(tǒng),,在主要功能一致的前提下,如何為用戶提供專用的系統(tǒng)是迫切需要解決的問題。腳本技術以其靈活的可定制性和可擴展性的優(yōu)勢解決了此問題,。研究了基于腳本引擎的開發(fā)技術,分析了基于腳本引擎的GIS結構,,設計并實現(xiàn)了腳本引擎,。
Abstract:
Key words :

  李勇

  (中國人民解放軍92941部隊96分隊,,遼寧 葫蘆島 125001)

  摘要:GIS(地理信息系統(tǒng))是個復雜的系統(tǒng),,在主要功能一致的前提下,如何為用戶提供專用的系統(tǒng)是迫切需要解決的問題。腳本技術以其靈活的可定制性和可擴展性的優(yōu)勢解決了此問題,。研究了基于腳本引擎的開發(fā)技術,,分析了基于腳本引擎的GIS結構,設計并實現(xiàn)了腳本引擎,。

  關鍵詞3d GIS,;腳本引擎;Lub,;狀態(tài)轉換,;虛擬機API

  中圖分類號:TP319文獻標識碼:ADOI: 10.19358/j.issn.1674-7720.2017.10.007

  引用格式:李勇.腳本引擎在三維GIS系統(tǒng)中的設計與實現(xiàn)[J].微型機與應用,2017,36(10):23-25,,29.

0引言

  隨著計算機技術的不斷發(fā)展,,計算機編程語言和技術都發(fā)生了很大變化。在傳統(tǒng)的工程應用系統(tǒng)的設計中,,軟件往往在實現(xiàn)之前用戶需求就發(fā)生變更,。因此,人們迫切需要開發(fā)出可定制化,、可用戶化和可擴展的軟件系統(tǒng)來減少需求變更所帶來的開發(fā)和維護成本[1],。

  使用基于混合腳本編程的方法是實現(xiàn)擴展靈活的可定制軟件系統(tǒng)的有效方法。近年來,,腳本語言憑借其強大的描述能力和靈活的語法結構,,為應用程序提供腳本支持,從而進行混合語言開發(fā)被,,成為實現(xiàn)可擴展和可定制的有效方案[2],。目前,腳本語言已經(jīng)廣泛應用于計算機軟件領域,,如JavaScrip應用于Web網(wǎng)頁設計,、微軟的VBA用于Office應用的自動化以及開源領域中Ruby,、Python,、Jython等腳本語言[3],。

  本文主要關注在三維GIS系統(tǒng)中,如何實現(xiàn)可定制,、可擴展功能的腳本引擎,,來滿足用戶的多元化需求。

1腳本引擎關鍵技術分析

  1.1腳本語言簡介

  腳本語言是為了縮短傳統(tǒng)的編寫-編譯-鏈接-運行過程而創(chuàng)建的計算機編程語言,,用來控制應用程序,,具有良好的快速開發(fā)能力和與其他語言編寫的程序組件之間通信的功能[4]。很多腳本語言用來執(zhí)行一次性任務,,尤其是系統(tǒng)管理方面,,它可以把服務組件粘合起來,廣泛用于GUI創(chuàng)建或者命令行,。腳本通常以文本保存,,只在被調用時進行解釋或編譯,經(jīng)常把腳本和其他低級編程語言一起使用,各自發(fā)揮優(yōu)勢解決特定問題[5],。

  1.2腳本引擎技術分析

  在腳本運行過程中,,腳本引擎先將腳本解釋為中間指令,再執(zhí)行中間指令,,所以腳本引擎既是腳本解釋器又是腳本執(zhí)行器[6],。此外,嵌入腳本引擎,、支持腳本語言的應用程序稱為主程序[7],。腳本引擎、腳本程序與主程序之間的關系如圖1所示,。腳本程序是用戶事先編寫完的字符串,,可以保存到文本文件或特定格式文件中,能被腳本引擎識別,;當需要執(zhí)行某個腳本程序時,,主程序通過調用腳本引擎API來啟動腳本引擎和通知腳本引擎執(zhí)行此腳本程序;腳本引擎加載,、解釋,、

 

Image 001.jpg

  運行腳本程序,并將結果反饋給主程序,??梢姡_本引擎是主程序和腳本程序的紐帶,。

2腳本引擎在三維GIS系統(tǒng)中的結構分析

  三維GIS是模擬,、表示、管理,、分析客觀世界中的三維空間實體及其相關信息的計算機系統(tǒng),,能為管理和決策提供更加直接和真實的目標和研究對象,。為提高系統(tǒng)的穩(wěn)定性和可移植性,在設計系統(tǒng)結構時采用先進的NTIER架構,。系統(tǒng)軟件部分采用面向對象的設計方法以及基于組件設計的理念和技術,,從縱向的架構層面上,該系統(tǒng)提供三大層面,、若干小層面的抽象,、映射、實現(xiàn)和封裝,;應用層對各子系統(tǒng)的用戶業(yè)務處理邏輯進行實現(xiàn)和封裝,,數(shù)據(jù)庫層是采用多種形式結構數(shù)據(jù)庫的總體封裝,提供本地及遠程多種數(shù)據(jù)連接方式,,為應用層提供透明的數(shù)據(jù)存儲和訪問功能,。GIS系統(tǒng)層次結構如圖2所示。

 

Image 002.jpg

  如圖2所示,,該系統(tǒng)基于空間GIS數(shù)據(jù)庫和各類專用數(shù)據(jù)庫,,運用VR技術,通過使用三維引擎及腳本引擎,,實現(xiàn)三維地景瀏覽,、空間定位查看、空間量測等豐富功能,。腳本引擎模塊處于中間層,,向下管理著各種專用數(shù)據(jù)庫數(shù)據(jù);同層中,,可調用三維引擎模塊,,從而控制三維場景和模型的顯示方式;向上提供本模塊的調用接口,,供應用層調用,,完成資源的控制。

3腳本引擎總體結構設計

  腳本引擎模塊結構為上下兩層,。上層能識別腳本語言,,并將腳本程序編譯成字節(jié)碼指令;下層執(zhí)行字節(jié)碼指令,。上下層的分離可以提高腳本引擎的可移植性和可擴展性,。如圖3所示,上層編譯器負責將腳本源程序的字節(jié)流轉換成指令序列,,對源程序進行詞法,、語法等進行邏輯分析,當出現(xiàn)錯誤時給出錯誤圖3腳本引擎體系結構信息和定位錯位位置;虛擬機負責指令流的解釋執(zhí)行,;API是虛擬機與主程序交互的橋梁,,實現(xiàn)兩者之間互相控制、通信,。

4腳本引擎設計與實現(xiàn)

  本腳本引擎面向的腳本語言為自主設計的語言Lub,。Lub語法符合LL(1)型文法,,可以采用自頂向下遞歸法進行語法解析,。

  4.1詞法分析器設計與實現(xiàn)

  Lub腳本語言的詞法標記有四類:標識符、關鍵字,、常量,、特殊符號。標識符用來標識腳本程序中的變量,、數(shù)組和函數(shù),,由字母、數(shù)字和下劃線組成,,且標識符首字母不能是數(shù)字,;關鍵字是能夠被詞法分析器識別的具有特定含義的字符串,如定義變量的關鍵字,、運算符號,、判斷符號、控制符號等,;常量指數(shù)字和字符串,;特殊符號包含注釋符、轉義符,。

  詞法分析器負責將輸入的源程序按照構詞規(guī)則分解成一系列單詞符號,,功能可細分如下:輸入、預處理功能,、超前搜索功能,、狀態(tài)轉換功能。詞法分析器工作的第一步是輸入源程序文本,,為了更好地對單詞符號識別,,對輸入串先進行預處理,主要是過濾掉空格,、注釋,、換行符等;在詞法分析過程中,,為了能確定詞性,,需要超前搜索若干字符;詞法分析器使用狀態(tài)轉換圖來識別單詞符號。

  4.1.1狀態(tài)轉換圖實現(xiàn)

  狀態(tài)轉換圖是一張有限方向圖,。在狀態(tài)轉換圖中,,有一個初態(tài),至少一個終態(tài),。輸入的字符信息進入狀態(tài)轉換圖的初始狀態(tài),,最終會經(jīng)過一條路徑到達某個終結狀態(tài),并得到其識別的字符串,。下面給出注釋的狀態(tài)轉換圖,,注釋格式:/* 注釋部分*/,轉換圖如圖4所示,。

 

Image 004.jpg

  每讀入一個字符,,如果字符是“/”,就說明后面的部分可能是注釋,再看下一個輸入字符,,如果是“*”, 就是注釋中的“ /*”,,那么后面的部分就是注釋部分,然后再用相同的方法找出"*/",,對應的邏輯實現(xiàn)代碼如下:

  while((ch=getchar())!=EOF)

  switch(state)

  case 1 :if ch=="/",state=2,break;

  case 2:if ch=="*",state=3

  else state=1;break;

  case 3:if ch=="*",state=4;

  else state=3;break;

  case 4: if ch=="/",state=5;

  else state=3;break;

  case 5:……

  4.1.2待分析的詞法及類別碼

  腳本引擎支持16個關鍵字,、5種控制語句和常見運算符,每個單詞符號都有對應的類別碼,,見表1,。

  表1主要關鍵字對應的類別碼

  

Image 005.jpg

  詞法分析過程中會分析所有單詞,并獲得其類別碼,,其實現(xiàn)函數(shù)定義如下:

  Void gettypecode(INT char* string ,OUT BYTE syn,OUT char*toke);

  輸入:待分析的源程序字符串,。

  輸出:syn為單詞類別碼,token為存放的單詞本身字符串,。

  4.2語法分析器設計與實現(xiàn)

  語法分析器的作用是將詞法分析輸出的單詞序列作為輸入,,根據(jù)語言的文法規(guī)則,生成中間代碼,,語法分析遇到錯誤時會定位錯誤位置,,以便糾錯。本文采用遞歸下降法實現(xiàn)語法分析,。

  遞歸下降分析法要求是LL(1)文法,,其基本思想是對文法中的每個非終結符編寫一個函數(shù),再利用函數(shù)之間的遞歸調用模擬語法樹自上而下的構造過程,,具體實現(xiàn)方法概述如下:

 ?。?)每個非終結符對應一個解析函數(shù);

 ?。?)產(chǎn)生式右側為該產(chǎn)生式左側非終結符所對應解析函數(shù)的“函數(shù)體”,;

  (3)產(chǎn)生式右側終結符對應從輸入串中“消耗”該終結符的操作;

 ?。?)產(chǎn)生式中的‘|’對應函數(shù)體中的“ifelse”語句,。

  對應的邏輯實現(xiàn)主要結構和函數(shù)如下:

  typedef struct LEX

  {

  Token read;

  struct LEX *next;

  size_t line;

  }MYLEX;//詞法分析得到的所有字符串集合

  MYLEX* Read_file(MYLEX* current);

  MYLEX* Advance(MYLEX* current); //單詞

  int match(Token read ,Token aim);

  int Execute_statement(void) //執(zhí)行語句

  4.3虛擬機及接口的設計與實現(xiàn)

  虛擬機模擬運行環(huán)境,執(zhí)行字節(jié)碼,,并對腳本得出相應的結果,。本文的虛擬機是堆棧結構的,包括模擬處理器,、寄存器和堆棧結構,。作為三維顯示系統(tǒng)的一個輔助功能模塊,虛擬機需要與三維顯示系統(tǒng)相互調用,,它是腳本引擎與三維顯示系統(tǒng)之間交互的平臺,。其功能包括:初始化主要的數(shù)據(jù)結構,;指令系統(tǒng)設計,;虛擬機API設計。

  4.3.1虛擬機主要結構

  為了模擬CPU,、寄存器等真實的運行環(huán)境,,虛擬機必須包含與這些單元對應的數(shù)據(jù)結構,并需要指令執(zhí)行所需要的結構,。

  指令流:獲取從語法分析器輸出的中間碼,,是需要執(zhí)行指令的集合。

  程序計數(shù)器pc:指向下一個需要執(zhí)行指令的指針,。

  堆棧:存放重要數(shù)據(jù)的存放地址,,支持系統(tǒng)調用。

  4.3.2虛擬機指令系統(tǒng)

  虛擬機指令系統(tǒng)是以堆棧為中心設計的,,避免了傳統(tǒng)的以寄存器為中心的限制,。與硬件平臺的無關性使得虛擬機具有良好的跨平臺性。

  每條指令以字節(jié)為單位,,模擬處理器執(zhí)行指令,。不同的指令對應的操作數(shù)個數(shù)也不同。獲取字節(jié)后,,根據(jù)字節(jié)碼確定其是指令還是數(shù)據(jù),,若是指令則判斷對應的操作數(shù)個數(shù)。由于采用堆棧方式,,指令需要的參數(shù)都存放在堆棧中,。主要的指令如下:

  POP_LUB:堆棧棧頂出棧指令,沒有操作數(shù),。

  PUSH_LUB:數(shù)據(jù)進棧指令,,有1個操作數(shù)。

  GETNUM_LUB:為參數(shù)分配內存空間指令,有1個操作數(shù),。

  CALL_LUB:函數(shù)調用指令,。

  RET_LUB:函數(shù)返回指令。

  根據(jù)功能,,指令可分為三類:數(shù)據(jù)傳輸指令,,包括進棧、出棧,、變量內存空間分配等指令,;運算指令,包括算術運算,、邏輯運算和字符串運算指令,;轉移指令,包括函數(shù)調用,、返回,、條件轉移等指令。

  4.3.3腳本引擎API設計與實現(xiàn)

  腳本引擎API是腳本引擎與主程序交互的窗口,,負責兩者之間的通信,。在三維顯示系統(tǒng)運行過程中,腳本引擎以動態(tài)庫的形式加載到主程序中,,腳本引擎可以調用主程序中的全局變量,、函數(shù),實現(xiàn)對實例的訪問和調用,。按照功能可將API劃分為三類,。

  (1)基礎信息管理類

  用于進行全系統(tǒng)的基礎信息的配置維護,,包括二維GIS數(shù)據(jù)的轉換和管理模塊,,三維地景數(shù)據(jù)的轉換、管理和設置,,主要API如下:

  void CreateEntity (Str Name,Str Type,Str 2DFileName,Str 3DFileName);//為GIS創(chuàng)建物體

  void loadearth(FLOAT[3] Pos, FLOAT[3] Pose);

  //加載某個地景

  void PlayCartoon(STR entityName, STR actionName, BOOL bRecycle);//加載視頻流

  voidEntityStartMove (STR Name, STR AirwayName,FLOAT Speed);//模擬運動物體

 ?。?)場景模擬類

  用于模擬真實的世界場景,包括氣象天氣的模擬,。主要API如下:

  Void Rain_SetPara(INT RainAccount,DWORD UpColor,DWORD DownColor,INT RainCourse,INT RainAlpha);//模擬下雨效果

  VoidSunshine_SetPara (FLOAT NorthAngle, FLOAT EastAngle);//模擬太陽效果

  VOID SetCameraPosAndPose (FLOAT[3]Pos, FLOAT[3]

  Pose);//設置相機參數(shù),,模擬從某個位置和角度觀察世界的效果。

  (3)方案管理類

  主要用于制作有特定需求的顯示方案,,主要API如下:

  bool SkyLine_Create(STR Name);

  void SkyLine_AddPoint(STR Name,FLOAT[3] Pos,INT time);

  void CurveCreate (STR Name,INT Width,INT Color);

5結論

  為了提升GIS系統(tǒng)的可定制性,,本文提出了基于腳本引擎的GIS系統(tǒng)設計思路,利用腳本技術將各個基礎功能模塊有效地組合起來,,為用戶提供了二次開發(fā)的功能,。

參考文獻

 ?。?] 謝斌,高揚.基于腳本語言的三維動畫技術的研究與實現(xiàn)[D].成都:四川師范大學,2007.

  [2] 吳文輝. 輕量級鍵盤鼠標模擬腳本引擎實現(xiàn)[J].軟件,,2013,34(8):56-57.

 ?。?] 高明.基于Java平臺的通用腳本引擎的研究與實現(xiàn)[D].北京: 北京郵電工大學,2007.

 ?。?] 王朗.基于虛擬機的腳本引擎的研究與實現(xiàn)[D].長春: 吉林大學,,2005.

  [5] 謝錦春.基于腳本的三維場景合成和驗證系統(tǒng)[D] .杭州:浙江大學,2013.

 ?。?] 諶勇.游戲腳本引擎設計與實現(xiàn) [D].昆明:昆明理工大學,2007.

 ?。?] 符盛寶.輕型腳本引擎的研究與開發(fā) [D].北京:北京化工大學,2011.


此內容為AET網(wǎng)站原創(chuàng),未經(jīng)授權禁止轉載,。