ArcGISServer动态生成缓存及地图切片技术

上传人:工**** 文档编号:469907971 上传时间:2023-08-24 格式:DOC 页数:7 大小:62KB
返回 下载 相关 举报
ArcGISServer动态生成缓存及地图切片技术_第1页
第1页 / 共7页
ArcGISServer动态生成缓存及地图切片技术_第2页
第2页 / 共7页
ArcGISServer动态生成缓存及地图切片技术_第3页
第3页 / 共7页
ArcGISServer动态生成缓存及地图切片技术_第4页
第4页 / 共7页
ArcGISServer动态生成缓存及地图切片技术_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《ArcGISServer动态生成缓存及地图切片技术》由会员分享,可在线阅读,更多相关《ArcGISServer动态生成缓存及地图切片技术(7页珍藏版)》请在金锄头文库上搜索。

1、ArcGIS Server动态生成缓存及地图切片技术引于地下室的流星雨”,由dongfengyee (东风雨)整理使用ArcGIS Server做地图发布,为了提升浏览性能,通常会使用现时比较 流行的地图缓存技术(通俗的说法为“瓦片技术”)。如目前的MapAB(和GoogleMap正是使用该技术。所谓的地图缓存技术,就是按照一定的数学规则,把地图切成一定规格的图 片保存到计算机硬盘里,当用户通过客户端浏览器访问地图服务时, 服务器直接 返回当前地图坐标区域所对应的“瓦片”, 从而达到降低服务器负担,提升地图 浏览速度的效果。地图缓存技术一般针对相对稳定的数据,因为地图切为瓦片以后,以图片的形式

2、存在,对于数据的变化(这里指的是数据的几何形状变化) 不能及时的反应, 这就是地图缓存技术不足之处。要想地图的变化得到及时的反映,那就必须重 建地图缓存。而重建地图缓存要视地图的区域范围和缓存的比例尺而定,时间为几分钟到几十个小时不等。因此,缓存的管理是一件相对麻烦的事情。对实时性要求比较高的系统来说,一般不建议使用地图缓存技术。但地图缓存带 来的性能的体验非常良好,因此可以在此基础上进行一些改动,使其适应地图 的更新操作十分必要。某些 WebGIS系统由于涉及数据的编辑,数据更新频率较 大,不适用缓存的方式 发布,数据的实时性非常好,但地图的浏览和刷新性能 非常差(刷新性能与数据的大小和图层

3、的渲染复杂度有关),大量占用服务器资源,多用户连接的时候导致服 务器不稳定等。经过反复的试验,针对上述的需求,懒羊羊提出了以下的一种方案,以解决 数据频繁变动和地图性能低下的问题。方案的基本思路:使用地图缓存技术对 地图进行切片;编辑数据的时候获取空间数据对应的瓦片(一张或者几张);计 算这部分瓦片的地图范围,并在后台重新生成这个范围的地图图片;把 新生成 的图片替换这些旧有的瓦片。具体的做法如下:1.创建一个非池化的服务,并生成地图缓存。2.获取编辑的图形所对应的瓦片。一般来说,如果是点图形,对应的是一张瓦片, 线、面图形一个图形有可能落在多张瓦片上面。可以使用ESRI.ArcGIS. AD

4、F.ArcGISServer.TileCachel nfo来获取瓦片的相关信息,但具体落在那一张瓦片,那就必须了解地图切片原理。1) ArcGIS Server切片原理与命名规则设定一个原点作为地图切片的起始点(默认是(400,-400),这是个经纬度坐标,设这个值可以把其他地区的数据 连接进来,使不同服务的数据可以得到有 效的拼接,有兴趣的同事可以研究一 下),以一定的规格(长宽为2的n次方的像素)把地图切割成若干的小图片, 并以科学命名的方式存贮到计算机磁盘。命名的 规则是各比例尺的图片放在名 为LXX的文件夹里面,第一个比例尺的文件夹名为L00,第二个比例尺的问L01, 如此类推。比例尺

5、文件夹(一下统称L文件夹)目录下还会有R开头的文件夹, R表示的R0,当前比例尺的瓦片每一行对应一个文件夹。R文件夹的命名方式是瓦片的行序列(用rlndex表示),把rlndex 转为8位16进制,不足的在左 边补 0,用代码公式表示 FolderName = R+rIndex.ToString(x).PadLeft(8,0) o R文件夹里面保存的就是瓦片,瓦片的命名方式跟 R文件夹的命名方式 相似,以字母C开头,后面是瓦片在该行的列序号(用 clndex)表示,后面依 然是一 个 8 位 16 进制 FileName = C+rIndex.ToString(x).PadLeft(8,0)+

6、 .+format.ToString() 2)计算图形对应的瓦片(以点为例) 下面以加入一个点要素为例,说明如何去获取这个点对应的瓦片 首先获取地图服务的相关信息,其中 NotPooledServiceUrl 是字符串,对应当前 服务的URL地图服务已切片/ 获取服务的相关信息ESRl.ArcGlS.ADF.ArcGlSServer.MapServerProxy mapserver_dcom = newESRl.ArcGlS.ADF.ArcGlSServer.MapServerProxy(NotPooledServiceUrl);ESRl.ArcGlS.ADF.ArcGlSServer.Map

