轉:http://blog.csdn.net/mytudousi/article/details/33347249
什么是tpk文件
tpk是ArcGIS10.1推出的一種新的數據文件類型,主要是用於將切片文件打包形成離線地圖包,tpk可以在ArcGIS Runtime或者ArcGIS for Android/iOS中作為切片底圖被加載。
為什么要存在tpk文件
為什么要存在tpk文件,這個要從需求說起。例如我們要做一個ArcGIS for Android/iOS應用,現在手機的流量還是不便宜的,而且也是為了保證速度,希望把地圖數據打包到本地。其實也就是一些切片數據,tpk文件就可以做到。
再例如,ArcGIS API for WPF,該開發包只有幾M幾個dll。我們要做一個應用的話,只要顯示底圖數據,然后在這些底圖數據的基礎上做一個信息管理和定位工作。此時除了顯示底圖數據之外,不需要其他的復雜的GIS功能。ArcGIS API for WP提供的功能是很簡單的,從其dll包的大小也能看出來。去加載mxd嗎?ArcGIS API for WPF干不了這事,他要是能做的了,為什么還會有幾百M的ArcEngine呢。所以一把情況下都需要連接ArcServer服務,在ArcServer端,ArcServer會把ArcGIS API wpf請求轉換成圖片,返回給客戶端。客戶端API再負責顯示。這樣解析地圖數據的功能全在ArcServer端完成。既然ArcGIS RunTime API沒有解析地圖文件的功能,但是很容易加載圖片的,如果我們把切好的瓦片放在客戶端,這樣ArcGIS Runtime的api不用太大、不用太復雜就可以解析緩存數據,並展示出來。
tpk文件就是干這個的。
Tpk的用處
從上節我們就很容易了解了tpk文件的用處。就是把一些地圖緩存數據打包到客戶端。什么樣的項目會用到這些呢?
- 手機App
綜合流量和速度的問題,手機App完全可以使用這中方式。並且手機app一般沒有復雜的GIS功能,主要就是定位和展示。所以把底圖提前做成瓦片放在客戶端是一個很明智的選擇。
- ArcGIS API for WPF 做的弱GIS類型的項目
ArcGIS API for WPF可以展示ArcServer發布的地圖服務。而且ArcGIS Runtime內置了一個ArcServer,在我們部署的系統啟動時,通過代碼控制可以啟動內置的ArcServer。這樣我們就可以訪問ArcServer提供的功能了,使用起來和單獨部署的ArcServer一樣。也就是說理論上,ArcGIS API for WPF加上內置的ArcServer是可以完成很多GIS的功能的,包括較為復雜的GIS分析。當我們部署的時候,也會比較簡單,直接把生成的部署包拷貝到指定機器上,就可以直接運行。
但我們要注意到一點,這個內置的ArcServer並不是免費的。ArcGIS API for WPF是免費的。當我們做一個更簡單的CS系統時(GIS功能簡單),只包括底圖展示、定位等功能。那么我們要解決的問題就是如何加載底圖。因為ArcgIS API是不支持加載mxd的,既然是單機版,又不能訪問外部的ArcServer或其他地圖服務。這就需要tpk文件了,把底圖數據提前做成緩存,放在運行程序下面,就可以。而且這樣一來,系統不僅體積小,而且是ArcGIS這塊用到的都是免費的。
tpk的制作
使用ArcMap制作
如果你已經有了一個mxd文件,要做成tpk,就可以按照以下方法制作。
1、使用ArcMap打開mxd文件。
2、在菜單-File-Share as-Title Package,如下圖所示:
3、進入瓦片參數設置界面。
該界面有三個選項卡,第一個是基本信息,設置保存的路徑,第二個選項卡比重要,主要是設置瓦片的格式、分級方式以及切的級別。第三個選項卡就是一些描述信息。
4、最后點擊Share按鈕,即可以進入瓦片生成過程。這樣tpk瓦片文件就生成了。
使用已經切好的瓦片制作tpk文件
如果我們現在的數據不是mxd而是已經是做好的瓦片文件,那么怎么制作tpk文件呢?
其實.tpk文件就是一個壓縮文件,當我們把一個.tpk文件后綴名修改成.rar。然后解壓出來,就會發現能夠解壓成功,解壓出來的文件如下圖所示:
前兩個文件夾我們可能不大熟悉,里面都是一些配置信息,可以手工修改,這就不一一介紹了。因為我們現在還看不出來什么。當我們進入v101文件夾后,看下里面的內容:
再點開Layers文件夾
看到這個界面就比較熟悉了吧,這就是ArcServer緩存的結構,也就是說,把已有的緩存,組織成上述結構,壓縮成.rar,然后擴展名修改成,tpk就可以了。
如何加載tpk文件
下面我們就以ArcGIS API for WPF來看下如何加載放在本地的tpk文件。
- string myMpkFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "\\Data\\Map.tpk";
- this.Map.Layers.Add(new ArcGISLocalTiledLayer(myMpkFilePath));