程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> Java手機與空間制圖服務(WMS)應用集成

Java手機與空間制圖服務(WMS)應用集成

編輯:J2ME
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核心的導航地圖的顯示功能。

  本文旨在"拋磚引玉",不足之處,敬請各位同行指正。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved