服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java 手机与空间制图服务应用集成

本文探讨利用 j2me 手机,实现移动设备与空间制图服务(wms)网络应用服务集成,可以实现对j2me手机对网络lbs、gis 图像数据的访问与地图数据的显示,并在迅速实现小型的lbs、移动 gis 核心的导航地图的显示功能。

  引言

  人类的日常生活行为80%以上与空间位置有关,对空间位置信息获得有着与生俱来的需要。随着社会的发展,人们的活动范围越来越大,而且越来越不确定。这种移动性和不确定性给移动通信带来市场和挑战的同时,也为空间位置服务的开展和扩大带来了无限商机。空间位置服务(lbs--location based service以下简称lbs),是指通过移动通信网络,采用无线定位,结合gis地理信息系统,为用户提供基于位置导航、查询的一种增值业务。lbs属于移动gis中典型的应用领域之一,它涉及到地理信息服务、计算机应用互操作、无线通讯、手机等技术,属于空间信息、计算机网络协同计算交叉学术领域。目前,应用无线通讯技术最广的消费群体是手机用户,这些用户对空间位置服务有较大需求。

  与此同时,伴随着计算机网络、无线通讯等技术的发展,java 手机的应用已经在国内崭露头角。java 手机(注:j2me手机是指支持java micro edition ,midp的手机,通常我们所说的"java手机"就是"j2me手机")一改传统手机功能固定、系统封闭的模式,为 java 手机开发者与用户提供了一个开放的接口,应用程序开发者和用户可以根据自己的需要开发或下载符合自身的软件。目前, j2me (java 2 platform, micro edition)已经成为目前最流行的手机应用开发平台之一。

  java手机的发展已经为开发基于java手机平台的空间位置服务(lbs)提供了条件。针对手机用户对空间位置服务的需求,笔者基于 java 手机开发出了"个人导航系统"。本系统的早期版本(基于 motorola 388手机),曾在在2002年6月中国软件协会、motorola、sun公司等联合举办的"全国无线 java 应用程序大赛"中获得优秀奖。

  通常来说,在cpu运算速度低、内存与存储空间有限的 java 手机上开发 lbs与gis 导航系统是比较困难的,一些lbs用户对导航地图信息的获取,往往是通过java手机与相关lbs业务应用网络服务应用集成来实现的,这其中 java 手机对网络 gis 图像导航资源的获取与操作,是任何lbs系统的核心技术之一。笔者在自主开发的"个人导航系统"中,利用 j2me手机(motorola388、motorola a760等)通过 gprs 网络,实现了 j2me 手机与空间 wms (web map service)服务应用集成,并获取导航地图,并完成相关操作。以下介绍 j2me 手机对网络图像资源的访问。

  2 j2me 手机对图像对象的获取

  2.1 j2me 手机对图像的获取与显示

  j2me 手机的 midp 1.0标准版本,只支持 png 格式的图像。可以显示静态的图像和非静态的图像。静态图像是指一经创建,图像的内容就不再变化的图像。而非静态图像是指图像可以有 j2me 绘图语句动态创建。由于 j2me 手机的计算能力有限,在基于 j2me 手机的移动 gis 中,笔者采用了静态 png 格式的栅格图像。j2me 手机对静态图像的创建主要有两种方式:第一种方式:直接由捆绑在应用 jar 文件中的应用资源文件来装载和创建一个静态图像[1]。其构造方式为:

 image img=image.createimage(string pngname); 

  其中:pngname 为 j2me 应用程序 jar 文件中的图像文件名。由于 j2me 手机的存储容量有限(通常为几百 k 或几兆),而lbs、移动 gis 空间数据量相对较大,单纯地将lbs、移动 gis 客户端的数据,按照上述方式存储在移动客户端本地 j2me 手机上,很难满足移动 gis 空间数据的存储;另外,对移动客户端的数据更新也比较困难。

  第二种方式:使用二进制 png 格式数据创建一个静态图像。

 image img=image.createimage(byte[], int offset, int length); 


  其中:byte[] 为 png 格式数据数组,offset,length 分别为使用数组的偏移量与长度。

  这种创建静态图像的方式比较灵活,png 格式数据数组可以来自 j2me 程序的任何地方(如:网络)。笔者开发的基于 motorola388 手机的lbs、移动gis系统,就是利用移动客户端的 motorola388 手机来动态地读取网络服务器的 gis 空间数据(当然数据格式可以是矢量或栅格格式),而且能比较方便地更新客户端的数据。


  2.2 空间地图服务(web map service)的 gis 图像动态生产

  空间web服务(spatial web services)是关于空间信息应用之间的互操作的研究领域。伴随着计算机软硬件技术的发展,空间 web 服务也发展很快,相应的标准化工作也在迅速展开。空间信息目前 ogc 已经制定或建议的空间 web 服务主要有:

  • web map service,
  • web registry service,
  • web feature service,
  • web coverage service,
  • styled layer descriptor for wms,
  • geocoder service,
  • transaction wfs 等等,


  其中:iso/tc211已经采纳与空间web相关的标准有:web map service (iso 19128)标准、以及iso 19136 - geography markup language(地理信息标记语言gml)。

