《电子技术应用》

脚本引擎在三维GIS系统中的设计与实现

2017年微型机与应用第10期 作者:李勇
2017/7/28 22:20:00

  李勇

  (中国人民解放军92941部队96分队,辽宁 葫芦岛 125001)

  摘要:GIS(地理信息系统)是个复杂的系统,在主要功能一致的前提下,如何为用户提供专用的系统是迫切需要解决的问题。脚本技术以其灵活的可定制性和可扩展性的优势解决了此问题。研究了基于脚本引擎的开发技术,分析了基于脚本引擎的GIS结构,设计并实现了脚本引擎。

  关键词3d GIS;脚本引擎;Lub状态转换;虚拟机API

  中图分类号:TP319文献标识码:ADOI: 10.19358/j.issn.1674-7720.2017.10.007

  引用格式:李勇.脚本引擎在三维GIS系统中的设计与实现[J].微型机与应用,2017,36(10):23-25,29.

0引言

  随着计算机技术的不断发展,计算机编程语言和技术都发生了很大变化。在传统的工程应用系统的设计中,软件往往在实现之前用户需求就发生变更。因此,人们迫切需要开发出可定制化、可用户化和可扩展的软件系统来减少需求变更所带来的开发和维护成本[1]。

  使用基于混合脚本编程的方法是实现扩展灵活的可定制软件系统的有效方法。近年来,脚本语言凭借其强大的描述能力和灵活的语法结构,为应用程序提供脚本支持,从而进行混合语言开发被,成为实现可扩展和可定制的有效方案[2]。目前,脚本语言已经广泛应用于计算机软件领域,如JavaScrip应用于Web网页设计、微软的VBA用于Office应用的自动化以及开源领域中Ruby、Python、Jython等脚本语言[3]。

  本文主要关注在三维GIS系统中,如何实现可定制、可扩展功能的脚本引擎,来满足用户的多元化需求。

1脚本引擎关键技术分析

  1.1脚本语言简介

  脚本语言是为了缩短传统的编写-编译-链接-运行过程而创建的计算机编程语言,用来控制应用程序,具有良好的快速开发能力和与其他语言编写的程序组件之间通信的功能[4]。很多脚本语言用来执行一次性任务,尤其是系统管理方面,它可以把服务组件粘合起来,广泛用于GUI创建或者命令行。脚本通常以文本保存,只在被调用时进行解释或编译,经常把脚本和其他低级编程语言一起使用,各自发挥优势解决特定问题[5]。

  1.2脚本引擎技术分析

  在脚本运行过程中,脚本引擎先将脚本解释为中间指令,再执行中间指令,所以脚本引擎既是脚本解释器又是脚本执行器[6]。此外,嵌入脚本引擎、支持脚本语言的应用程序称为主程序[7]。脚本引擎、脚本程序与主程序之间的关系如图1所示。脚本程序是用户事先编写完的字符串,可以保存到文本文件或特定格式文件中,能被脚本引擎识别;当需要执行某个脚本程序时,主程序通过调用脚本引擎API来启动脚本引擎和通知脚本引擎执行此脚本程序;脚本引擎加载、解释、

 

Image 001.jpg

  运行脚本程序,并将结果反馈给主程序。可见,脚本引擎是主程序和脚本程序的纽带。

2脚本引擎在三维GIS系统中的结构分析

  三维GIS是模拟、表示、管理、分析客观世界中的三维空间实体及其相关信息的计算机系统,能为管理和决策提供更加直接和真实的目标和研究对象。为提高系统的稳定性和可移植性,在设计系统结构时采用先进的NTIER架构。系统软件部分采用面向对象的设计方法以及基于组件设计的理念和技术,从纵向的架构层面上,该系统提供三大层面、若干小层面的抽象、映射、实现和封装;应用层对各子系统的用户业务处理逻辑进行实现和封装,数据库层是采用多种形式结构数据库的总体封装,提供本地及远程多种数据连接方式,为应用层提供透明的数据存储和访问功能。GIS系统层次结构如图2所示。

 

