ArcGIS Server应用程序优化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ArcGIS Server应用程序优化
飞行石(spediacn@)
摘要本文主要根据作者开发与配置经验分析基于平台的ArcGIS Server的性能优化与代码开发优化。
讲述如何设置地图缓存、设置缓存图像格式、使用合适的地图服务连接方式、ArcGIS Server中一些对象属性的设置、服务器环境配置等内容,尽可能地使得ArcGIS Server程序性能达到最大化。
关键词ArcGIS, 优化, 缓存, 地图服务
简介
ArcGIS Server主要用于向各种客户端提供集中部署的GIS功能、应用和数据。
它提供了一整套框架,可供开发人员创建含有GIS功能的Web应用程序和服务,我们可以通过手机终端、桌面程序、浏览器甚至进行再次开发来访问和使用这些发布的GIS Web应用程序和服务。
ArcGIS Server由一个GIS服务器(GIS Server)和应用程序开发框架(ADF)组成。
GIS 服务器含有两个基本元素:服务器对象管理器(Server Object Manager,简称SOM)和服务器对象容器(Server Object Container,简称SOC);应用程序开发框架分别支持.NET和Java开发框架。
ArcGIS Server提供了一套基于Web的管理工具,包含服务或数据的部署和发布,服务器属性设置、负载均衡设置、网站快速生成以及安全设置等功能;ArcGIS Server还提供了一套完整的基于 2.0/3.5的控件包,开发人员可以通过少量代码就可实现许多复杂的地图功能。
设置地图缓存
几乎所有大访问量的GIS信息网站提供的地图数据都是经过缓存的,通过设置地图缓存可以极大地减少服务器端地图图像的绘制时间。
设置地图缓存最常见的方式就是进行“切片”,将各个比例尺的地图数据进行预读处理,将显示的图像切割为固定大小的图片集合(如256×256,或者512×512),按一定的规则存储在磁盘阵列上。
当用户浏览某一范围的内容时,服务器端不必再次读取数据生成图片,而是直接找到磁盘阵列上该范围内的图像文件,将其直接发送给浏览器,通过一些JavaScript 脚本即可将其无缝拼接在一起,对于用户来说,他看到的仍然是整幅完整的地图图像。
为缓存设置合适的图像格式
即使是同样的显示内容,不同格式的图像体积也会相差很多。
我们可以根据实际需要选
择一个合适的图像格式来进行呈现。
图像体积越小,客户端等待时间就越短。
浏览器能支持显示的图像格式主要有GIF, JPG, PNG。
GIF(Graphics Interchange Format)的原义是“图像互换格式”,是CompuServe公司在1987年开发的图像文件格式。
GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。
其压缩率一般在50%左右。
GIF格式支持256色存储,可以用于显示简单格式的图像内容(如简单点线面构成的要素),但对于包含渐变色或复杂颜色的图像(如卫星影像等源于拍摄的图片)支持效果并不理想,毕竟它体积小巧。
GIF支持背景透明,但会有明显的锯齿,不支持透明渐变。
jpg全名是JPEG 。
JPEG 图片以24 位颜色存储单个光栅图像。
JPEG 是与平台无关的格式,支持最高级别的压缩,不过,它属于有损压缩。
JPEG 格式可在10:1 到20:1 的比率下轻松地压缩文件,而图片质量不会下降。
JPEG 压缩方案可以很好地压缩类似的色调,但是JPEG 压缩方案不能很好地处理亮度的强烈差异或处理纯色区域。
JPEG只支持YUV 颜色模式的数据结构,而不支持RGB图像数据结构,所以在将彩色图像进行压缩之前,必须先对颜色模式进行数据转换。
转换完成之后还需要进行数据采样。
一般采用的采样比例是4:1:1或4:2:2。
由于在执行了此项工作之后,每两行数据只保留一行,因此,采样后图像数据量将压缩为原来的一半。
JPG不支持透明色。
PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是替代GIF和TIFF 文件格式,同时增加一些GIF文件格式所不具备的特性。
PNG 格式支持无Alpha 通道的RGB、索引颜色、灰度和位图模式的图像。
PNG 保留灰度和RGB 图像中的透明度。
PNG 格式的图像支持背景透明,甚至支持GIF所不支持的透明渐变,但许多流行的浏览器对它支持不是很好,如果客户端使用的是Internet Explorer 5/6/6.5版本或者FireFox 1.x版本,则PNG24格式图像无法正常显示,特别是透明色和透明渐变,会以白色背景将透明色替换。
只有新版的Internet Explorer 7/8和FireFox2浏览器才能正常显示其图像内容。
ArcGIS Server9.3默认的图像格式是PNG8,之前9.2版本默认格式为PNG24,如果想要体积更小巧的图片,可以使用JPEG或GIF;如果想要细腻的显示内容,可以使用PNG24。
因为受到客户端浏览器的限制,以下情况需要尽量避免:
1.如果缓存的图像格式是PNG24,并且在使用了多数据服务叠加调用的情况下,请使用Internet Explorer 7/8或FireFox2来浏览,否则底层图像被上层图像覆盖而无法显示;
2.如果只能使用老版本的Internet Explorer 5.x/6.x或FireFox1.x浏览器,请将切片格式设置为JPG、GIF、PNG8或PNG32格式。
尽量使用互联网连接方式来连接地图服务
连接地图服务有两种方式:互联网连接(Internet Connection)和本地连接(Local Connection)使用互联网连接来连接地图服务可以更有效地使用服务器上下文对象。
而本地连接仅用于和服务器上的ArcObject对象交互时使用。
鹰眼地图控件上使用StaticMode属性
从ArcGIS Server 9.2 SP5之后鹰眼控件(OverviewMap)扩展了一个新的StaticMode属性。
设置StaticMode属性为True可启用其静态模式功能。
当地图控件大小发生变化时鹰眼控件
将不会随其发生变化,而之前版本会重新生成新的图像。
优化TOC控件
TOC控件可以向用户显示一个树状的图层列表。
ArcGIS 9.2 SP3之后解决了一个TOC 控件内部的性能瓶颈问题,当该地图服务中包含大量的图层、图层组和设置有分级显示的图层时该问题尤为明显。
TOC控件为开发人员提供了许多选项用于减少向服务器发出请求时来回传输的数据量:TOCType属性:该属性默认值为SwatchList,它生成一个包含图层名称和符号的的图层列表,将其改为LayerList可以使TOC控件只显示图层名称而不显示相应的符号,从而减少了符号图像数据传输带来的数据量。
在图层数量很大时该设置对性能影响尤为有效。
RenderOnDemand属性:顾名思义,它可以启用按需呈现的功能。
当TOC控件配置为显示符号图像时,将该属性设置为true可以使得该图层只在展开图层时显示符号,在初次加载页面时使用该功能很有效,可以将图层符号数据传输从初次加载页面时延迟到图层展开时。
ExpandDepth属性:设置该属性为0到1可以最大程度地减少在页面打开时可见的嵌套图层数量。
适当地设置一些MapResourceItems的Visible属性为false可以使得页面获得更快的加载速度,但这也增加了开发人员的代码量,因为关闭后需要在代码中手动打开这些层。
去掉不必要的控件
通过ArcGIs Server 管理器或Visual Studio生成的Web地图程序包含了很多控件,如TOC控件、鹰眼控件、缩放工具条控件等。
在用户操作过程中这些控件会发生大量数据请求和状态更新操作,我们可以将极少使用的控件去掉,这可以提高程序的性能和稳定性。
将正式发布的程序部署为非调试模式
ArcGIS Server的Web ADF框架在处理请求过程中会释放出其控件所需的JavaScript脚本资源,释放时会自动根据系统调试模式释放出可调试的JavaScript代码或压缩后的JavaScript代码,这两种代码实现相同的结果,但数据量相差很大。
我们可以在正式发布的产品中将调试模式关闭(通过设置web.config文件),Web ADF框架将自动识别并释放出压缩并流化的JavaScript代码给浏览器客户端,这可以减少第一次页面加载所需的时间。
使用HTTP压缩功能
IIS提供了向客户端发送流化并压缩的资源(如JavaScript)。
在服务器端将数据流压缩为Gzip格式数据,客户端浏览器自动识别并将其解开并将其呈现。
通过压缩可以减少服务器
与客户端之间数据传输量。
禁用MIME数据
默认情况下,Web ADF框架中未缓存的地图资源将生成流化的MIME图像并发送至客户端呈现,我们可以通过禁用MIME数据来降低这些必须由ADF处理的信息交互数据量(在地图资源显示设置对话框中进行设置)。
在生成图像时地图服务将向客户端发送一个图像URL,而不是直接发送图像数据,客户端根据收到的URL去下载相应的图像文件并拼接和呈现,不直接接收MIME图像数据流。
注意,该方式下背景透明的图像内容受图像格式影像,其显示并不一定正常,除非地图服务器能够生成支持透明的图像格式(如PNG)并且客户端浏览器支持显示该格式。
为地图服务定义数据帧名称
ArcGIS Server的资源定义包含有地图服务名称和数据帧的定义,如果数据帧名称为默认名称(默认名称为"default"),每次资源初始化时ADF框架程序都向地图服务会发出默认数据帧名称请求。
我们可以通过为数据帧设置一个名称来避免这一额外的数据传输。
设置LayerDescription对象来改善响应时间
每个地图资源都有对应一个MapDescription对象,它以LayerDescription对象数组形式维持一份图层描述信息列表。
MapDescription对象和LayerDescription对象是ArcGIS Server SOAP接口中的类型,每个LayerDescription对象描述地图服务的一个对应的图层内容信息。
ArcGIS Server SOAP接口支持以ADF框架内定义的类型(如IQueryFunctionality)在地图服务中进行查询。
对ArcGIS Server地图资源相关的SOAP类型的编辑将直接更新查询结果。
很多情况下,从查询结果中取出几何对象并以要素的形式在地图上选中或作为其子集呈现是很有必要的。
描绘几何对象的细化程度直接影响查询所需的时间,默认情况下,全细节的几何对象将全部作为结果返回,如果对几何对象的全细节形式不是很必须的话,我们可以设置LayerDescription对象关联的GeometryResultOptions对象,它可以降低几何形状的细节程度,使得返回的几何形状稍微粗化一些,它减少了许多描述几何形状的点信息,同时也减少了获取查询结果的时间。
我们可以设置GeometryResultOptions对象的两个属性来实现几何对象粗化:GeneralizeGeometry和MaximumAllowalbleOffset,可以设置GeneralizeGeometry属性为true并且定义MaximumAllowableOffset的值。
MaximumAllowableOffset属性控制几何对象从输入到输出的最大粗化程度,该值越大,生成的几何形状越精细。
注意,尽管ArcGIS Server地图资源相应的MapDescription对象是存储在视图状态(ViewState)中,但MaximumAllowableOffset值是存于用户会话状态(Session)中的,要重置或禁用几何对象粗化功能需要设置这些属性或设置GeneralizeGeometry属性为false。
下面代码片段演示如何通过使用WebADF框架中的MapFunctionality、LayerDescription以及如何设置这些属性:
ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality agsMapFunctionality = (ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality)mapFunctionality;
yerDescription[] layerDescriptions = yerDescriptions;
yerDescription activeLayerDescription =
ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality.GetLayerDescription(acti veLayerIDInt, layerDescriptions);
yerResultOptions.GeometryResultOptions.GeneralizeGeometrie s = true;
yerResultOptions.GeometryResultOptions.MaximumAllowableOff set = 10000;
避免在自定义控件中创建子控件
在ADF框架中创建自定义控件时,如任务控件(WebTask),这些控件通常会包含一系列子控件的集合,如按钮(Button)、文本框(TextBox)、表格(Table)等。
每个请求产生的页面控件生存周期的迭代过程包括了创建每一个控件及其子控件的过程,如果该请求处理过程中没有涉及到这些自定义服务器控件,我们可以跳过创建子控件这一过程。
最简单的方法就是在重载控件基类Controls对象的CreateChildControls方法,在其中加入一些判断逻辑。
CreateChildControls方法是基于控件生存周期规范的,调用该方法将执行创建子控件的逻辑操作。
下面演示两段代码均使用了AsyncOptimizer对象来判断调用者是否处于一个异步请求中以及判断是否CreateChildControls方法是否应该继续执行。
AsyncOptimer 类用于处理判断逻辑。
演示1: 使用AsyncOptimizer的简单的判断代码块
protected override void CreateChildControls()
{
base.CreateChildControls();
AsyncOptimizer asyncOptimizer = new AsyncOptimizer(this);
if (!asyncOptimizer.RequiresChildControls)
return;
}
演示2: 使用AsyncOptimizer全功能代码块
protected override void CreateChildControls()
{
base.CreateChildControls();
//如果该控件与当前异步调用操作无关,可以不创建其子控件
AsyncOptimizer asyncOptimizer = new AsyncOptimizer(this);
if (!asyncOptimizer.RequiresChildControls)
return;
// <这里包含创建创建自定义控件的代码逻辑>
//注册参与处理当前异步调用所需的子控件
asyncOptimizer.ChildControlsHandlingAsyncCalls.Clear();
asyncOptimizer.ChildControlsHandlingAsyncCalls.Add(treeviewPlus.UniqueID);
asyncOptimizer.MapToolsHandlingAsyncCalls.Clear();
asyncOptimizer.MapToolsHandlingAsyncCalls.Add();
}。