ArcGIS for Server 10.3.X 新型紧凑型缓存的解读和应用

  早在2010年年底,牛魔王中王在其博客空间牛魔王的作坊中对ArcGIS 10中推出的紧凑型缓存格式进行了详细的解读,详见《ArcGIS 切片缓存紧凑文件格式分析与使用》。紧随着的4年时间里,ArcGIS for Server本身经历了10、10.1.X和10.2.X各版本的逐级更替,特别是软件架构发生了显著的变化。然而,就紧凑型缓存本身而言,牛魔王中王的解读一直都是适用的。衷心地向我们的大牛致敬!

  直到2014年年底ArcGIS 10.3正式发布,Esri才推出了新的紧凑型缓存格式以增强用户的访问体验。新的缓存格式下,关键的差别在于Esri将缓存的索引信息.bundlx包含在了缓存的切片文件.bundle中。

  接下来,我们就简单解读一下这一新型的紧凑型缓存格式。俗语说,万变不离其宗。既然缓存文件夹下仅包含了bundle文件,可以想见,切片的索引,切片的偏移和切片的图片流都必然包含在这一文件中。根据经验,缓存本身遵循的是16进制的形式。依照这一思路,利用UltraEdit打开bundle文件并以16进制格式进行查看。

 为了便于分析,我们先创建一个在L00级只包含一个切片的缓存服务,并在UltraEdit中以16进制格式查看L00级下的R0000C0000.bundle文件。

  通过对这一文件中信息存储规律的分析,可初步得出如下结论:(1) 文件中包含大量04 00 00 00 00 00 00 00的16进制字节组,共计16893组;(2) 文件中仅包含一个PNG24的文件头字节组89504E47,即第一行第一列的切片,bundle文件中唯一的一张图片。图片流紧随(1)中所提到的字节组之后,但偏移4个字节;(3) (2)中所述的4字节偏移量的数值恰等于图片流的长度;(4) 文件第5行的起始4个字节44 00 02 00按照低位到高位换算出的数值等于131140,这一值与(2)中所述的PNG文件头位置恰恰吻合。

  综上分析:(1)起始4行是bundle的文件头信息,可忽略;(2)bundle的文件头之后记录了16384张切片的切片位置,仅4字节,从低位到高位,后4字节可忽略;(3)位置信息之后,对于切片的记录,先以4字节记录切片的长度,而后紧跟图片流信息。到此,bundle结束。

  下一步呢,我们将选择一个狭长的矩形面要素发布服务并切图,以分析行列切片在bundle文件中的具体存储规律。

  通过对bundle文件和对应的松散缓存在L02级别上的对比,可推断:(1)bundle中索引的存储是按行依次存储,即第1行的1至128,第2行的1至128,以此类推,直至最后一张切片即第128行128列;(2)bundle中图片流的存储仅包含非空切片。此外,通过对这一更复杂的地图缓存的分析,再次论证了前面的推论。

  既然上述的分析完毕,接下来就要对上述的分析进行一番验证啦。这里呢,我会利用ArcGIS Runtime SDK for Android实现抽象理论的实践工作。本次验证的核心在于,通过对TiledServiceLayer进行扩展,按照上面的存储推论覆写getTile(int mLevel, int mColumn, int mRow)方法。

  第一步,根据参数中的比例级别、列号和行号定位到Bundle文件。

 1     String level = Integer.toString(mLevel);
 2     int levelLength = level.length();
 3     if(levelLength == 1){
 4         level = "0" + level;
 5     }
 6     level = "L" + level;
 7
 8     int rowGroup = 128*(mRow/128);
 9     String row = Integer.toHexString(rowGroup);
