ArcGIS Server动态读取图层样式(Flex版)

最近遇到很多人问这类的问题,在ArcGIS10的rest接口已经提供给我们动态读取图层样式的接口了。
其实当我们在访问ArcGIS Server10的时候,会发现每一个服务界面提供给我们比以前更多的信息了,这些信息只要你可以看到,我们是都有接口读取到的。

以ESRI官网的服务为例:
http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/BloomfieldHillsMichigan/Parcels/MapServer

界面如下图:
ArcGIS Server动态读取图层样式(Flex版)_第1张图片

如果细心对比的话,会发现比前几个版本的信息量多了很多,例如:Tables

再看一下对每个图层的信息描述,如下图:
ArcGIS Server动态读取图层样式(Flex版)_第2张图片
这里会很明显的发现drawinfo这个属性,记录着图层的图层样式,动态获取图层样式就要靠drawinfo这个属性了。
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:esri="http://www.esri.com/2008/ags"
			   xmlns:mx="library://ns.adobe.com/flex/mx" 
			   creationComplete="application1_creationCompleteHandler(event)"
			   minWidth="955" minHeight="600">
	<fx:Script>
		<![CDATA[
			import com.esri.ags.events.DetailsEvent;
			import com.esri.ags.layers.supportClasses.LayerDetails;
			import com.esri.ags.renderers.SimpleRenderer;
			import com.esri.ags.symbols.PictureMarkerSymbol;
			
			import mx.core.INavigatorContent;
			import mx.events.FlexEvent;
			import mx.rpc.events.FaultEvent;
			
			/**
			 * 动态读取图层图标 
			 * 创建完成以后,加载
			 */ 
			protected function application1_creationCompleteHandler(event:FlexEvent):void
			{
				for(var i:int = 0 ; i<map.layerIds.length; i++)
				{
					if(map.layers[i] is ArcGISDynamicMapServiceLayer)
					{
						
						var pServiceLayer:ArcGISDynamicMapServiceLayer = map.layers[i];
						//调用allgetails方式,就相当于再rest方式下的All Layers and Tables 
						pServiceLayer.getAllDetails();
						pServiceLayer.addEventListener(DetailsEvent.GET_ALL_DETAILS_COMPLETE , onAllDetailsComplete);
						pServiceLayer.addEventListener(FaultEvent.FAULT, onFault);
						
					}
				}
			}
			
			private function onAllDetailsComplete(event:DetailsEvent):void
			{
				//这里只做了一个图层,不同的点,线,面,需要判断
				var p:LayerDetails = event.allDetails.layersDetails[0];
				var pSimpleRender:SimpleRenderer = (SimpleRenderer)(p.drawingInfo.renderer);
				var pSymbol:PictureMarkerSymbol = (PictureMarkerSymbol)(pSimpleRender.symbol);
				image.source = pSymbol.source;
			}
			
			//
			private function onFault(event:FaultEvent):void
			{
				trace("not ok");
			}
			
			
			
		]]>
	</fx:Script>
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	<!-- 用于显示图层的样式的 -->
	<mx:Image id="image" />
	<esri:Map id="map">
		<esri:ArcGISDynamicMapServiceLayer url="http://localhost:8399/arcgis/rest/services/resource/MapServer"/>
	</esri:Map>
	
</s:Application>


这个例子写得比较简单,只是动态获取出图层样式,然后用图片的形式显示出来了,呵呵,明白原理是最重要的。主要是用到了DetailTask方式实现,这个是Flex API2.0新增加的类,调用方式和之前的Task方式一样,写法就像你用QueryTask一样,主要作用就是获取服务的详细信息。



你可能感兴趣的:(xml,REST,Flex)