ArcGIS Server的切图原理深入

摘要:
目前,所有WebGIS都使用缓存机制来提高地图访问速度。当客户端访问时,它直接获得所需的小图像,以将它们拼接成地图。在本文中,我们将进一步了解ArcGISServer当前用于地图服务的缓存(cut-map)的原理。创建映射缓存时使用的一系列参数的通用名称。默认情况下,它是mxd文档使用的坐标系的原点。对于不同的地图服务(mxd文档),切片范围只能是地图范围中tilingschemeorigin的右下角:

GoogleMap,Virtual Earth,YahooMap等,目前所有的WebGIS都使用了缓存机制以提高地图访问速度。原理都是将地图设定为多个比例尺,对于每个比例尺提前将地 图分成若干小图片,存在服务器上,客户端访问时直接获取需要的小图片拼接成地图,而不是由服务器动态创建出一幅图片来送到客户端,极大程度的提高了反问速 度。好比外面卖菠萝,和自己买一整个回家吃不同,提前把一个菠萝等分成四份(js可能会分成6份),你只需买一份来吃,体积小,方便吃,而不是对着整个菠 萝咬下去,弄一脸菠萝汁。 本文中来详细了解一下ArcGIS Server目前为地图服务建立缓存(切图)的原理。先来了解一个概念: Tiling Scheme:创建地图缓存时使用的一系列参数的总称。包括比例尺级别,图片格式,图片大小等等。 Tiling Scheme Origin:是tiling scheme grid的左上角。默认情况下就是由mxd文档使用的坐标系的原点。而切图的范围通常是mxd文档中full extent的范围,即从full extent的左上角(map origin)到右下角。注意区分map origin与tiling scheme origin。 ArcGIS Server的切图原理深入第1张 对于不同的地图服务(mxd文档),如果使用相同的坐标系,那么就有相同的tiling scheme origin,即使他们的full extent不同(map origin不同),也能处于同一参考系中。如果full extent相同,则可以轻松地叠加在一起,这也是tiling scheme origin设计的初衷。默认情况下,切图的范围是mxd文档的full extent。如果手工设置了tiling scheme origin,那么切图的范围只能是地图范围中tiling scheme origin右下角的部分:如果tiling scheme origin在map origin的左上角,那么切图范围还是full extent;如果tiling scheme origin落在地图中,那么切图的范围就是从tiling scheme origin到full extent的右下角。这也就是为什么建议通过设置特定的矩形范围(92中)或直接使用featureclass(93中)来改变切图范围,而不是利用 tiling scheme origin来限制切图范围的原因。 那么地图到底是怎么切出来的?切多少块呢?通过一个例子深入浅出吧。一个中国地图,采用了自定义的坐标系: ArcGIS Server的切图原理深入第2张 切图时设置如下: ArcGIS Server的切图原理深入第3张 看看切图完成后的文件夹结构: ArcGIS Server的切图原理深入第4张 在缓存目录中,首先是地图服务命名的文件夹china;之后是切图的DataFrame命名的文件夹Layers;由于采用的是fused方式,下来就是 _alllayers,如果是multi-layer切图,那么就是每个图层的序号文件夹;下来就是切图设置的多个比例尺级别(Level of Detail,LOD),从小到大,对应前面设置的5个比例尺;一个比例尺文件夹下,是切图的“行”文件夹,命名规则是R加上8位行号(16进制),不足 补0。比如图中的R0000000a,表示此比例尺中第10行(16进制中的a);每行文件夹下就是该行的所有tile文件了,命名规则是C加上8位列号 (16进制),不足补0。为什么这个比例尺下(L01)中只有8,9,10,11行呢?前面说过切图的范围是full extent,说明在该比例尺下,从tiling scheme origin算起,中国地图的范围只占到了这几行,其余没有,不切。同理,对于上面的第九行文件夹中,只有7,8两列,其余的没有,不切。 再打开和_alllayers文件夹同级的conf.xml看看吧,里面保存了整个tiling scheme参数。 ArcGIS Server的切图原理深入第5张 可以看出地图服务使用的坐标系信息,tile图片的DPI(96),每个tile的长度和宽度(512),以及tiling scheme origin。 现在来计算某个比例尺中,地图上一个点所在的tile图片的行列号了。比如计算L01中,乌鲁木齐市所在tile的行列号。需要收集三个信息: 1、获得乌市的地理坐标:在本地图中是x=-1341070,y=5343697; 2、获得tiling scheme:x=-35331700,y=46619300; 3、获得当前比例尺的resolution,即一个像素所占的地图单位长度:在L01比例尺上是8466.68360003387。 ArcGIS Server的切图原理深入第6张 乌市所在的行号:(35331700-1341070)/(8466.6836*512)=7.84=8 乌市所在的列号:(46619300-5343697)/(8466.6836*512)=9.52=10 所以乌鲁木齐在切图的第二个比例尺中,处于第10行,第8列的tile。 ArcGIS Server的切图原理深入第7张

转载请注明出处,有技术问题,欢迎互相交流,或者留言.
________________________________________________________________________________________________
分类: Flex ArcGis2013-03-13 15:38 170人阅读 评论(0) 收藏 举报

