在用SilverlightAPI开发的过程中,不论是从客户端提交到服务器端的数据,还是从服务器端返回客户端的数据,都要表现在浏览器中,具体的来说是Map控件里。但根据各自类型的不同,比如数据源,地图服务的类型,是否缓存等,决定了它们将处于某个图层里,前面讲过的GraphicsLayer就是一种图层。清楚地认识这些图层类型,对于处理于服务器与客户端之间的地图数据来说是很重要的。
所有的图层都是从Layer类型继承而来的,可以参考下载的API中的对象模型图。
Layer
|--TiledMapServiceLayer
| |--ArcGISTiledMapServiceLayer
|--DynamicLayer
| |--DynamicMapServiceLayer
| |--ArcGISDynamicMapServiceLayer
| |--ArcGISImageServiceLayer
| |--GPResultImageLayer
|--GraphicsLayer
| |--FeatureLayer
|--ElementLayer
下面就按顺序认识一下这些图层吧,也包括Silverlight API中独有的FeatureLayer。
1、Layer:
继承自Silverlight中的DependencyObject,并实现了INotifyPropertyChanged接口,是Silverlight API中其他图层的基类。可以把它看成麦子,再好吃的凉皮,泡馍都是由它做出来的;
2、TiledMapServiceLayer:
继承自Layer,是所有使用了缓存的地图服务的基类。通过它可以在程序中加入经过缓存的,来自不同数据源的地图服务。比如ArcGIS Server的地图服务,Google Map的地图,Virtual Earth的地图等;
3、ArcGISTiledMapServiceLayer:
继承自TiledMapServiceLayer。像上面说的一样,这个图层扩展了TiledMapServiceLayer,于是支持由ArcGISServer 9.3版本发布的经过缓存的地图服务;又比如ArcGIS Server9.2版本发布的缓存地图服务不支持REST方式连接,如果要在93的客户端API中使用的话,就可以通过TiledMapServiceLayer扩展一个比如ArcGISTiledMapServiceLayer92,来支持92Server发布的缓存地图服务;
4、DynamicLayer:
继承自Layer,是动态地图服务的基类;
5、DynamicMapServiceLayer:
继承自DynamicLayer,对应于TiledMapServiceLayer,要使用未经过缓存的动态地图服务,就得通过扩展这个图层来实现;
6、ArcGISDynamicMapServiceLayer:
继承自DynamicMapServiceLayer,针对ArcGIS Server9.3版本发布的动态地图服务。同理,如果要在客户端API中使用其他动态地图服务,比如OGC的WMS服务,则也需要像这个图层一样,扩展上面的DynamicMapServiceLayer来实现;
7、ArcGISImageServiceLayer:
继承自DynamicMapServiceLayer,针对ArcGIS Server 9.3版本发布的ImageService,因为影像服务也属于动态的地图服务。在客户端API中,可以通过ArcGISImageServiceLayer的一些属性,方便通过浏览器来展示服务器端的影像数据,比如通过BandIds属性,可以快速调整影像数据显示波段的组合(RGB通道),提供不同结果供用户查看。点击这里,查看一个实例;
8、GPResultImageLayer:
继承自DynamicMapServiceLayer,针对Geoprocessing服务所产生的结果。可以请求服务器端的GP服务将结果动态生成一张图片,将此图片作为GPResultImageLayer图层直接添加到Map控件中;
9、GraphicsLayer:
继承自Layer,是图形数据集中展现的地方,在第四讲中已经详细讨论过了;
10、FeatureLayer:
继承自GraphicsLayer,这也是Silverlight API中的亮点之一,通过它可以完成一个比较炫的功能:
整个过程在xaml中就可以实现,只需要在Map的Layers中插入以下代码即可:
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer" Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer"/>
<esri:FeatureLayer ID="featurelayer"
Url="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/0"
Where="POP1990 > 75000" ClusterFeatures="True" FlareBackground="#99FF0000" FlareForeground="White" MaximumFlareCount="9"
FeatureSymbol="{StaticResource markersymbol}">
<esri:FeatureLayer.OutFields>
<sys:String>CITY_NAME</sys:String>
<sys:String>POP1990</sys:String>
</esri:FeatureLayer.OutFields>
<esri:FeatureLayer.MapTip>
<Grid Background="LightYellow">
<StackPanel Margin="5">
<TextBlock Text="{Binding Converter={StaticResource MyDictionaryConverter},
ConverterParameter=CITY_NAME, Mode=OneWay}" FontWeight="Bold" />
<StackPanel Orientation="Horizontal">
<TextBlock Text="Population (1990): " />
<TextBlock Text="{Binding Converter={StaticResource MyDictionaryConverter},
ConverterParameter=POP1990, Mode=OneWay}" />
</StackPanel>
</StackPanel>
<Border BorderBrush="Black" BorderThickness="1" />
</Grid>
</esri:FeatureLayer.MapTip>
</esri:FeatureLayer>
复制代码
可以看出这个FeatureLayer其实是将一个Query查询封装到了一个GraphicsLayer中。通过url指定查询的图层,where指定查询条件(也可以输入geometry指定查询的图形),最关键的是ClusterFeatures="True",当一个范围内feature过多时,就将他们“聚合”在一起,以一个更大的符号表示出来,进一步放大时才将它们单独显示出来,如果聚合的目标不超过MaximumFlareCount设置的数目,那么就会出现那个flare动画。在MapTip(继承自GraphicsLayer)里面进行了简单的设置,一个背景为黄色的Grid里显示两行文字,用一个DictionaryConverter类将返回的Graphic.Attributes集合中的两个字段转换成String类型显示出来。顺便提一下,FeatureLayer也可以用于线或面层的查询,但如果继续使用ClusterFeatures的话就没什么意义了。虽然FeatureLayer封装的比较死,只能有此一种效果,但它提供给我们一种思路,可以结合SilverlightRIA的特性,充分发挥自己的想象力做出更炫的效果来;但是,对于需要展现海量(成百上千个)点数据的图层来说,ClusterFeatures是一个非常有用的特性,毕竟将这么多点同时呈现出来性能还是有问题的。如果不使用ClusterFeatures,看起来应该是这样的:
不用FeatureLayer行吗?
说到FeatureLayer,还有两个Renderer不得不提一下:UniqueValueRenderer和ClassBreakerRenderer。它们都是依托FeatureLayer的,用于单值专题图的渲染。具体的用法都比较简单,可以查看API中的Concepts。但Samples中的ThematicRendering例子并没有采用这两种Renderer,而是人为地为每个Graphic设置了不同的Symbol。目前看来虽然这两个Renderer有点鸡肋,但毕竟是现在3种客户端API中提供的唯一现成的Renderer,可以猜想也许下个版本的SilverlightAPI中会有更加成熟的专题图Renderer直接供我们使用;
11、ElementLayer:
继承自Layer,它可以用来专门呈现Silverlight中原生的FrameworkElement,比如视频,音频等。虽然在FillSymbol的Fill属性中也能利用Brush类来展现一段视频,但毕竟有些“小气”,在ElementLayer中可以大大方方的放置Silverlight元素。你可能会问,在Map控件之外,Grid等布局元素中不是也能放置Silverlight的东西吗,为什么要放在ElementLayer里呢?其实有个问题经常困扰GIS开发人员,就是想让一些非地理数据元素随着地图范围的变化(放大,缩小,平移)而变化,而无须自己在Extent变化后重新计算客户端坐标,手工改变这些元素的位置。瞧,ElementLayer正解决了这个问题。
目前Beta版的API中暂时有这么多图层类型,以后也许会继续增加。但万变不离其宗,无非就是从那几个基类中派生出来的。所以,下一节我们就通过一个实例来看看如何扩展基类的MapServiceLayer,来达到使用非ArcGIS Server数据源的目的。
分享到:
相关推荐
### ArcGIS API for Silverlight 开发入门 #### 一、为何选择 Silverlight API? 随着信息技术的发展,GIS领域也需要不断地更新迭代以适应新的技术趋势。Silverlight作为一种新兴的技术平台,为GIS开发提供了新的...
**ArcGIS API for Silverlight 3.0** 是Esri公司推出的一...文件名"**ArcGISAPI30forSilverlight.exe**"可能就是该API的安装程序,包含了开发所需的所有组件和文档,开发者可以通过安装这个文件来开始他们的开发之旅。
### ArcGIS API for Silverlight开发入门 #### 一、为何选择Silverlight API? 随着信息技术的不断进步和发展,GIS(地理信息系统)技术也在不断地进化。在众多GIS开发工具中,ArcGIS API for Silverlight因其独特...
《ArcGIS API for Silverlight开发入门》 ArcGIS API for Silverlight是Esri公司推出的用于构建富互联网应用程序(RIA)的开发工具,专门针对Silverlight技术进行设计,旨在提升地理信息系统(GIS)在网络环境下的...
ArcGIS API for Silverlight是Esri公司开发的一款用于构建地理信息系统(GIS)Web应用程序的开发框架,主要针对Microsoft Silverlight技术。此API使得开发者能够利用Silverlight的强大功能和丰富的用户体验来展示、...
在阅读《ArcGIS API for Silverlight开发入门》这本书时,你将学习到如何设置开发环境、创建第一个地图应用、加载不同类型的图层、执行地理分析以及如何利用API提供的丰富功能进行应用扩展。书中还会涵盖错误处理、...
此应用实例是一个全功能的展示应用。运行调试通过,共享出来,大家参考、...实例充分利用的Silverlight 3的功能,比如:触发器、元件结合等,程序结构合理,实例开发了一系列的用户控件来构建应用,可复用性较强....
ARCGIS API for JavaScript 是一款由Esri公司提供的强大地图开发工具,用于构建基于Web的地理信息系统(GIS)应用。这个API允许开发者使用JavaScript语言在网页上创建交互式的地图服务,实现地图的显示、图层操作、...
《ArcGIS API for Silverlight开发实践》是一本专注于利用Silverlight技术进行地理信息系统开发的学习文档。Silverlight是由微软推出的用于创建丰富互联网应用程序(RIA)的技术,它具有强大的多媒体处理能力,能够...