android端實(shí)踐openlayers離線地圖

筆者最近實(shí)踐了利用openlayers在android app中實(shí)現(xiàn)離線地圖應(yīng)用,本文記錄了筆者實(shí)踐的思路。

android端移動地圖功能設(shè)計:

1、加載本地的地圖瓦片;
2、GPS定位;
3、疊加部件(矢量)圖層;

準(zhǔn)備工作

android端用webview加載在線頁面或離線的html頁面都是沒問題的,同時,android原生與JS之間可以互相調(diào)用。這一部分不是本文的重點(diǎn),參考資料如下:

  1. Android與HTML+JS交互入門 android原生與JS之間互相調(diào)用的例子
  2. android 與JS之間的交互 WebView加載本地資源的小結(jié)
  3. Android WebView 與JS的數(shù)據(jù)交互 如何將css js 圖片等靜態(tài)資源部署在APP中
ol如何加載手機(jī)端本地地圖瓦片

筆者想到ol加載地瓦片地圖時,可以用tileUrlFunction返回一個瓦片的鏈接,例如:

        tileUrlFunction: function (tileCoord, pixelRatio, proj) {
                        var z = tileCoord[0] + 11;
                        var x = tileCoord[1];
                        var y = -tileCoord[2] - 1;
                        return "http://www.dzmap.cn/OneMapServer/rest/services/vector_service/MapServer/tile/" + z + "/" + y + "/" + x;
                    }
  • tileUrlFunction返回一個地圖瓦片的路徑,ol請求瓦片并渲染。如果在此步驟將請求服務(wù)端的瓦片改為請求Android本地的資源,是否可行?
  • android端本地?zé)o法提供一個http路徑,我想到了用base64將圖片編碼的方式返回給ol,測試證明這是可行的。
  • 那么加載本地瓦片就簡單了,下載地圖瓦片并組織好存儲路徑,tileUrlFunction中調(diào)用android原生的方法獲取對應(yīng)xyz的瓦片,然后用base64編碼后,返回給ol。
  • 進(jìn)一步改進(jìn),用文件方式存儲地圖瓦片比較浪費(fèi),就想到了用sqlite mbtile方式存儲瓦片。筆者在之前的地圖瓦片下載工具基礎(chǔ)上,增加了輸出sqlite mbtile的功能,點(diǎn)擊下載。
  • MBTile相關(guān)介紹:
    官方介紹
    MBTiles移動存儲簡介
  • 通過測試,發(fā)現(xiàn)用base64編碼后的瓦片,ol的緩存功能貌似不好使了,查了一些資料,提到用base64編碼后,就無法用到瀏覽器緩存了。沒關(guān)系,在android端用Lrucache做緩存,也能很好的解決此問題。

實(shí)現(xiàn)GPS定位功能

  • JS調(diào)用android原生獲取GPS定位坐標(biāo),android端可以用原生的GPS定位,或使用baidu sdk,返回當(dāng)前位置坐標(biāo)。
  • 為防止獲取GPS位置時有較長的等待,筆者推薦用異步的方式。即,由JS調(diào)用Android端獲取GPS位置,android啟用異步方式獲取當(dāng)前位置,并立即返回;當(dāng)Android端獲取到位置后,回調(diào)JS端,傳遞當(dāng)前位置給OL,ol標(biāo)注當(dāng)前位置。

疊加部件(矢量)圖層

  • 與上述加載本地瓦片類似,事先預(yù)處理好矢量圖層,用spatialite(基于sqlite的空間數(shù)據(jù)庫)存儲矢量部件圖層,建好空間索引;
  • ol注冊map.moveend事件,請求當(dāng)前可視范圍的矢量數(shù)據(jù);
  • 這里應(yīng)該還可以用矢量瓦片來替代,還沒來及實(shí)踐。

本文獻(xiàn)給大連機(jī)場,感謝您延誤航班,使我有時間有耐心寫完本文,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容