首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

Java 手機集成 Web 地圖服務 (WMS) 實現移動導航

     編輯:J2ME

1. 引言

LBS(基於位置服務)結合 GIS、無線定位、移動通訊,為用戶提供導航查詢。Java 手機(J2ME/MIDP)提供開放接口,成為移動 LBS 客戶端理想平台。作者開發的「個人導航系統」曾獲全國無線 Java 應用大賽優秀獎。本文介紹 J2ME 手機通過 GPRS 與 OGC WMS 服務集成獲取導航地圖的關鍵技術。

2. J2ME 手機獲取圖像對象

2.1 圖像創建與顯示

MIDP 1.0 僅支援 PNG。靜態圖像創建兩種方式:

  1. JAR 內資源:Image img = Image.createImage(String pngName); 受限於手機存儲(幾百 KB),難滿足 GIS 數據量,更新困難。
  2. 二進制數組:Image img = Image.createImage(byte[], int offset, int length); 數據來源靈活(網絡下載),便於動態更新。作者採用此方式。

2.2 WMS 動態生成地圖圖像

OGC 制定 WMS 標準(ISO 19128),提供三操作:GetCapabilities、GetMap、GetFeatureInfo。GetMap 依請求參數動態返回光柵圖(PNG/GIF/JPEG/SVG/WebCGM)。

請求示例:

https://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)。


圖 2:WMS GetMap 響應示例

3. J2ME 與網絡通訊

3.1 HTTP 協議支援

MIDP 網絡 API 定義於 javax.microedition.io.HttpConnection,擴展 ContentConnection,支援 URL 解析、請求頭設置、響應頭解析。可運行於 TCP/IP、WAP、i-Mode 等傳輸層之上。

3.2 請求 WMS 獲取 PNG 導航圖核心代碼

public class Untitled0 extends MIDlet implements CommandListener, ItemStateListener {
    Display display; Canvas canvas0;
    public Untitled0() {
        display = Display.getDisplay(this);
        canvas0 = new Canvas() {
            public void paint(Graphics g) {
                HttpConnection conn = null; byte[] data = null;
                try {
                    conn = (HttpConnection) Connector.open(
                        "https://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");
                    DataInputStream in = new DataInputStream(conn.openInputStream());
                    int len = (int) conn.getLength();
                    if (len < 1) len = in.available();
                    data = new byte[len];
                    in.readFully(data); in.close();
                    Image img = Image.createImage(data, 0, data.length);
                    g.drawImage(img, 0, 0, Graphics.LEFT | Graphics.TOP);
                } catch (IOException e) { e.printStackTrace(); }
            }
        };
        canvas0.addCommand(new Command("cmd", Command.SCREEN, 1));
        canvas0.setCommandListener(this);
    }
    public void startApp() { display.setCurrent(canvas0); }
    public void pauseApp() {}
    public void destroyApp(boolean u) {}
    public void itemStateChanged(Item item) {}
    public void commandAction(Command c, Displayable d) {}
}

4. 導航圖像資源本地存儲 (RMS)

利用 RecordStore (RMS) 永久存儲下載的圖像數據,避免重複請求:

RecordStore rs = RecordStore.openRecordStore("gis", true);
rs.addRecord(pngData, 0, pngData.length); // 寫入
// 讀取
byte[] gisData = rs.getRecord(1);
Image img = Image.createImage(gisData, 0, gisData.length);

再次訪問同一區域地圖時直接讀取本地 RMS,極大提升響應速度並節省流量。

5. 結語

Web 服務延伸至移動設備,實現移動端與 WMS 無縫集成,讓手機充分利用網絡 GIS 計算資源,快速構建輕量級 LBS/移動 GIS 導航核心功能。拋磚引玉,敬請指正。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved