利用ArcGIS-Server瓦片制作离线地图包(*.tpk)_详细流程
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,到这里整个制作和使用流程就完全结束了。