1、寫在前面
本人是綜合了好幾個資料才最終制作成功,在這個過程中發現網上好多博客寫的步驟不是很詳細,因此就把自己的詳細制作步驟全部分享出來,可以供需要的小伙伴參考。
(1)本文檔不討論tpk文件的詳細含義和適用范圍,默認你已經有所了解,如果有不了解的可以先查看這個兄弟的博文【https://blog.csdn.net/zdw_wym/article/details/44225761】
(2)本文檔是使用已有的切片文件(ArcGIS-Server切片文件)來制作的,如果是這種情況,則可以適用本文檔的方法。
(3)如果你直接使用原始的矢量或影響文件來制作tpk的話,建議你直接使用ArcMap即可完成,不需要自己進行手動操作,具體方法可以參考這篇博文【https://www.cnblogs.com/xixihuang/p/6970508.html】
廢話不再多說,直接上最有用的。
2、具體制作步驟
第一步:文件下載/拷貝
下載(可以從類似於91衛圖的軟件上下載,下載時選擇ArcGIS-Server瓦片)/拷貝已經存在的切片文件,正確的格式如圖所示:。注:包含3個文件,后兩個是配置文件,第一個文件夾中存儲的是已經切好的圖片,按照不同的級別分文件夾存儲。如果是下載的這幾個文件,那么很有可能是“離散型”的,也就是一張張具體的圖片。【使用ArcMap制作的tpk文件解壓后在相同的文件夾里存儲的就不是圖片,而是關聯文件,因為ArcMap的切片使用的是“緊湊型”的方式】
第二步:制作Layers.lyr文件
(1)將第一步獲取的三個文件放在一個新建文件夾下,並且將新建文件夾重命名為“Layers”,記住,必須且只能是這個名字。
(2)然后打開ArcMap,加載下載好的切片文件到ArcMap中【在加載時可以注意到,當你選擇到Layers這個路徑級別時,數據加載窗口顯示的直接就是Layers文件,而不是原來的三個文件的形式,可見ArcGIS會自動將這3個文件索引為一個正確的Layer文件】,結果如圖:
記住,這一步在地圖框中一定要能正常顯示影像圖片,否則你獲取的這個切片文件就是不合格的,最終制作出來的tpk文件也不能正常顯示。
(3)選擇ArcMap的File菜單——MapDocumentProperties,在彈出框中勾選“保存相對路徑”的那個選項。
(4)在加載的圖層右鍵,選擇“另存為Layer文件”的選項,在彈出框中選擇路徑(這個路徑必須和你建立的那個Layers文件夾是同一級別),並且另存為的名字是“Layers.lyr”,這個也必須且只能是這個名字。
(5)退出ArcMap(mxd文檔不需要保存),可以看到你第一步建立的Layers文件夾的同一級目錄下,有一個Layers.lyr文件,如圖所示:。
第三步、制作v101文件夾
新建一個文件夾命名為“v101”(同樣,必須且只能是這個名字),將第五步得到的一個文件夾和一個*.lyr文件都放到v101下面。
第四步、制作esriinfo文件夾
(1)新建一個文件夾命名為“esriinfo”(必須且只能是這個名字),從其他制作好的tpk文件中拷貝兩個文件[item.pkinfo]和[iteminfo.xml]到esriinfo內(如果沒有,可以使用文章最后我的附件)。然后使用txt或者notepad++打開這兩個文件,按照如圖所示的方式修改文件的內容並保存,記住圖中紅色方框標記的地方必須保證唯一(同時保證兩個文件中的name和guid是一樣的),綠色方框的地方可以隨便寫,修改后保存文件。附圖:
和
第五步、制作tpk文件
(1)將前面制作的兩個文件夾esriinfo和v101進行壓縮打包,如圖:,這里文件的名字最好填寫的上一步xml文件中的一樣,壓縮的格式選擇ZIP(rar我第一次沒成功,后面沒再嘗試,其他小伙伴可以試一下rar,應該是能成功的),壓縮的方式選擇“存儲”,點擊確認等待壓縮完成。
(2)將上一步得到的壓縮文件的后綴修改為tpk,至此你便得到了一個可用的離線地圖包(*.tpk),你就可以隨心所欲的使用啦!
3、tpk文件使用(在C端使用,C#語言)
本文附帶的使用方法是使用C#在純C端程序中加載tpk格式的離線地圖包,具體的代碼如下:

1 private void btn_OpenTPK_Click(object sender, EventArgs e) 2 { 3 try 4 { 5 string lpPath_tpkSelf = @"C:\Users\Administrator\Desktop\aa\新建文件夾\selftpk\mytpk032601.tpk"; 6 string tmp = GetLayerFromTilePackage(lpPath_tpkSelf); 7 //注意,這里最終解析出來的路徑可能跟普通的有一點不同,有兩處多了反斜杠,但是這個ArcEngine解析的正常的格式,如果自己手工改動,反而不能正確加載tpk文件 8 ILayerFile ltFile = new LayerFileClass(); 9 ltFile.Open(tmp); 10 this.axMapCtrl_Main.Map.AddLayer(ltFile.Layer); 11 //this.axMapCtrl_Main.AddLayerFromFile(lpPath_tpkSelf);//另一種加載Layer的方式 12 this.axMapCtrl_Main.ActiveView.Refresh(); 13 } 14 catch(Exception error) 15 { 16 MessageBox.Show(error.Message,"錯誤"); 17 } 18 } 19 public string GetLayerFromTilePackage(string path) 20 { 21 if (System.IO.File.Exists(path) == false) 22 return null; 23 string unpackPath = ""; 24 IPackageFile pkFile = new PackageFileClass(); 25 pkFile.Unpack(path, ref unpackPath); 26 //Set the path for where the layerfile is located on disk 27 return unpackPath + @"\Layers.lyr"; 28 }
最重要的就是第二個方法中使用ArcEngine接口的兩行代碼,全指着他們呢。
附件(esriinfo參考):【https://files-cdn.cnblogs.com/files/qingtian-jlj/esriinfo.rar】
OK,到這里整個制作和使用流程就完全結束了。