Android軟體開發,對於地圖軟體,是怎麼載入圖片的呢?
在地圖界面上滑來滑去,如果不作處理肯定很快就OOM了。那應該怎麼處理才好呢?
當然我是說實現原理,不是LruCache等第三方的怎麼用……另外,整個地圖界面是由什麼View拼出來的呢?ImageView?
李毅 邀請你回答此問題 ? 忽略邀請。
最近正在做一些地圖相關的事情,
前面匿名的那位前輩已經總結的很好了,肥肥在這裡廢話一下,希望能夠拋磚引玉。
目前手持設備上的地圖顯示方式有兩種:
- 瓦片地圖
- 矢量地圖
瓦片地圖,是一種金字塔結構的多解析度層次模型,從瓦片的金字塔結構底層到頂層,解析度會越來越低,但是表示的地理範圍是不變的。瓦片地圖技術是將配置好的一定坐標範圍內的地圖,按照固定的多個比例尺以及指定的瓦片圖片尺寸,在切片伺服器上切成若干行及列的正方形圖片,並以指定的圖片格式按照統一的命名規範進行關係存儲,由此形成金字塔地圖結構的靜態地圖緩存。
對於瓦片地圖是如何工作的,敬請移步 : How do web maps work?
目前主流的地圖服務商,百度地圖、Google地圖、高德地圖等,室外地圖一般都是採用瓦片地圖的方式(也有例外)。而開源地圖項目 https://www.openstreetmap.org/ OpenStreetMap 以及MapBox Mapbox 都提供了很不錯的 Android客戶端瓦片地圖渲染的實現,有興趣的可以研究一下。
以上信息參考: 與GeoServer瓦片生成有關的切片原理
對於矢量地圖,使用的是基於XML的SVG文件進行地圖的描述與渲染。矢量圖使用直線和曲線來描述圖形,這些圖形元素往往是一些點、線、矩形、多邊形、圓和弧形,他們都是可以通過數學計算獲得的。所以矢量圖的文件體積相對較小,比較適合網路環境不好的情況下傳輸。當然,使用矢量地圖最主要的原因應該是矢量圖無論放大縮小、旋轉等都不會失真的特性。當然,矢量地圖的缺點在於,其難以表達色彩層次豐富的近乎逼真的圖像效果。
目前高德推出了基於矢量圖渲染的室內地圖解決方案。
插播一下廣告:肥肥他們公司 墨軌跡 的室內定位解決方案真的棒棒噠。哈哈,終於遇到一個我有所涉獵的問題了 。先說當前大家常用的地圖,比如百度,高德這些,他們是怎麼做的。
底層實現不是純java的,而是使用了類似opengl的技術,比如可能是osg這樣的開源圖像處理系統,也就是說是c/c++來做的底層,java的存在只是作為外部調用的介面。這也是為什麼在做百度高德的二次開發時,你除了使用對方的jar包外,還有一些so庫。至於他們使用的view已經不那麼重要了,反正要底層實現,用surfaceview就可以了。
這些地圖的矢量地圖是由矢量數據符號化以後繪製出來的,而不是由我們在pc端瀏覽的地圖那樣的瓦片來繪製的,這一點,你在接觸天地圖的apk以後,會有明顯的感覺。當然衛星地圖還是來自瓦片數據。三維地圖則是載入相應的三維數據了,因為opengl本來就是三維領域的王者。然後說一下純java開發地圖應用的模式——我們以前就是用這個的。這類地圖是使用瓦片的,一張張的圖片拼接起來的,所使用的控制項就是surfaceView或者GLSurfaceView,這一類的開源項目也有很多,比如decarta,所使用的方式就是用以LRU方式緩存圖片,然後繪製在surfaceView上。至於題主所擔心的OOM的問題,我只能說要看目標設備和代碼的優化情況了。TileView
兩個選擇:1. 把圖片分割成一格一格,只載入當前屏幕會顯示的部分,每個tile移出屏幕或者縮放級別變了就直接回收掉。2. 用矢量圖,內存中保存道路的折線和建築的輪廓,然後直接在canvas上畫。大多數地圖應該是用的矢量圖,但衛星地圖肯定是一格一格載入的。
拿百度地圖為例吧,它用的是矢量,不是圖片,但這種矢量是按網格裁剪過的,載入的時候類似瓦片那樣一塊塊地載入矢量,同時這裡的矢量也是經過壓縮的,所以數據量很小,再結合非同步載入,實時繪製,載入快就很好理解了從專業GIS角度來說,顯示速度最快的移動GIS開發平台就是UCMap,矢量地圖不用裁剪,不用壓縮,依然擁有非常流暢的顯示速度,這其中作了大量的底層優化
題主可以看看osmdroid的實現,osmroid是用純java實現的地圖控制項,地圖使用的是256*256的瓦片地圖,顯示時只載入屏幕部分的瓦片,不可見部分的瓦片及時回收,這樣不會消耗多少內存,跑起來性能也不錯,很少碰到OOM的情況。Osmdroid的View繼承的是ViewGroup,瓦片根據Scroll的距離直接繪製在Canvas相應的位置,至於位置怎麼對應,可以看網上的資料。早期的百度和高德地圖也用的是瓦片地圖,不過百度地圖的切片規律和osmdroid不太一樣。現在的百度和高德,我個人猜測用的是矢量地圖,底層通過opengl es進行繪製。我個人用過的最強大的地圖控制項應該算是arcgis runtime for android了,它支持的地圖格式比較多,包括在線和離線,也支持不同坐標系和投影的地圖,arcgis for android用的是opengl es 2.0在底層用c++進行繪製的
推薦閱讀:
※如何看待「一年可以成長為全棧工程師」觀點?
※想從事遊戲開發應做哪些準備?
※為什麼 iOS 外包價格很低?怎麼樣找到有外包需求的人?
※迄今為止押寶多核的策略幾乎都失敗了,為什麼開發者如此抵觸多核?
※Qt Creator和codeblocks相比,哪個更好用?
TAG:軟體開發 | Android開發 | Android | android軟體 | Android開發諮詢 |