图 1 空间 web 服务体系结构
图 1 空间 web 服务体系结构

  空间 web 服务与标准的 web 服务有着类似的体系结构,但是空间 web 服务与标准的web 服务也有一些区别:如:空间 web 服务中消息的传递可能直接使用 xml 协议而不使用 soap 协议。鉴于移动用户最关心的是空间信息相关的地图信息,而 wms 服务已经被iso/tc211 采纳,以下主要围绕移动设备(如:java 手机)与空间 web 服务 wms 之间的互操作来研究。

  地图服务器 web map service wms 是一种 web 服务,它提供了由地理空间动态产生用户所需要的空间信息的服务。用户可以获得适合自己显示的栅格(如:png, gif or jpeg)、栅格数据(如:svg),或 web 图像元文件 web computer graphics metafile (webcgm)等数据格式。ogc 定义了地图服务器 web map service wm 的三种操作,getcapabilities,getmap,getfeatureinfo。其中与导航密切相关的是 getmap 操作,getmap 返回一幅根据客户端请求参数动态生成的地图。



如:http://localhost:8080/wmsserver111/servlet/wms?version=1.1.1
&srs=epsg:4267&request=getmap&layers=layers/world/countries&styles=&bbox=
-180,-180,180,180&width=800&height=600&format=image/gif
将返回一幅地图给客户端:

   图 2 wms getmap 服务响应
图 2 wms getmap 服务响应 


3 java 手机与网络

  3.1 j2me 手机对网络的支持

  j2me 手机使用 http 协议作为 midp 网络库的网络协议。http 是一个丰富而且被广泛使用的协议,可以在不同的无线网络中很简单地实现。midp 设备的 http 可以使用 ip 协议,例如 tcp/ip 或非 ip 协议像 wap 或 i-mode 来实现。midp 网络 api 定义在javax.microedition.io.httpconnection 中。这个接口扩展了javax.microedition.io.contentconnection并且提供了附加的域和方法来解析 url、设置请求以及解析相应头。

  3.2 j2me 手机对空间制图服务(wms)导航图像(png 格式)数据的请求

  以下代码仅演示j2me手机对空间制图服务(wms)数据请求核心的代码,空间制图服务(wms)服务器,可以是任何符合ogc wms标准的任何服务器(本文使用了mapinfo mapxtreme 4.7提供的wms服务)

 package untitled9;  import java.io.*; import java.util.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.rms.*; import javax.microedition.io.*; public class untitled0     extends midlet     implements commandlistener, itemstatelistener {   display display;   canvas canvas0;   // custom declaration code starts here   public untitled0() {     display = display.getdisplay(this);     canvas0 = new canvas() {       public void paint(graphics g) {         httpconnection content = null;         byte[] contents = null;         try {           content = (httpconnection)  connector.open("http://localhost:8080/wmsserver111/servlet/wms?
version=1.1.1&srs=epsg:4267&request=getmap&layers=layers/beijing/
road&styles=&bbox=-180,-180,180,180&width=
120&height=120&format=image/png"); /************************************************************************ 通过 http 协议建立连接 content 对象,取得 gis 图像数据文件的长度;然后, 按照该文件的长度构造缓冲区 kkk[];由 content 对象获取输入流, 将数据输入流与数据输入流连接,将 gis 图像数据文件的数据读入缓冲区 kkk[], 由 kkk[]缓冲区构造静态 gis 图像对象me=image.createimage(kkk,0,kkk.length); 这样就可以构造出静态 gis 图像,从而就可以使用任何绘图语句将图像在 j2me 手机屏幕上。 图像的显示:建立一个画布 canvas,在 canvas 的 paint 事件中,加入如下代码: g.drawimage(me,0, 0, graphics.left| graphics.top); *************************************************************************/ try { datainputstream _in = new datainputstream(content.openinputstream()); _in.available(); int _length = (int) content.getlength(); if (_length < 1) { _length = _in.available(); system.out.println(_length); } contents = new byte[_length]; _in.readfully(contents); _in.close(); system.out.println(contents.length); image img = image.createimage(contents, 0, contents.length - 1); g.drawimage(img, 0, 0, g.left | g.top); } catch (ioexception except) { except.printstacktrace(); } } catch (ioexception excpt0) { excpt0.printstacktrace(); } } { this.addcommand(new command("command1", command.screen, 1)); setcommandlistener(untitled0.this); } }; // custom constructor code starts here } public void startapp() throws midletstatechangeexception { display.setcurrent(canvas0); } public void pauseapp() { } public void destroyapp(boolean unconditional) throws midletstatechangeexception { } public void itemstatechanged(item item) { } public void commandaction(command c, displayable d) { if (c.getlabel().equals("command1") && d == canvas0) { } } }





  4 j2me 手机对导航图像资源的存储

  midp 规范为 midlet 提供了一种永久地存储数据并在以后访问他们的机制。这种永久存储机制叫做记录管理系统(record management system,rms)。rms 提供了 j2me 程序对数据的的记录管理 api。利用 rms,我们可以将 j2me 手机由网络读取的图像资源(当然,任何数据文件也可以),保存在 j2me 手机内部 flash 上。

 //定义rms 数据对象 recordstore rs = null; recordenumeration rs_enum = null; try { //创建或打开 rms 内部数据库"gis"  rs = recordstore.openrecordstore("gis",true);  rs_enum = rs.enumeraterecords(null,null,false); } catch ( recordstorefullexception excpt0 ) { } catch ( recordstorenotfoundexception excpt1 ) { } catch ( recordstoreexception excpt2 ) { } try { //将 j2me 手机网络获取的图像文件数据写入数据库  rs.addrecord(kkk,0,kkk.length); } catch ( recordstorenotopenexception excpt0 ) { } catch ( recordstorefullexception excpt1 ) { } catch ( recordstoreexception excpt2 ) { } ….. 


  我们将 gis 栅格图像文件存入 j2me 手机的目的是:减少j2me手机对网络相同资源的重复请求,j2me手机将通过gprs无线网络请求获得的gis导航地图信息,存储到j2me手机本地,将来如果j2me手机再次访问或请求相同导航地信息时候,直接通过访问 j2me 手机内部存储,就可以读取数据,显示地图。为此,我们可以通过打开数据库,将数据库记录读入一个字节数组(如:gisdata []),通过该数组构造出图像。

 byte[] gisdata = null; try {  gisdata = getrecord(0); } catch ( invalidrecordidexception excpt0 ) { } catch ( recordstorenotopenexception excpt1 ) { } catch ( recordstoreexception excpt2 ) { } …. me=image.createimage(gisdata,0, gisdata.length); …… 


   5 结束语

  计算机软硬件技术、网络技术,特别是无线数字通讯网络的普及与应用,已经为计算机之间的协同工作提供了必要的技术保障。从技术的角度来看,该阶段计算机之间的网络分布式计算协同工作方式,突出表现在计算机之间应用的互操作与无缝集成。具体地讲,除了典型的p2p计算模式之外,计算机之间的协同工作已经从传统pc的一些计算、逻辑业务工作正从台式机中分离出来,而朝两个方向发展。其一:计算机之间的协同工作中,一些网络分布式计算的工作回归到网络服务器,分布式计算的工作回归到网络服务器,服务器(或集群)可能是因特网或企业内部网的一个组成部分,也可能是另外一台提供计算服务的pc;服务器(如:计算网格)根据用户的需求,完成大规模运算服务,并将运算结果返回给用户。web服务(如:空间制图服务wms)、网格计算服务就是其中典型的代表之一。其二:一些网络分布式计算的工作,会转移到移动性更强的嵌入式计算平台上,如java手机。 目前,internet上不同软件提供商以及科研机构,提供了大量可以利用的web服务资源,而且这些资源可以方便地被用户检索,并通过应用系统之间的互操作来使用。将web服务延伸到移动设备,完成移动设备与web服务之间的应用无缝集成,不但能让移动设备也能充分利用现有计算资源、让网络用户也能共享移动设备的移动计算资源,而且可以有效发挥网络服务的计算能力,并同时充分利用移动设备的移动性。

  利用 j2me 手机,实现移动设备与空间制图服务(wms)网络应用服务集成,可以实现对j2me手机对网络lbs、gis 图像数据的访问与地图数据的显示,并在迅速实现小型的lbs、移动 gis 核心的导航地图的显示功能。本文旨在"抛砖引玉",不足之处,敬请各位同行指正。

扫描关注微信公众号