ArcGIS客户端API(Javascript/Flex/Silverlight)中,我们最常打交道的是ArcGISDynamicMapServiceLayer和ArcGISTiledMapServiceLayer两个类,基本每个地图中都要用到。它们都可以直接将服务器端发布的地图服务(MapService)作为图层,加载到客户端程序中,分别对应了动态地图服务和缓存地图服务。这两种图层类型各有优缺点。
ArcGISDynamicMapServiceLayer(动态地图服务)通常用于实时显示经常变化的数据,支持控制单个图层可见性,可动态投影。但缺点是显示效果较差,整个服务出图较慢;ArcGISTiledMapServiceLayer可以直接加载服务器端的缓存地图服务,显示效果好,速度快,但它的缺点正是ArcGISDynamicMapServiceLayer的优点,即不支持动态投影,不能控制图层可见性,服务器端需要提前生成缓存等。
这里尝试自己来在客户端封装一个类,创建一种新的客户端图层类型。它能够综合以上两个图层的优点,而克服其各自的缺点。大致总结一下我们要达到的目的:
|
ArcGISDynamicMap
ServiceLayer
|
ArcGISTiledMap
ServiceLayer
|
自定义的客户端图层
|
实时获取最新数据
|
Y
|
N
|
Y
|
切片方式显示服务
|
N
|
Y
|
Y
|
需要提前生成缓存
|
|
Y
|
N
|
客户端缓存切片加快显示速度
|
N
|
Y
|
Y
|
利用subdomain加速缓存加载
|
N
|
Y
|
Y
|
支持动态投影
|
Y
|
N
|
Y
|
动态指定图像输出格式
|
Y
|
N
|
Y
|
控制子图层可见性
|
Y
|
N
|
Y
|
利用LayerDefination过滤数据
|
Y
|
N
|
Y
|
利用TimeExtent显示时态数据
|
Y
|
N
|
Y
|
其它缓存服务特性
|
N
|
Y
|
Y
|
其它动态服务特性
|
Y
|
N
|
Y
|
由于这种图层类型三种客户端API(Javascript/Flex/Silverlight)均可使用,因此在这里我们就不讨论具体的实现代码,只说明一下实现思路。
首先来解决以缓存服务的方式来显示动态服务的问题。
《ArcGIS客户端API中加载大量数据的几种解决办法(以Silverlight API为例)》一文中其实已经提到,主要是继承TiledMapServiceLayer,其中获取切片的GetUrl()方法,返回值是利用
REST SDK中的ExportMap拼接的Url。这样,我们就并不需要提前切图,输入动态地图服务,从而达到缓存地图服务的显示效果。
举一个例子,如果我想让自己的服务可以和Google Maps/Bing Maps/ArcGIS Online的服务相叠加(WKID 102100/3857),那么GetUrl()方法中看其来应该是这样(里面包括了如何根据level,row,col来计算一个切片的四个角点坐标):
1: public override string GetTileUrl(int level, int row, int col)
2: {
3: string baseUrl = @"{0}/export?dpi=96&transparent=true&format=png8&bbox={1}%2C{2}%2C{3}%2C{4}&bboxSR=102100&imageSR=102100&size=256%2C256&f=image";
4:
5: double cornerCoordinate = 20037508.3427892;
6: double originResolution = cornerCoordinate * 2 / 256;
7: double resolution = originResolution;
8: for (int i = 0; i < level; i++)
9: {
10: resolution /= 2;
11: }
12: double xmin, ymin, xmax, ymax;
13: //double resolution = 39135.7584820001;
14: xmin = -cornerCoordinate + resolution * 256 * col;
15: ymin = cornerCoordinate - resolution * 256 * (row + 1);
16: xmax = -cornerCoordinate + resolution * 256 * (col + 1);
17: ymax = cornerCoordinate - resolution * 256 * row;
18:
19: return string.Format(baseUrl, Url, xmin, ymin, xmax, ymax);
20: }
然后再来看下我们自定义图层实现ArcGISDynamicMapServiceLayer功能的可行性。
关于动态投影。如果想要叠加到WGS84坐标的底图上,只需要将bboxSR和imageSR改成4326即可。这样便支持了动态投影。
关于“切片”格式ImageFormat。只需修改上面baseUrl中的format参数。这样一来既不需要在服务器端提前切图,也能动态改变“切片”的格式。
关于服务加载速度。如果对于出图速度不满意,则可以在服务器端发布若干个相同的服务,轮询使用每个服务来出图,可以达到并行加速的目的。
关于DisableClientCache。默认情况下,与ArcGISTiledMapServiceLayer一样,这些“切片”会缓存在客户端,便于再次浏览。如果服务器端数据有变,那么就无法看到最新的变化情况,这是缓存服务的一个缺点。在自定义的图层类型中,我们可以在exportmap操作的Url最后再加一个时间戳参数,比如_ts=DateTime.Now.Ticks.ToString(),那么就达到动态地图服务每次都能看到最新结果的目的。
关于控制子图层的可见性。REST SDK的ExportMap操作中有layers参数可以控制。比如layers=show:2,4,7,则只会显示第3、5、8图层内容。
关于图层内容过滤。ArcGISDynamicMapServiceLayer有LayerDefinitions属性可以用SQL语句来筛选地图服务的输出内容,而REST中的ExportMap方法也提供了layerDefs供我们调用。比如{"0":"POP2000 > 1000000","5":"AREA > 100000"} ,只输出第一个图层中POP2000字段大于1000000的要素,第六个图层中AREA>100000的要素。
关于ArcGIS Server 10中的TimeExtent。ArcGISDynamicMapServiceLayer有一个TimeExtent属性用来显示一定时间范围内的数据,而ExportMap方法也给我们提供了Time参数来实现这个功能;并且还有layerTimeOptions参数来控制每个图层的时间段(偏移)。
关于服务的元数据。ArcGISDynamicMapServiceLayer和ArcGISTiledMapServiceLayer中,都有一些关于服务元数据的属性。比如Capabilities,CopyrightText,Description,InitialExtent,FullExtent等,这些在REST的MapService资源中都已经暴露了出来,因此我们可以通过发送请求的方式,在自定义图层初始化的时候顺便取回这些数据。
关于ArcGISTiledMapServiceLayer中的TileInfo。继承TiledMapServiceLayer类的第一个条件就是得知Tiling Scheme。自然TileInfo也是探囊取物。
细心的朋友已经看出来,其实和ArcGISDynamicMapServiceLayer、ArcGISTiledMapServiceLayer一样,我们这里自定的图层也是对ArcGIS Server REST SDK的一个封装,但在显示方式和显示速度上有所改进。输入的是动态地图服务,有缓存服务的效果,但没有真正做过缓存,所以姑且把它叫做DynamicTileMapServiceLayer。
分享到:
相关推荐
Arcgis Silverlight 动态图层以缓存的方式访问
《ArcGIS API基础使用教程》 ArcGIS API是Esri公司提供的一款强大的JavaScript库,用于在Web应用中创建和操作地图。本篇文章将详细介绍如何利用ArcGIS API进行基本的地图创建、事件处理以及图表的集成。 首先,...
ArcGIS for Android 显示DynamicMapServiceLayer的popup ,可查看博文http://blog.csdn.net/yifei1989/article/details/11396489
示例中列举了这些功能的使用方式,例如拖动地图以平移,按住 SHIFT 键点击来重新定位中心点,以及使用鼠标滚轮进行缩放。 此外,ArcGIS JavaScript API 还支持许多其他功能,如图层叠加、图层控制、查询、标记、...
地图可以从 ArcGIS Server 或 ArcGIS Online 获取,使用 ArcGISTiledMapServiceLayer 或 ArcGISDynamicMapServiceLayer 来表示。地图服务可以来自 ESRI 示例服务器或 ArcGIS Online,开发者可以根据自己的需求选择...
2. 创建百度地图图层:使用esri/layers/ArcGISDynamicMapServiceLayer加载百度地图服务,将服务URL设置为百度地图的WMS服务地址,并附加API Key。 3. 添加到地图:将图层添加到地图实例。 示例代码: ```javascript...
- **Server连接方式**:在Flex中,使用`s:RemoteObject`标签建立与Java服务的连接,指定目的地(destination)和调用的方法(method)。 - **对象创建**:AO接口的对象不能直接使用`new`关键字创建,而是通过特定的...
在GIS领域,ArcGIS for JavaScript API 是Esri公司推出的一款强大的Web地图开发工具,它允许开发者使用JavaScript语言创建交互式的地图应用。本教程将重点讲解如何利用ArcGIS API加载天地图和高德地图,以便在网页中...
- **ArcGISDynamicMapServiceLayer**:动态地图服务。 - **ArcGISImageServiceLayer**:图像服务。 - **ArcGISSceneServiceLayer**:场景服务。 #### 十、ArcGISSceneServiceLayer 用于展示三维场景的服务层。 ###...
6. **实现动态地图服务图层:**由于在ArcGIS Server中发布的USA Map Service为普通动态生成的地图,因此可以选择使用ArcGISDynamicMapServiceLayer。添加Map控件的代码示例如下: ```xml <![CDATA[ import ...
本例中,我们使用 ArcGISDynamicMapServiceLayer,因为它能与 ArcGIS Server 发布的普通动态地图服务兼容。 在 `<mx:Application>` 标签内添加代码,如下所示: ```xml <esri:ArcGISDynamicMapServiceLayer ...
- 使用 `<esri:ArcGISDynamicMapServiceLayer>` 控件添加动态图层。 2. **添加瓦片图层:** - 使用 `<esri:ArcGISTiledMapServiceLayer>` 控件添加瓦片图层。 3. **控制图层顺序:** - 通过调整 `<esri:Map>` ...
在Flex应用中,我们可以使用`esri.map.Map`类来创建地图实例,然后通过`esri.layers.ArcGISDynamicMapServiceLayer`或`esri.layers.ArcGISTiledMapServiceLayer`类来加载服务器上的地图服务。一旦地图服务加载成功,...
- 使用`ArcGISDynamicMapServiceLayer`添加动态图层。 2. **添加瓦片图层**: - 使用`ArcGISTiledMapServiceLayer`添加瓦片图层。 3. **叠加显示**: - 将两个图层添加到同一个Map组件中。 **代码示例** (部分): ...
例如,要添加 ArcGISDynamicMapServiceLayer,可以使用以下代码: ```xml <esri:ArcGISDynamicMapServiceLayer url="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer"/> ``` - **URL 参数**:`...
- 创建ArcGISDynamicMapServiceLayer以加载地图服务。 - 定义一个函数,用于执行地理处理任务。这个函数可能接收日期参数,根据日期查询数据库并构造JSON数据,然后提交给地理处理服务进行处理。 - 处理完成后,...
- 使用`ArcGISDynamicMapServiceLayer`加载地图服务,展示基础地图。 - 添加`FeatureLayer`展示由地理处理服务生成的动态图层。 - 可以使用`Legend`和日期控件等Dijit组件增强用户界面。 6. **实时更新**: - ...
本文将主要讨论如何使用 ArcGIS Server 9.3 和 ArcGIS API for Flex 实现基本的地图浏览功能。 首先,我们要明白ArcGIS Server 9.3 是 Esri 公司提供的服务器端产品,用于发布和管理地理服务,如地图服务、地理编码...
var layer = new esri.layers.ArcGISDynamicMapServiceLayer(url); map.addLayer(layer); ``` 6. 安全性管理 - 通过ArcGIS Server Manager设置服务访问权限,可以使用角色基础或用户基础的安全模型。 - 配合...
ESRI 提供了大量的开发资源以帮助开发者学习和使用 ArcGIS APIs 和 SDKs。其中包括官方文档、教程、示例代码和各种开发工具,可以在 ArcGIS for Developers 网站上找到。此网站不仅为新开发者提供丰富的入门资源,也...