Image 002.jpg

  如图2所示,该系统基于空间GIS数据库和各类专用数据库,运用VR技术,通过使用三维引擎及脚本引擎,实现三维地景浏览、空间定位查看、空间量测等丰富功能。脚本引擎模块处于中间层,向下管理着各种专用数据库数据;同层中,可调用三维引擎模块,从而控制三维场景和模型的显示方式;向上提供本模块的调用接口,供应用层调用,完成资源的控制。

3脚本引擎总体结构设计

  脚本引擎模块结构为上下两层。上层能识别脚本语言,并将脚本程序编译成字节码指令;下层执行字节码指令。上下层的分离可以提高脚本引擎的可移植性和可扩展性。如图3所示,上层编译器负责将脚本源程序的字节流转换成指令序列,对源程序进行词法、语法等进行逻辑分析,当出现错误时给出错误图3脚本引擎体系结构信息和定位错位位置;虚拟机负责指令流的解释执行;API是虚拟机与主程序交互的桥梁,实现两者之间互相控制、通信。

4脚本引擎设计与实现

  本脚本引擎面向的脚本语言为自主设计的语言Lub。Lub语法符合LL(1)型文法,可以采用自顶向下递归法进行语法解析。

  4.1词法分析器设计与实现

  Lub脚本语言的词法标记有四类:标识符、关键字、常量、特殊符号。标识符用来标识脚本程序中的变量、数组和函数,由字母、数字和下划线组成,且标识符首字母不能是数字;关键字是能够被词法分析器识别的具有特定含义的字符串,如定义变量的关键字、运算符号、判断符号、控制符号等;常量指数字和字符串;特殊符号包含注释符、转义符。

  词法分析器负责将输入的源程序按照构词规则分解成一系列单词符号,功能可细分如下:输入、预处理功能、超前搜索功能、状态转换功能。词法分析器工作的第一步是输入源程序文本,为了更好地对单词符号识别,对输入串先进行预处理,主要是过滤掉空格、注释、换行符等;在词法分析过程中,为了能确定词性,需要超前搜索若干字符;词法分析器使用状态转换图来识别单词符号。

  4.1.1状态转换图实现

  状态转换图是一张有限方向图。在状态转换图中,有一个初态,至少一个终态。输入的字符信息进入状态转换图的初始状态,最终会经过一条路径到达某个终结状态,并得到其识别的字符串。下面给出注释的状态转换图,注释格式:/* 注释部分*/,转换图如图4所示。

 

