LBS(基於位置服務)結合 GIS、無線定位、移動通訊,為用戶提供導航查詢。Java 手機(J2ME/MIDP)提供開放接口,成為移動 LBS 客戶端理想平台。作者開發的「個人導航系統」曾獲全國無線 Java 應用大賽優秀獎。本文介紹 J2ME 手機通過 GPRS 與 OGC WMS 服務集成獲取導航地圖的關鍵技術。
MIDP 1.0 僅支援 PNG。靜態圖像創建兩種方式:
Image img = Image.createImage(String pngName); 受限於手機存儲(幾百 KB),難滿足 GIS 數據量,更新困難。Image img = Image.createImage(byte[], int offset, int length); 數據來源靈活(網絡下載),便於動態更新。作者採用此方式。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)。

MIDP 網絡 API 定義於 javax.microedition.io.HttpConnection,擴展 ContentConnection,支援 URL 解析、請求頭設置、響應頭解析。可運行於 TCP/IP、WAP、i-Mode 等傳輸層之上。
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) {}
}
利用 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,極大提升響應速度並節省流量。
Web 服務延伸至移動設備,實現移動端與 WMS 無縫集成,讓手機充分利用網絡 GIS 計算資源,快速構建輕量級 LBS/移動 GIS 導航核心功能。拋磚引玉,敬請指正。