本文探讨利用 J2ME 手机,实现移动设备与空间制图服务(WMS)网络应用服务集成,可以实现对J2ME手机对网络LBS、GIS 图像数据的访问与地图数据的显示,并在迅速实现小型的LBS、移动 GIS 核心的导航地图的显示功能。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
1 引言
人类的日常生活行为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 服务体系结构
空间 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 服务响应
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 核心的导航地图的显示功能。本文旨在"抛砖引玉",不足之处,敬请各位同行指正。
参考资料
分享到:
相关推荐
6. **部署与打包**: `Prj12_1.jad`文件是J2ME应用的JAD文件,它包含了应用程序的元数据,如作者、版本、屏幕大小等信息,用于设备安装和运行。对应的`.jar`文件(可能命名为`Prj12_1.jar`,未在列表中给出)包含了...
标题中的“j2me 与jsp通信”涉及的是在移动设备上使用Java 2 Micro Edition (J2ME)平台与服务器端的JavaServer Pages (JSP)进行数据交互的技术。J2ME通常用于开发功能手机和嵌入式系统的应用程序,而JSP则是Web开发...
基于J2ME的移动支付系统终端应用的实现
**基于J2ME平台的手机应用程序研究与开发** J2ME,全称为Java 2 Micro Edition,是Java技术的一个重要分支,专为嵌入式设备和移动设备设计,特别是功能手机。它提供了一套框架和API,使得开发者可以创建能够在各种...
开发J2ME应用通常需要一个集成开发环境(IDE),如NetBeans或Eclipse,它们提供了编写、编译、调试和模拟J2ME应用的工具。此外,Sun Microsystems(现为Oracle)提供的K Java SDK是开发J2ME应用的基础,包括MIDP和...
J2ME应用程序性能优化J2ME应用程序性能优化
5. **J2ME多媒体API(JSR-135)**:允许开发者在J2ME应用中集成音频、视频和图像处理功能。 6. **J2ME本地接口(JSR-120)**:允许J2ME应用与设备的硬件特性进行交互,如摄像头、GPS等。 在**J2ME_中文api.CHM**...
通过将J2ME应用程序与Web Services相结合,可以在资源受限的设备上实现更为复杂的功能和服务。例如,可以通过Web Services获取实时天气信息、新闻资讯等内容,从而提升用户体验。 #### 六、结论 总体来看,尽管...
9. **优化技巧**:由于资源有限,J2ME应用的性能优化至关重要,包括减少内存占用、优化绘图操作和避免不必要的网络请求。 这个压缩包中的源代码实例,很可能是涵盖以上各个方面,通过分析和研究这些代码,开发者...
**J2ME在移动设备中的应用** Java 2 Micro Edition(J2ME)是Java平台的一个子集,专为资源有限的嵌入式设备,尤其是移动设备如手机和掌上电脑设计。它允许开发者创建可以在各种不同设备上运行的应用程序,从而实现...
【标题】: "基于J2ME的手机应用软件的研究" 【描述】: 本文主要探讨了J2ME技术在手机应用软件开发中的应用,作为一篇学年论文,它深入研究了手机软件的发展现状、趋势以及J2ME的技术实现。 【标签】: "手机应用...
【J2ME课程设计——构建服务器与客户端通信】 在IT领域,Java 2 Micro Edition(J2ME)是一种专门用于嵌入式设备和移动设备的Java平台。它为开发小型应用提供了框架,如手机游戏、应用程序和服务。本课程设计的主题...
NetBeans IDE是一款强大的集成开发环境,它为J2ME应用程序的开发提供了便捷的工具和丰富的功能,帮助开发者高效地构建、测试和部署J2ME应用。 ### 1. NetBeans IDE简介 NetBeans IDE是开源的,支持多种编程语言,...
**J2ME手机程序设计与应用** J2ME(Java 2 Micro Edition)是Java平台的一个子集,专为资源有限的嵌入式设备,尤其是移动设备如早期的智能手机和平板电脑而设计。J2ME提供了开发和部署移动应用程序的框架,让开发者...
在J2ME开发中,开发者通常会使用集成开发环境(IDE),如NetBeans、Eclipse或JBuilder,这些工具提供了代码编辑、调试和打包应用的功能。编写完代码后,需要通过模拟器或实际设备进行测试。 "J2ME开发.pdf"可能包含...
**J2ME移动应用开发讲义** Java 2 Micro Edition(J2ME)是Java平台的一个子集,专为资源有限的嵌入式设备,如移动电话、PDA和家用电器设计。它允许开发者创建在这些设备上运行的应用程序,提供了一种跨平台的解决...
通过郭克华老师的J2ME课件与代码,学习者不仅可以掌握J2ME的基本概念和技术,还能了解到实际开发中的最佳实践,为开发自己的J2ME应用程序打下坚实基础。同时,配合视频教程,可以让学习更加直观和高效,帮助开发者...
这个压缩包包含的是一个关于J2ME手机应用项目开发实践的源代码集合,对于学习和理解J2ME应用程序的开发流程和技巧具有一定的参考价值。 在J2ME开发中,你需要了解以下核心概念: 1. **KVM(Java Virtual Machine ...
J2ME应用开发详解,主要是针对了J2ME这个模块的讲诉,里面的内容希望可以帮你解答疑惑。