10     int rowLength = row.length();
11     if(rowLength < 4){
12         for(int i=0; i<4-rowLength; i++){
13             row = "0" + row;
14         }
15     }
16     row = "R" + row;
17
18     int columnGroup = 128*(mColumn/128);
19     String column = Integer.toHexString(columnGroup);
20     int columnLength = column.length();
21     if(columnLength < 4) {
22         for(int i=0; i<4-columnLength; i++){
23             column = "0" + column;
24         }
25     }
26     column = "C" + column;
27
28     String bundleName = String.format("%s/%s/%s%s", compactTileLoc, level, row, column) + ".bundle";

  第二步,读取bundle文件,根据前面分析中所推断出的切片的起始位置和切片的长度获取对应的切片并返回。

 1     int index = 128*(mRow - rowGroup) + (mColumn-columnGroup);
 2
 3     RandomAccessFile isBundle = new RandomAccessFile(bundleFileName, "r");
 4     isBundle.skipBytes(64 + 8*index);
 5
 6     //获取位置索引并计算切片位置偏移量
 7     byte[] indexBytes = new byte[4];
 8     isBundle.read(indexBytes, 0, 4);
 9     long offset = (long)(indexBytes[0]&0xff) +(long)(indexBytes[1]&0xff)*256 + (long)(indexBytes[2]&0xff)*65536
10                     + (long)(indexBytes[3]&0xff)*16777216;
11
12     //获取切片长度索引并计算切片长度
13     long startOffset = offset - 4;
14     isBundle.seek(startOffset);
15     byte[] lengthBytes = new byte[4];
16     isBundle.read(lengthBytes, 0, 4);
17     int length = (int)(lengthBytes[0] & 0xff) + (int)(lengthBytes[1] & 0xff)*256 + (int)(lengthBytes[2] & 0xff) * 65536
18                 + (int)(lengthBytes[3] & 0xff) * 16777216;
19
20   //根据切片位置和切片长度获取切片
21     ByteArrayOutputStream bos = new ByteArrayOutputStream();
22
23     byte[] tileBytes = new byte[length];
24     int bytesRead = 0;
25     if(length > 0){
26         bytesRead = isBundle.read(tileBytes, 0, tileBytes.length);
27         if(bytesRead > 0){
28             bos.write(tileBytes, 0, bytesRead);
29         }
30     }
31
32     tile = bos.toByteArray();

  呵呵,成功实现。直接奉上Android端的显示效果吧。

  

Tips:

  关于紧凑型切片,唠唠叨叨的我还是忍不住要嘱咐几句:(1)新型的紧凑型切片无法被直接用于先前版本的ArcGIS for Server;(2)新型的紧凑型切片可通过导出切片即export tiles获取先前格式的缓存;(3)老版本的紧凑型切片可直接在新版本的ArcGIS for Server中复用,但可通过升级存储格式即Upgrade Storage Format更新为新型紧凑型切片格式。

时间: 2024-11-19 04:58:08

ArcGIS for Server 10.3.X 新型紧凑型缓存的解读和应用的相关文章

ArcGIS for Server 10.2 发布Feature Service

折腾一下午,终于把自带的例子发布成Feature Service了,这样就可以通过web编辑了.记录一下步骤. 环境:已经安装好SQL Server 2008 R2,ArcGIS for Desktop 10.2,ArcGIS for Server 10.2,ArcSDE 10.2 for SQL Server 2008 准备工作: 1.创建Geodatabase,参考http://www.cnblogs.com/oceanking/p/3892584.html 2.添加一个数据库连接.在GIS

安装并破解ArcGis for Server 10.2

1.安装: 下载ArcGis for Server 10.2 是一个iso文件,可以解压安装或用Daemon Tools安装. 挨个点Setup安装. 2.破解: 下载授权许可文件,或使用keygen生成许可文件.然后用 开始->程序->ArcGis->ArcGis for Server->Software Authorization 导入许可文件. 但是一般的许可文件都不包含Portal for ArcGis的破解,找了半天没有找到,下午自己把它破解掉了.原理就是修改licens

[转]arcgis for server 10.2 下载及安装

