GIS开发平台在Android下的一种移植实现
2017-04-14李永红
齐 冰,初 宁,李永红
GIS开发平台在Android下的一种移植实现
齐 冰1,初 宁2,李永红3
(1. 华北计算技术研究所,北京市 100083;2 3. 中国电子设备系统工程公司研究所,北京市 100039)
GIS应用开发平台是一个涉及到多方面的复杂项目。基于已有的、在Window平台下以C++语言开发的GIS库,如何移植到Android平台下,并提供在Android平台下的GIS二次开发接口,是本文讨论的重点。为此,本文分别从移植原则、移植设计、移植思路等角度进行阐述。最后作为例子,给出在Android下的应用此接口开发出的Demo运行示意图。
GIS Android 移植 地理信息系统
0 引言
地理信息系统(Geographic Information System,以下简称GIS)是一个综合的科学系统,它以计算机软硬件作为基础,以地理空间数据为处理对象,运用系统工程和信息科学的理论对地理空间数据进行判断、分析,并提供决策。新世纪以后,人们已不再满足于从台式电脑上获取地理信息,而是提出了更高的要求,推动了多终端尤其是移动设备与GIS在相关领域的结合,促进了 GIS的进一步发展。鉴于Android设备在移动端的比重,本文拟选取Android系统作为适配环境进行论述。
基于一个已有的以C++语言开发的GIS平台,本文分别从移植可行性、基础技术原理、移植方案选取、类包详细设计等角度进行阐述。
1 移植原则
本文跨平台设计为二次开发用户创建一套完整的GIS应用框架,能适配Android平台的GIS应用项目,为二次开发用户提供一个完整的解决方案和设计开发平台,使其能更方便的使用GIS开发接口,更高效的减少甚至屏蔽Android系统带来的差异性。最终提高研发效率、降低研发成本。其中,基于GIS项目可扩展的角度,本文基于市场需求和计算机技术的发展进行升级、调整、补充,同时不破坏整个GIS项目的整体性,需要满足以下特性原则:
1.1通用性
相比于C++的GIS库,Android平台下的GIS项目需要满足针对其自身平台下的需求,在整体设计框架领域提供支持。在表现层次上,GIS项目提供统一的接口服务,统一的系统配置文件,统一的地图初始化流程等。二次开发者在使用本GIS开发工具时,在已有的GIS库中积累的开发经验,可以完全移植到Android平台中去。
通用性还需要表现在对地图的控制使用上面。二次开发用户如果由于使用地图的需求,比如缩放漫游等操作,其在各个终端平台上面,调用GIS二次开发接口时应有统一的接口规范、通用的控制流程,本GIS系统对API的反应处理情况一致。
1.2易用性
相对于已有的C++编写的GIS库项目,Android平台下的二次开发者在面对跨平台应用需求时,需要基于Android平台下的GIS接口进行二次开发。在面对数量庞大的接口,GIS系统在设计时应满足易用性特点,分离业务逻辑和底层实现,对二次开发者屏蔽GIS系统实现细节。
同时接口的设计中满足通用的命名规范,针对不同种类的接口封装到对应的类别中。总之使二次开发者更方便、更抽象的使用。在GIS接口支持下,二次开发用户更加专注在本身的业务逻辑上,满足易用性特点。
1.3扩展性
需求是不断升级的,GIS项目在设计时应预留出升级空间,根据实际需要适时升级。框架本身应具有灵活性,多使用成熟的插件技术,为随时可能的升级提供保证。可扩展和需要扩展的需求点在某种程度上是可以预见的。GIS在接口设计上时,应充分考虑今后的升级需要,在改动原有代码逻辑最少的情况下,更加方便扩展。
1.4维护性
面对已有的GIS项目和Android平台下项目,如果没有有效的进行维护,则在升级扩展、版本更迭时会变得很难以控制。这样就对系统本身的维护性提出了要求。维护性对于某款以定型产品而言要求不大,但是本文面对的情况是用户需求的变更性和未知性,所以产品迭代一直在进行。代码版本在升级时,如果可维护性差,就会面对在同一时刻两个平台下的各个版本底层库的不一致,大大增加系统开发和维护成本。所以维护性对于跨平台项目来说,至关重要。
2 移植思路
本文GIS项目在Android平台下的移植时,充分考虑以上设计原则。同时面对实际用户需求,提出一种解决方案。整体的设计思路是,根据已有的Windows下GIS项目,把它移植到Android系统下,再针对Android平台做些适配性的工作,共用一套GIS库底层引擎。如此设计可以很好的满足以上设计原则。
首先,共用同一套GIS底层库,可以在系统需要升级的时候,只维护一套GIS底层库代码。这样就可以保证,在一个项目中修改的关于GIS底层库的部分,可以直接同步到其他的项目中去。两个平台项目之间维护一个GIS版本号,不需要分别管理控制。这样,大大提高了整个GIS跨平台系统的可维护性。
其次,由于各个平台项目底层共用一套GIS代码,同时在针对Android平台进行再次封装时保持统一的接口命名风格,这样就会使二次开发者在使用本GIS接口进行开发时更加易用。二次开发者可以选择在Windows上开发时,只做很小甚至不用修改,就可以把代码完整的移植到Android终端上去。对于二次开发者本身而言,屏蔽系统和平台之间的差别,只关心GIS项目和其本身的业务,可以更加方便其使用,提高开发效率。
再次,GIS底层库在两个平台之间共享,导致所有平台下对于底层GIS库的处理逻辑一致。比如读取同样的配置文件、使用同样的地图、同样的初始化使用流程等。如此,在Android的移植中,通用性也可以满足。
3 移植原理和可行性
JNI(Java Native Interface)提供了若干API实现了Java和C++的通信。JNI标准成为java平台的一部分,允许Java代码和的代码进行交互。本文利用JNI技术,与底层C++编写的GIS库公用一套接口,进行Android应用与底层GIS库的数据通信和函数调用。
如图1所示,Android APP会调用Java以native函数封装的API。采用JNI的机制,native函数会和底层GIS库进行通信,互相调用。Java的native函数要跟C++的相应函数一一对应。对应必须保证函数所在的类名、包名,函数本身的名字、参数个数参数名,函数返回值保持一致。之后,JNI机制会保证在Java层调用native函数时,指向C++对应的函数上。
图1 Android应用与底层GIS库的函数调用Fig.1 Function calling between Android Application and GIS library
4 地图的绘制
在从桌面端往Android平台的适配中面临很多问题,其中以在Android下如何绘制为例进行阐述。Android下面绘制的效果最终以一个app的形式展现。
如图2所示,GISView是重载自View的自定义类,几个函数流程简单介绍如下:
图2 绘制流程图Fig.2 Chart of drawing flow
4.1Invalidate ()函数。
在某个需要重新绘制的时刻,比如当地图进行缩放或者漫游时,需要通知GISView进行重新计算、重新绘制。此流程开始于invalidate()函数的调用。invalidate()函数可以显式通知GISView,导致接下来地图的更新。
4.2OnDraw ()函数
调用完invalidate()函数之后,Android系统会负责在来接下来的时刻调用GIS View的onDraw()函数。GISView onDraw()函数重载自Android View的onDraw()函数,onDraw()函数在View整个的绘制流程中负责最后的绘制部分。GISView重载之后,实现自己的绘制逻辑。
4.3getPixels ()
API层是针对底层GIS库封装的一个中间层。GIS库底层使用C++编写,共用Windows系统上的一套代码。Android应用使用Java语言开发,为了共用一套代码,本文采用JNI的方式进行代码的共用,封装的一层Java接口,以供应用调用,来实现绘制地图等一系列地图操作。函数getPixels()是API层里面的一个重要的函数。
4.4getGraphicsBuffer ()
函数getPixels()的调用GIS库里面的getGraphics-Buffer()函数,获取在GIS库中保存的位图buffer,再构建一个位图数组返回。GIS库的实现中,根据地图数据等生成位图和绘制位图是两个过程,生成位图之后保存在相应的buffer中,绘制时直接获取已保存的位图。示意图如图所示。
图3 位图获取示意图Fig.3 Chart of getting bitmap
4.5onDraw()处理
GISView的onDraw()函数在调用完JNI的native方法getPixels()并成功返回int型数组之后,构造可以用来在Android上绘制的Bitmap类,再用canvas绘制出来。
最后,给出使用本文封装的Android库的一个demo示意图,下图4。
5 结束语
本文基于一个已有的,在Windows平台下以C++开发的GIS库为基础,做了其往Android平台移植的工作。分别从移植原则、移植思路等进行阐述。其中,在移植工作中着重阐述了在Android平台下的如何绘制的问题。最后给出运行效果图。
面对单一平台下的一个复杂项目,想要在其他平台环境中实现相同功能时,本文便提供了一种思路。即,尽可能的重用原有代码,进而增加开发效率,减少成本。
图4 运行效果示意图Fig.4 Chart of a running example
[1] 赵斌, 李欣, 朱美正. GIS跨平台技术研究与实现[J]. 计算机工程与应用, 2005, (23): 193-195+212.
[2] 胡达天, 胡庆武. 基于开源系统的跨平台地图客户端开发[J]. 测绘科学, 2015, (07): 142-145.
[3] 高捷, 何斌棋, 陈光. 基于Android平台的移动GIS输配电线路巡检系统的设计与实现[J]. 中国高新技术企业, 2012, (24): 25-28.
[4] 龚健雅, 贾文珏, 陈玉敏, 解吉波. 从平台GIS到跨平台互操作GIS的发展[J]. 武汉大学学报(信息科学版), 2004, (11): 985-989.
A Development of a GIS Development Platform under Android
QI Bing, CHU Ning, LI Yong-hong
(1. North China Institute of Computing Technology, Beijing 100083, China;2. North China Institute of Computing Technology, Beijing 100083, China)
The GIS application development platform is a complex project involving many aspects. Based on an existing GIS library, which is developed in the Window platform and in C++ language, this paper focuses on how to transplant it to the Android platform, and to provide the Android platform the secondary development interface. Finally, as an example, we give an example using this interface developed by this paper in Android platform.
GIS; Android; Transplant
P208
: A
10.3969/j.issn.1003-6970.2017.02.025
本文著录格式:齐冰,初宁,李永红. GIS开发平台在Android下的一种移植实现[J]. 软件,2017,38(2):121-124