Image 004.jpg

  每读入一个字符,如果字符是“/”,就说明后面的部分可能是注释,再看下一个输入字符,如果是“*”, 就是注释中的“ /*”,那么后面的部分就是注释部分,然后再用相同的方法找出"*/",对应的逻辑实现代码如下:

  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

  词法分析过程中会分析所有单词,并获得其类别码,其实现函数定义如下:

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

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

  输出:syn为单词类别码,token为存放的单词本身字符串。

  4.2语法分析器设计与实现

  语法分析器的作用是将词法分析输出的单词序列作为输入,根据语言的文法规则,生成中间代码,语法分析遇到错误时会定位错误位置,以便纠错。本文采用递归下降法实现语法分析。

  递归下降分析法要求是LL(1)文法,其基本思想是对文法中的每个非终结符编写一个函数,再利用函数之间的递归调用模拟语法树自上而下的构造过程,具体实现方法概述如下:

  (1)每个非终结符对应一个解析函数;

  (2)产生式右侧为该产生式左侧非终结符所对应解析函数的“函数体”;

  (3)产生式右侧终结符对应从输入串中“消耗”该终结符的操作;

  (4)产生式中的‘|’对应函数体中的“ifelse”语句。

  对应的逻辑实现主要结构和函数如下:

  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) //执行语句

  4.3虚拟机及接口的设计与实现

  虚拟机模拟运行环境,执行字节码,并对脚本得出相应的结果。本文的虚拟机是堆栈结构的,包括模拟处理器、寄存器和堆栈结构。作为三维显示系统的一个辅助功能模块,虚拟机需要与三维显示系统相互调用,它是脚本引擎与三维显示系统之间交互的平台。其功能包括:初始化主要的数据结构;指令系统设计;虚拟机API设计。

  4.3.1虚拟机主要结构

  为了模拟CPU、寄存器等真实的运行环境,虚拟机必须包含与这些单元对应的数据结构,并需要指令执行所需要的结构。

  指令流:获取从语法分析器输出的中间码,是需要执行指令的集合。

  程序计数器pc:指向下一个需要执行指令的指针。

  堆栈:存放重要数据的存放地址,支持系统调用。

  4.3.2虚拟机指令系统

  虚拟机指令系统是以堆栈为中心设计的,避免了传统的以寄存器为中心的限制。与硬件平台的无关性使得虚拟机具有良好的跨平台性。

  每条指令以字节为单位,模拟处理器执行指令。不同的指令对应的操作数个数也不同。获取字节后,根据字节码确定其是指令还是数据,若是指令则判断对应的操作数个数。由于采用堆栈方式,指令需要的参数都存放在堆栈中。主要的指令如下:

  POP_LUB:堆栈栈顶出栈指令,没有操作数。

  PUSH_LUB:数据进栈指令,有1个操作数。

  GETNUM_LUB:为参数分配内存空间指令,有1个操作数。

  CALL_LUB:函数调用指令。

  RET_LUB:函数返回指令。

  根据功能,指令可分为三类:数据传输指令,包括进栈、出栈、变量内存空间分配等指令;运算指令,包括算术运算、逻辑运算和字符串运算指令;转移指令,包括函数调用、返回、条件转移等指令。

  4.3.3脚本引擎API设计与实现

  脚本引擎API是脚本引擎与主程序交互的窗口,负责两者之间的通信。在三维显示系统运行过程中,脚本引擎以动态库的形式加载到主程序中,脚本引擎可以调用主程序中的全局变量、函数,实现对实例的访问和调用。按照功能可将API划分为三类。

  (1)基础信息管理类

  用于进行全系统的基础信息的配置维护,包括二维GIS数据的转换和管理模块,三维地景数据的转换、管理和设置,主要API如下:

  void CreateEntity (Str Name,Str Type,Str 2DFileName,Str 3DFileName);//为GIS创建物体

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

  //加载某个地景

  void PlayCartoon(STR entityName, STR actionName, BOOL bRecycle);//加载视频流

  voidEntityStartMove (STR Name, STR AirwayName,FLOAT Speed);//模拟运动物体

  (2)场景模拟类

  用于模拟真实的世界场景,包括气象天气的模拟。主要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);//设置相机参数,模拟从某个位置和角度观察世界的效果。

  (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系统的可定制性,本文提出了基于脚本引擎的GIS系统设计思路,利用脚本技术将各个基础功能模块有效地组合起来,为用户提供了二次开发的功能。

参考文献

  [1] 谢斌,高扬.基于脚本语言的三维动画技术的研究与实现[D].成都:四川师范大学,2007.

  [2] 吴文辉. 轻量级键盘鼠标模拟脚本引擎实现[J].软件,2013,34(8):56-57.

  [3] 高明.基于Java平台的通用脚本引擎的研究与实现[D].北京: 北京邮电工大学,2007.

  [4] 王朗.基于虚拟机的脚本引擎的研究与实现[D].长春: 吉林大学,2005.

  [5] 谢锦春.基于脚本的三维场景合成和验证系统[D] .杭州:浙江大学,2013.

  [6] 谌勇.游戏脚本引擎设计与实现 [D].昆明:昆明理工大学,2007.

  [7] 符盛宝.轻型脚本引擎的研究与开发 [D].北京:北京化工大学,2011.


继续阅读>>