1, 写在前面
本人是综合了好几个资料才最终制作成功, 在这个过程中发现网上好多博客写的步骤不是很详细, 因此就把自己的详细制作步骤全部分享出来, 可以供需要的小伙伴参考.
(1)本文档不讨论 tpk 文件的详细含义和适用范围, 默认你已经有所了解, 如果有不了解的可以先查看这个兄弟的博文[https://blog.csdn.net/zdw_wym/article/details/44225761]
(2)本文档是使用已有的切片文件 (ArcGIS-Server 切片文件) 来制作的, 如果是这种情况, 则可以适用本文档的方法.
(3)如果你直接使用原始的矢量或影响文件来制作 tpk 的话, 建议你直接使用 ArcMap 即可完成, 不需要自己进行手动操作, 具体方法可以参考这篇博文[http://blog.sina.com.cn/s/blog_690892850101iudv.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 格式的离线地图包, 具体的代码如下:
- private void btn_OpenTPK_Click(object sender, EventArgs e)
- {
- try
- {
- string lpPath_tpkSelf = @"C:\Users\Administrator\Desktop\aa \ 新建文件夹 \ selftpk\mytpk032601.tpk";
- string tmp = GetLayerFromTilePackage(lpPath_tpkSelf);
- // 注意, 这里最终解析出来的路径可能跟普通的有一点不同, 有两处多了反斜杠, 但是这个 ArcEngine 解析的正常的格式, 如果自己手工改动, 反而不能正确加载 tpk 文件
- ILayerFile ltFile = new LayerFileClass();
- ltFile.Open(tmp);
- this.axMapCtrl_Main.Map.AddLayer(ltFile.Layer);
- //this.axMapCtrl_Main.AddLayerFromFile(lpPath_tpkSelf);// 另一种加载 Layer 的方式
- this.axMapCtrl_Main.ActiveView.Refresh();
- }
- catch(Exception error)
- {
- MessageBox.Show(error.Message,"错误");
- }
- }
- public string GetLayerFromTilePackage(string path)
- {
- if (System.IO.File.Exists(path) == false)
- return null;
- string unpackPath = "";
- IPackageFile pkFile = new PackageFileClass();
- pkFile.Unpack(path, ref unpackPath);
- //Set the path for where the layerfile is located on disk
- return unpackPath + @"\Layers.lyr";
- }
- View Code
最重要的就是第二个方法中使用 ArcEngine 接口的两行代码, 全指着他们呢.
附件(esriinfo 参考):[https://files-cdn.cnblogs.com/files/qingtian-jlj/esriinfo.rar]
OK, 到这里整个制作和使用流程就完全结束了.
来源: https://www.cnblogs.com/qingtian-jlj/p/10617967.html