7、Serverlnfo mapi = mapserver_dcom.GetServerlnfo(mapserver_dcom.GetDefaultMapName();String defaultMapName =mapserver_dcom.GetDefaultMapName();ESRl.ArcGlS.ADF.ArcGlSServer.MapDescription pMapDescription = mapi.DefaultMapDescription;ESRl.ArcGlS.ADF.ArcGlSServer.EnvelopeN mape = mapi.FullExtent asESRl.Ar

8、cGlS.ADF.ArcGlSServer.EnvelopeN;ESRl.ArcGlS.ADF.ArcGlSServer.EnvelopeN mapiExtent =(ESRl.ArcGlS.ADF.ArcGlSServer.EnvelopeN)mapi.Extent;然后获取这个这个地图服务的瓦片信息/ 获取瓦片的图片格式 string cacheTileFormat = mapserver_dcom.GetTileImageInfo(defaultMapName).CacheTileFormat;string imageType = cacheTileFormat.StartsWith(P

9、NG) ? .png : .jpg;/ 获取瓦片的相关信息ESRI.ArcGIS.ADF.ArcGISServer.TileCacheInfo tCacheInfo = mapserver_dcom.GetTileCacheInfo(defaultMapName);/瓦片的原点(ags默认值为(-400,400),在切片的时候可以设定这个值)PointN originPT = tCacheInfo.TileOrigin as PointN;接着定义其他相关的信息double envCenterX = pPoint.X;/pPoint 为新加入的点要素的图形double envCenterY =

10、 pPoint.Y;ESRI.ArcGIS.ADF.ArcGISServer.LODInfo lodInfos = tCacheInfo.LODInfos;int tColCenter, tRowCenter;/pPoint 所在的瓦片对应的列、行double tileWidth, tileHeight;/ 对应瓦片的长度和宽度(计算后为地图单位)double tileXMin, tileYMin;/pPoint 所在的瓦片的左下角坐标double tileXMax, tileYMax;/pPoint 所在的瓦片的右上角坐标通过计算找到这个点对应的各级缓存的瓦片的路径(根据上述所说的切片原理

11、和命名规则算出来)foreach (ESRI.ArcGIS.ADF.ArcGISServer.LODInfo li in lodInfos) tileWidth = tCacheInfo.TileCols * li.Resolution; tColCenter = (int)Math.Floor(envCenterX - (double)originPT.X) / tileWidth);tileXMin = (double)originPT.X + (tColCenter * tileWidth);tileHeight = tCacheInfo.TileRows * li.Resolution

12、;tRowCenter = (int)Math.Floor(double)originPT.Y - envCenterY) / tileHeight);tileYMin = (double)originPT.Y - (tRowCenter * tileHeight) - tileHeight;tileXMax = tileXMin + tileWidth;tileYMax = tileYMin + tileHeight;string tUrl = cacheDir + Layers_alllayers + L + li.LevelID.ToString().PadLeft(2, 0)+ R +

13、 tRowCenter.ToString(x).PadLeft(8, 0)+ C + tColCenter.ToString(x).PadLeft(8, 0)+ imageType;UpdateTile(tileXMin, tileYMin, tileXMax, tileYMax, tUrl, tCacheInfo, poolService)/ 分别更新各个比例尺下的瓦片,其中 poolService 是一个 MapServerProxy计算瓦片行列值的公式完全可以通过切片原理推出来Colu mn = Floor(Po int of in terest X Tile orig in X) /

14、Ground width ofa tile)Row = Floor(Tile origi n Y- Point of in terest Y) / Ground height of atile)最后是通过生成新的图片去取代原来的瓦片, 以达到局部更新的效果(也就 是上面的 UpdateTile 函数的工作)。实现的思路是通过传入单张瓦片对应的四 个角的坐标去定义一个Envelope,输出这个Envelope区域的图片,并替换掉对 应 url 的瓦片。ESRI.ArcGIS.ADF.ArcGISServer.MapServerInfo agsSoapMapServerInfo = mapserv

15、er_dcom.GetServerInfo(mapserver_dcom.GetDefaultMapName();ESRI.ArcGIS.ADF.ArcGISServer.MapDescription agsSoapMapDescription = agsSoapMapServerInfo.DefaultMapDescription;SRI.ArcGIS.ADF.ArcGISServer.EnvelopeN pEnv = newESRI.ArcGIS.ADF.ArcGISServer.EnvelopeN();pEnv.XMin = xMin;pEnv.YMin = yMin;pEnv.XMax = xMax;pEnv.YMax = yMax;agsSoapMapDescription.MapArea.Extent = pEnv;/ 设定了出图区域/设定出图图片的格式,dpi,长宽等ESRI.ArcGIS.ADF.ArcGISServer.ImageDescription agsImageDes = newESRI.ArcGIS.ADF.ArcGISServer.ImageDescription();ESRI.ArcGIS.ADF.ArcGISServer.Im

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号