一:切片规则

        ArcGIS Server的切图原理深入第8张

在同一个坐标系下面,切片原点默认是相同的,当然,这个起点在切片时候可以自己设置。

但是,地图的起点是不相同的,范围不一样。假如两个mxd的地图起点坐标一致且在同一个坐标系下,则,这两个切片可以完美的重叠在一块。开始我也奇怪为什么切片的原点不是地图起点而是坐标原点?从坐标原点开始切图会不会切很多无用的数据,因为地图范围没在哪里,无数据?答案是:以一个统一的点位起始点,在同一个坐标系下不同范围的地图切片可以完美的拼接在一起,这些都是提前规划好的。至于不在地图起点范围内的地方,在切片时候回忽略,不切,不会浪费资源。

每个切片由:层级、行号、列好唯一确定,就是一些算法。

         二:配置文件config.xml

                   切片缓存都对应有一个配置文件,里面详细描述了缓存切片的信息,在读取缓存时候,也是先要读取配置信息后,然后才能读到正确的图片。

        ArcGIS Server的切图原理深入第9张

里面包含坐标信息、切片坐标原点、切片大小等信息;

ArcGIS Server的切图原理深入第10张

就是切片坐标原点,是计算切片行列好的起点。

ArcGIS Server的切图原理深入第11张

 

LOGInfos是每个层级切片信息,ID是层级,Scale是比例尺大小,Resolution是当前比例尺层级下切片的每个像素点代表的实际长度;

ArcGIS Server的切图原理深入第12张

 

TileImageInfo为切片描述,依次为格式,透明度、抗锯齿;

CacheStorageInfo为切片的存储格式描述。esriMapCacheStorageModeCompact说明切片存储方式为紧促方式,128表示每个数据包中最多存放的切片数量。

 

三:行列计算

    一个简单的计算题,已知起点坐标,并且按照起点坐标将地图坐标划分为均等的N块。并且知道每个小块的像素大小,以及每个像素代表的长度,求地图上任意一点的某个级别下的行列号?

    假设要求的点的坐标为P(X,Y),现在求其在第一级别下的行列号。

    切片原点坐标(-20037508.342787001,20037508.342787001);

    第一级下每个像素的长度:2116.670900008467;

    每个切片的大小为256*256像素;

    得每个切片代表的宽度距离为256*2116.670900008467;

    丛原点开始一行排列到P点,行号基于高度计算;

    故P点所在的行号:(20037508.342787001-P.Y)/(256*2116.670900008467)

    故P点坐在的列号:(-20037508.342787001-P.X)/(256*2116.670900008467)

         算出来可能会有负值,对结果取整,求绝对值,就是P所在的行列号。

 ArcGIS Server的切图原理深入第13张

免责声明:文章转载自《ArcGIS Server的切图原理深入》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python字符编码、字符串格式化、字符串方法、列表、元组、字典、集合等基础知识总结mysql timestamp类型 根据当前时间戳更新下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#高级编程笔记(22至25章节)文件注册表权限事务

22安全(using System.Security.Principal;) AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);//当前线程用户 var principal = WindowsPrincipal.Current as WindowsPri...

Pivot Table系列之切片器 (Slicer)

1. 遇到的问题: 在Excel中,用PivotTable来做数据报告展示: 问题1:在同一个Sheet页里,多个PivotTable如何实现同步刷新? 问题2:在不同Sheet页之间,多个PivotTable如何实现同步刷新? 2. 前提介绍 在同一个Sheet页里面,有两个PivotTable,数据源在同一个模型中,维度相同,由于种种原因(不同的度量值...

WPF中引入外部资源

有时候需要在WPF中引入外部资源,比如图片、音频、视频等,所以这个常见的技能还是需要GET到。 第一步:在VS中创建一个WPF窗口程序 第二步:从外部引入资源,这里以引入图片资源为例 1)新建Resources文件夹,右键点击项目,选择添加,选择新建文件夹,重命名为Resources 2)将所需的资源如图片,放在Resources文件夹下面,双击Reso...

Android百度地图的使用

    做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需求需要使用百度地图的一些功能,所以这几天研究了一下,现写一下blog记录一下,欢迎大家评论指正! 一、申请AK(API Key)     要想使用百度地图sdk,就必须申请一个百度地图的api key。申请流程挺简单的。     首先注册成为百度的开发者,然后打开http://...

百度地图API图标、文本、图例与连线

百度地图开放平台功能强大,使用简单,为地图的自定义提供了非常方便的途径! 本文以绘制一张全国机器辐射图为例记录其基本使用方法,效果如下图: 图中包括了带图标和文本的标注,连线以及图例。 1.关于坐标 说到地图,不得不说坐标。 我以为,GPS获取经纬度之后,把经纬度丢给地图就可以了。但那真的是自以为。 1.1 坐标系 来看看实际情况,以下是百度开发文档里的...

js中实现高德地图坐标经纬度转百度地图坐标

1 function tobdMap(x, y) { 2 var x_pi = 3.14159265358979324 * 3000.0 / 180.0; 3 var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi); 4...