转自:https://blog.csdn.net/nominior/article/details/80211963 https://blog.csdn.net/mrib/article/details/76996193 文章分为: 0. 参考资料 1.笔者软件环境 2.所需资源及下载地址 3.安装过程 4.网站创建 5. ArcGIS Server Manager无法进入问题的部分解决方案 0.参考资料https://blog.csdn.net/mrib/article/details/769

[ ArcGIS for Server 10.1 系列 ] - 重新创建Site

一般当ArcGIS Server Site发生错误.ArcGIS Server无法启动或者ArcGIS Server某服务没有实例,就可能需要重新的创建Site.有时可以通过重新创建Site,就发现其能GIS功能容器ArcGIS Server的问题. 以下以单机部署ArcGIS Server为例,多机部署ArcGIS Server情况类似. 1.删除已经存在的Site 进入http://localhost:6080/arcgis/admin/ 选择ArcGIS Server提供的deleteSi

ArcGIS for Server 10.2 开启GeometryService

过程非常简单,所以网上文档比较少. 打开网站管理页面: http://localhost:6080/arcgis/manager/ 点左边Utilities 再点击Geometry右侧的三角形“启动”,即可完成. 本地默认地址为: REST URL: http://localhost:6080/arcgis/rest/services/Utilities/Geometry/GeometryServer SOAP URL: http://localhost:6080/arcgis/services

2014Esri全球用户大会之ArcGIS for Server&amp;Portal for ArcGIS

1.ArcGIS10.3 for Server新特性 相当多! 首先,ArcGIS 10.3版本为GIS和地图在组织内传递带来了非常令人兴奋的新功能. 很大程度上,这意味着带来了更多的apps.ArcGIS for Server带来的这些即拿即用的apps,可以令人们更好的转变工作方式. 更多更好的HTML web应用:ArcGIS 10.3带来更多可配置.即拿即用的web应用模板.这些模板能在几分钟内利用手中的数据进行配置,快速的进行地图配置.ArcGIS10.3 for Server包含一个

ArcGIS for Server内置JS Viewer的离线部署和配置

很多情况下,在地图服务发布完毕后,我们往往利用 ArcGIS for Server内置的 JS Viewer来查看和检测所发布的地图服务是否满足我们的要求.具体操作如下: 点击开始 -> 所有程序 -> ArcGIS -> ArcGIS for Server -> Services Directory 或直接在浏览器地址栏中键入 http://ip:6080/arcgis/rest打开ArcGIS for Server的Service Directories页面,选中并点击要查看的

ArcGIS for Sever 10.1 服务迁移与恢复

=== 声明:以下内容本是自己写给单位内部同事的参考手册,但是被传到百度文库中.陆续有用户就这方面的问题,通过电话,邮件等方式联系我.首先,感到荣幸.其次是,由于本人当时测试和编写的时候,由于仓促,可能有存在着缺陷的地方.如果大家在实际的工作中,按照这个方式出现问题或者想和我交流的话,请在该文章下面留言,尽量回复大家.最后,个人不代表单位,也不代表官方. 该文章百度文库的连接如下: 我是度娘 下面的内容与文库有点不一样,修改了诸如图片序列,错别字等低级错误. === 在实际的工作环境中,服务的备

arcgis server 10.1 发布动态图层展示海量及频繁更新的数据步骤

转自原文 arcgis server 10.1 发布动态图层展示海量及频繁更新的数据步骤 Arcgis server  发布动态图层及调用动态图层 做这个动态图层功能的原由是 有一个30万的数据需要通过arcgis GP工具转成shp然后渲染加载进地图,原来的做法是遍历生成shp面要素,读取面的环状点然后转成json,这个也能实现结果但是时间较长,与预期的时间差别较多,在公司内部讨论时有提到这个动态图层可以解决海量频繁数据的替换,要是每个都发一个图层服务这样不可取.故此讨论后研究这个神奇的功能.