综合实习2015.9参考arcgis-silverlight开发入门_第1页
综合实习2015.9参考arcgis-silverlight开发入门_第2页
综合实习2015.9参考arcgis-silverlight开发入门_第3页
综合实习2015.9参考arcgis-silverlight开发入门_第4页
综合实习2015.9参考arcgis-silverlight开发入门_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

原文地址://thread-44042-1-来提供给你)。更具体点,SaaS(SoftwareasaService),各种的网页邮件系统,docs(一个的office)都是SaaS。收发邮件登陆一个网页就行,而不需要在自己机器上安装一个软件。这就是计炫,而不是打开后立刻就想关掉它。其实大受欢迎的开心网(各种插件)和,甚QQ空间等,都有RIA的身影。是那朵天边的浮云;JavaScriptAPI,FlexAPI,SiverlightAPI就是ArcGISRIA的三驾马车。这里还得插一句,我觉ArcGISServer的主角ADF,通过它我们可以完力,由于受限于网络环境,所以是WPF的一部分功能。Siverlight的设计初衷是跨平台,跨浏览器如果这些还是比较抽象,那么可以造一个排比句来进一步说明。之前先肯定一点,Flash现在在网最后再来说说ArcGIS这三驾马车(JavaScriptAPI,FlexAPI,SiverlightAPI)。国外有人说,随行速度提高非常多,Chrome在这种背景下,一些非常cool的程序员会让古老的JavaScript获得 隆重推出了ArcGISAPIforArcGISArcGISAPIforSilverlight开 整理好Siverlight的开发环境。Silverlight并没有内建在VS2008中,而是作为add-on的形式附加的。说明一下,步1安装Silverlightadd-on(要求IDESP1补丁包)2安装的是建Silverlight程序的用户界面;步骤3中安装的是Silverlight一种非常华丽的处理效果,可以参看这里的实例;步骤4包括一些可用的Silverlight控件和例子。接下来再去看看SilverlightAPI的要求。可以看出对于开发ArcGISSilverlight程序来说,只有步骤1是必须的,其他都是可选的。之后需要从SilverlightAPI(需要免费一个Global账户),以备后用forVisualStudio2008SP1。到此,就Silverlight程序的开发了。关于开发环境的搭建,还可以参考yyilyzbc版主的帖子。(做SilverlightAPI的开发不需要在自己的机器上安装ArcGISServer,可直接使用ArcGISOnline上的数据;但如果要添加自己的数据,当然还是需要ArcGISServer了) 2、在出现的提示框AddanewASP.NETWebprojecttothesolutionto(Silverlight程序与flash一样,相当于网页中的一个插件。第一个选项是将Silverlight嵌入到一ASP.NET中,第二个选项是将Silverlight嵌入到一个临时的html页面中3、添加SilverlightAPI的:与.NET程序开发一样,addreference(注意是在Silverlight工程上而不是ASP.NET工程上),找到从 的API,选择添加 xmlns="xmlns:x=" Url="/ArcGIS/rest/services/_Imagery_World_2D/MapServer"/>5、按F5,运行程序,就完成了我们的 GIS可以在浏览器中看到下面的画面:先说下Silverlight的程序的基本背景。page.xaml实际上是一个控件,相当于中的但是这个预览效果是只读的,对于预览中的控件也不可选;为了弥补这个缺陷,可以用前面提到的入了性去掉,已达到全屏的效果(你也可以试试哦);Grid是布局控件,相当于html中的表格,可以进行灵活的页面布局,xaml中常用的布局控件还CanvasStackPanel;每一xamlControl都可以有一个x:Name属性,以便在code-behind页面中对其。之后是我们的主角了。Map(继承自xaml的Control)相当于一个Map控件,可以在其中加入图层;这里我们添加了一个ArcGISTiledMapServiceLayer图层(在后面的文章中会专门讲到的API,同JavaScript与FlexAPI一样,都是通过REST方式对资源和操作进行的;对这个图层,赋没有x:Name的属性,为了方便在code-behind(与类似的托管代码)的代码中找到这个图层,便使用了ID属性;URL的内容便是ArcGISOnline发布好的一个世界地图资源。到此,应该对这个例子理解的差不多了。如果还想再添加一个图层怎么办呢?没错,就是在大家自然会想到叠加一个自己的数据图层来看看效果,于是对Map内容做了修改(是本机Url=" Silverlight能够利用.net的一些库内容,包括。来对刚才的那个图层添加一个:InitializationFailed,当图层添加失败的时候会出发这个。添加这个的处理也非常简单:在上面的图层中加InitializationFailed属性,会提示你生成新的eventhandler,默认回车,看上去像这样:Url=" 1.privatevoidArcGISDynamicMapServiceLayer_InitializationFailed(objectsender,EventArgse) .ArcGIS.Layerlayer=sender 问题,可以参考帮助中的说明,将两个xml文件保存在 ,比如C:\Inetpub\wwwroot中即(其实保存其中一个就可以了,ArcGISOnline已经将两个xml文件都放在了根 以上面的服务)。为了更好的理解xaml和Silverlight,建议首先独立完成Silverlight帮助中的两个oworldclockArcGISArcGISAPIforSilverlight开 下Silverlight的开发知识。根据上一节的知识,可以知道这个Silverlight程序里包含了一个Map控件,并且里面至少有一WorldImagery的图层。那么Page.xaml里的关键<Grid :ArcGISTiledMapServiceLayerID="WorldImageLayer"x:Name="WorldImageLayer"Initialized="WorldImageLayer_Initialized"Url="/ArcGIS/rest/services/_Imagery_World_2D/MapServer"/>所有的布局工作都在一个Grid中进行,给它起个名字叫LayoutRoot。Grid里面放了一个 :Map元或其他软件发布的地图服务,目前SilverlightAPI中支持的能够直接使用的有会在之后的小节中讲到。强调一下,与ADF开发MapResourceManager一样Map中加入的内容实际上是地图服务,但当做一个layer处理。<Gridx:Name="Gridright"Margin="0,15,20,0"HorizontalAlignment="Right"<TextBlockx:Name="TBextentMargin="20,15,15,0Text="范围:"TextWrap="Wrap"FontWeight="Bold"/>页面右边1、2、3、6的父容器,之所以不用StackPanel6需要贴着页面底部,StackPanel中的元素都flow贴到一起。三个矩形组合便构成了整体轮廓,由于它们都在一Canvas中,所以会产矩形是白色的文字显示区域。里的内容xaml中称作markupextention,StaticResource是使两种markupextention,分别用于数据绑定(databinding)和自定义control的外观。上面的StaticResourceApp.xaml中定义的,这样就可以在本工程的任何页面中使用,当然也可以定义为LayoutRoot这个Grid的Resource。贴出来大家一看就明白了:<Stylex:Key="rectBottom" "它们就相当于网页中的css。如果不使用StaticResource,那么三个矩形看起来<RectangleRadiusX="10"RadiusY="10"Fill="# Canvas.Top="5"Width="215"Height="110"/><RectangleRadiusX="10"RadiusY="10"Fill="#775C90B2"Canvas.Left="0"Canvas.Top="0"Width="215"Height="110"Stroke="Gray"/><RectangleRadiusX="5"RadiusY="5"Fill="#FFFFFFFF"Canvas.Left="10"Canvas.Top="10"Width="195"Height="90"Stroke="DarkGreen"/>中比html+css的布局要简单和灵活许多。好了,继续。Map控件里面已经封装了一些来供我们使用,我们可以在需要的时候捕获它们来进行处理。如果做过ArcGIS产品的二次开发,你应该已经想到我们要捕获的就是Map的ExtentChanged;而要在地图移动或者缩放的过程中也实时显示地图范围,则还要对ExtentChanging做处理。细心的你WorldImageLayer_Initialized。当然可以像这样一样给Map的这两个添加handler,但这里并不网速过慢导致图层并未加入到Map中,则会报错)Page.xaml.cscode-behind代码:{Map1.ExtentChanged+= Map1.ExtentChanging+= }没错,把两个绑定到同一个handler即可。再看看Map1_ExtentChange中的代码privatevoidMap1_ExtentChange(objectsender, {=}Resolution属性吧。<CanvasWidth="215"Height="110"Margin="0,120,0,0"HorizontalAlignment="LeftVerticalAlignment="CenterText="屏幕坐标:"TextWrap="Wrap"FontWeight="Bold"/>HorizontalAlignment="LeftVerticalAlignment="CenterText="地图坐标:"TextWrap="Wrap"FontWeight="Bold"/>发现并没有这个。但要记住Map是继承自xaml中的Control,Control继承自FrameworkElement,FrameworkElement继承自UIElement,这里就有一个MouseMove了。所以Map控件的MouseMove是xaml中而不是SiverlightAPI中的(当然整个SilverlightAPI都是建立在xaml基础上的)。在 :Map中添加一个MouseMove(MouseMove="Map1_MouseMove"),来看看code-behind{if(Map1.Extent!={System.Windows.PointscreenPnt=TBmapcoords.Textstring.Format("地图坐标:\nX:{0}\nY:{1}",Math.Round(mapPnt.X,4),Math.Round(mapPnt.Y,4));}}可以看到Map控件提供了屏幕与地图坐标之间转换的方法,好比开发人员的一座桥梁,用来往返于对于Map控件的,而不是显示器的左上角。ok,继续来看第三部分。当地图放大和平移时都可以看到平滑的效果,这归功于Silverlight的动画功能。Map在封装完动画效果后,给了我们两个属性来对它们进行设置:PanDuration和ZoomDuration,用于设置这两个动<CanvasWidth="215"Height="130"Margin="0,240,0,0"<TextBlockHorizontalAlignment="Left"Text="设图缩放动作持续时间:"TextWrap="Wrap"FontWeight="Bold"/><TextBlockx:Name="TBzoomdurationvalueHorizontalAlignment="Left"Text="当前值:"TextWrap="Wrap"FontWeight="Bold"/><Sliderx:Name="sliderzoomanimation"Orientation="Horizontal"Minimum="0"um="20"SmallChange="1"LargeChange="5"Cursor="Hand"ValueChanged="slideranimation_ValueChanged"Width="180"/><TextBlockHorizontalAlignment="Left"Text="设图平移动作持续时间:"TextWrap="Wrap"FontWeight="Bold"/>当前值:"TextWrap="Wrap"FontWeight="Bold"<Sliderx:Name="sliderpananimation"Orientation="Horizontal"Minimum="0"um="20"SmallChange="1"LargeChange="5"Cursor="Hand"ValueChanged="slideranimation_ValueChanged"Width="180"/>主要用到了两个slider控件。看看拖动滑块时的代码,了省事这两个也用了同一个privatevoidslideranimation_ValueChanged(objectsender,RoutedPropertyChangedEventArgse){Sliders=senderasif(s.Name=={Map1.ZoomDuration=newTimeSpan(0,0,TBzoomdurationvalue.Textstring.Format("当前值:{0}秒",}{Map1.PanDuration=newTimeSpan(0,0,TBpandurationvalue.Textstring.Format("当前值:{0}秒",}}还是要强调一下,WorldImagery和StreetMap两个能看到的地图实际上都是地图服务,当作layer加入到Map控件中;而动态地USA中的图Cities,Rivers,States才是ArcMapVisible属性;而动态服务中图层可见性的操作,主要是对ArcGISDynamicMapServiceLayerVisibleLayers数组做了设置StreetMap这个服务其实一开始就加入了地图( :Map中Url="/ArcGIS/rest/services/_StreetMap_World_2D/MapServer"Visible="False"/><Canvasx:Name="Canvasleft"Width="165"Height="90"HorizontalAlignment="Left"VerticalAlignment="Top"><RectangleStyle="{StaticResourcerectMiddle}"Fill="#7758FF00"Width="165"Height="90"/><ToggleButtonx:Name="TBimagery"Content="Imagery"Click="TBimagery_Clicked"Cursor="Hand"/><ToggleButtonx:Name="TBstreetmap"Content="StreetMap"Click="TBstreetmap_Clicked"Cursor="Hand"/><CheckBoxMargin="0,5,0,0x:Name="chkboxDynamicLayerContent="添加一个动态图层吧"IsChecked="False"Click="chkboxDynamicLayer_Click"Cursor="Hand"/>这里使用了ToggleButton,CheckBox和RadioButton都由它派生而来。Silverlight2中的{if{Storyboardsbstreetmaphide=makestoryboard("StreetMayer",1,hidelayername="StreetMa}}{if{Storyboardsbstreetmapshow=makestoryboard("StreetMayer",0,hidelayername=}}privatevoidtimer_Tick(objectsender,EventArgs{}publicStoryboardmakestoryboard(stringlayername,doublefrom,double{Storyboardsb=newDoubleAnimationdoubleAnim=newdoubleAnim.Duration=newTimeSpan(0,0,doubleAnim.From=doubleAnim.To=return}当切换两个地图服务时能够看到一个渐变的效果,这里用到了Silverlight中的动画,它们都是在不可见的图层Visible属性。timer也是一个StoryBoard:当然也可以使用.net中的各种timer类。{if(chkboxDynamicLayer.IsChecked=={{}="SVlayers.Visibility=}{="SVlayers.Visibility=}}{SVlayers.Visibility=california.ID=dynamicServiceLayer.VisibleLayers=}弹出一个listbox,当然这些也都是在xaml(加在上面的<ScrollViewerx:Name="SVlayers"Width="165"Visibility="Collapsed"<ListBoxx:Name="LayerVisibilityListBox"<CheckBoxMargin="2"Name="{BindingLayerIndex}"Content="{Binding里要提一下,ListBox的内容用到了数据绑定(xamlDataBindingOneTime,OneWay一个模板,在code-behind中设置了ListBox.ItemSource之后,根据该属性的内容自动生成多个publicclass{publicboolVisible{get;set;publicstringServiceName{get;set;publicstringLayerName{get;set;publicintLayerIndex{get;set;}privateint[]{List<int>visibleLayerIDList=newfor(intindex=0;index<layerInfoArray.Length;{if}return}privatevoidUpda {int[]visibleLayerIDs=if(visibleLayerIDs==visibleLayerIDs=for(intindex=0;index<layerInfoArray.Length;{{Visible=ServiceName=LayerName=LayerIndex=}}{CheckBoxtickedCheckBox=senderasstringserviceName=boolvisible=intlayerIndex= Map1.Layers[serviceName]asif{if}{if}}SilverlightAPI提供了一个ScaleBar类,可以方便的设图比例尺<!--scalebarLayoutRootGrid中<CanvasHorizontalAlignment="Left"VerticalAlignment="Bottom" :ScaleBarx:Name="scalebar"MapUnit="DecimalDegrees"FillColor2="Blue"/>需要在初始化的时候设置scalebar的Map属性,顺便来看看整个页面的初始化namespace{publicpartialclassPage:{ privatestringpublic{scalebar.Map=TBzoomdurationvalue.Text=string.Format("当前值:{0}.{1}秒",TBpandurationvalue.Textstring.Format("当前值:{0}.{1}秒",Map1.PanDuration.Seconds,Map1.PanDuration.Milliseconds);california.Url"/ArcGIS/rest/services/Specialty/_Scalifornia.Opacity=california.Initialized+=newApplication.Current.Host.Content.FullScreenChanged+=new}}}scalebarstoryboard是xaml里自定义的一个还用到了SilverlightApplication.Current.Host.Content的一个属性<CanvasWidth="215"Height="110"Margin="0,0,0,30"指定范围"/><ToggleButtonx:Name="TBfullscreen"Content="点击切换地图全屏"HorizontalAlignment="CenterCanvas.Left="100Canvas.Top="15"Height="30"Click="TBfullscreen_Click"/>{}{}<GridHorizontalAlignment="Center"x:Name="progressGrid"VerticalAlignment="Center"Width="200"Height="20"Margin="5,5,5,5"> <TextBlockx:Name="ProgressValueTextBlock"Text="100%"HorizontalAlignment="Center"VerticalAlignment="Center"/> :Map中加入一个 {if(e.Progress<{MyProgressBar.Value==正在处理}{}}ArcGISArcGISAPIforSilverlight开 在silverlight中创建一个UserControl,把上面sliderbar的外观和功能都封装在里面来看具体工作。vssilverlight工程上右键单击,add,newitemsilverlightusercontrol,起名叫mapslider,在mapslider.xaml中填如下代码:<Gridx:Name="slidergrid"HorizontalAlignment="Left"VerticalAlignment="Center"Background="Azure"Margin="20"> <Sliderx:Name="sliderLOD"Orientation="Vertical"Height="200"SmallChange="1"LargeChange="1"Minimum="0"Cursor="Hand"ValueChanged="slider1_ValueChanged"/> <Buttonx:Name="btnzoomout"Content="-"Click="btnzoomout_Click"/>是需要操作的地图了,但这个属性不是.ArcGIS.Map,而是另一个自定义类。为什么要这么做?因属性赋值的时候,这个Map需要做另外一些工作。看代码吧,不太明白的话就要加强对silverlight中databinding的学习。在mapslider.xaml.cs页面中填入一下代码:usingusingusingusingusingusingusing usingusingusingusing namespace{publicpartialclassmapslider:{privatemymapmap=new .ArcGIS.Map{{return {if(map.Map!={Map.ExtentChanged+= Map.SnapToLevels= ialized+=new}}}{ umh-}public{}{if{ privatevoidmap_ExtentChanged(objecto, {intfor(i=0;i<layer.TileInfo.Lods.Length;{if(Map.Resolution== sliderLOD.Value= { {}}//执行了这个接口后,当在主页面page.xaml.cs中给Map赋值的时候,就能返publicclass{ .ArcGIS.Map .ArcGIS.Map{get{return{map=if{}}}}88.命名空间(和对SilverlightAPI的是一样的,放在页面中的根元素UserControl里):3、在初始化的时候对我们自定义控件的Map属性赋值(page.xaml.cs中public{mapslider1.Map=Map1;}到此应该有这个感觉,封装比较麻烦,但使用封装好的控件非常简便。这就是Widgets带给ToolBar,BookMark,Navigation,MapTip,其中ToolBar了ToolBarItemCollection和ToolBarItem等类。还是通过一个例子,来看看这几个控件都长什么样吧(点击这里):

MapTip需要使用到QueryTask,以后的小节中再涉及到。现在分别熟悉一下这几个Widgets1、ToolBarAFa(oIe(sivelight中当然要有一些比较好看的效果了,比如把鼠标放在工具条上选择oobaIemClckEctece和e中oar里面有三个oaIePlExet和gr本身也是一个Wdget是Tooar的布局:<GridHeight="110"HorizontalAlignment="Right"VerticalAlignment="Top"Margin="0,10,10,0"> <RectangleFill="# "RadiusX="10"RadiusY="10"Margin="0,4,0,0"/> <RectangleFill="#775C90B2"Stroke="Gray"RadiusX="10"RadiusY="10"Margin="0,0,0,5"/> <RectangleFill="#66FFFFFF"Stroke="DarkGray"RadiusX="5"RadiusY="5"Margin="10,10,10,15"/> VerticalAlignment="Top" Widgets:ToolbarItem Stretch="UniformToFill"Margin="5"/> Stretch="UniformToFill"Margin="5"/> Stretch="UniformToFill"Margin="5" FontWeight="Bold"code-behind {switch{casecasecase}}{MyMagnifier.Enabled=}pege.ItalizeapanalExetap的m(置enbed属要标键有住大Wdget就设置为不可用。比较有用的是我们可以单独设置放大镜自己的图层及放大倍数,这里放Sreetap3。2、ArcMap(9.3版本)中的BookMark是一样的,可以像看书一样,为当前地图范围设置一个书签,便于其他时候快速定位到该范围。而查看API中的Bookmark.MapBookmark类(可以利用它字就可以了。添加了bookmarkwidgetvspreview窗口出错。 HorizontalAlignment="Left"VerticalAlignment="Top" page.xaml.cs中{MyBookmarks.Map=}3、这个导航条工具是目前网络地图必备的一个控件,但silverlight的功能,可以轻易(其实也可以在代码中通过Map.Rotation属性来设置)。经试验这个widget只能放在StackPanelGrid容器里,如果放在Canvas里的话地图中不会显示<!--navigationbar.mustbeinastackpanel--<Widgets:Navigationx:Name="MyNavigation"Margin="5" 形;又比如对点的查询,结果通常是将符合条件的点的形状高亮显示在那个独立的“层”中,通过它既可以反映用户的输入,又可以展现地图的输出。这个“层”GraphicsLayer。中也能找到GraphicsLayer的身影,它们都是一样一样的。本节我们主要看如何在GraphicsLayer中展现内容。当然第一个工作就是添加的,引入的xml命名空间;接下来在Map中添加一个GraphicsLayer图层 <!--其他图层 头,像上面那样。从命名我们不难看出,GraphicLayer里面放的就是Graphic的集合了。Graphic(.ArcGIS.Graphic)GraphicsLayer中的基本元素,它包括了Geometry(.ArcGIS.Geometry命名空间中),Symbol(在.ArcGIS.Symbol命名空间中),Attributes等属性。所有显示在地图中的矢量元素都有一个Geometry,里面包含了若干地理坐标,用于显示地图上要让一个Graphic显示出来,总共分3在xaml中code-behindGraphicg=new在xaml中code-behindGraphicg=new{Geometry=newMapPoint(108,Symbol=new{Color=newSize=Style=}在xaml中<Geometry:MapPointX="108"Y="30"code-behindGraphicg=new{Geometry=newMapPoint(108,Symbol=new{Color=newSize=Style=}GraphicsLayerglayer=Map1.Layers["GLayer"]as一段动画文件,利用Silverlight的特性,能够定义出表现力丰富的各种符号。辑部分放在code-behind中。看一下添加图中那些Graphic的代码:<Symbols:SimpleMarkerSymbolx:Name="RedMarkerSymbol"Color="Red"Size="12"Style="Circle"/>Source="imgs/pin.png"OffsetX="10"OffsetY="10"/><Symbols:SimpleLineSymbolx:Name="RedLineSymbol"Color="Red"Width="4"Style="Solid"/><Symbols:CartographicLineSymbolx:Name="CartoLineSymbol"Color="Red"Width="10"DashCap="Triangle"LineJoin="Round"DashArray="6,2"/>BorderBrush="Red"BorderThickness="2"/> "privatevoid{GraphicsLayerglayer=Map1.Layers["GLayer"]asGraphic[]graphics=newgraphics[0]=new{Geometry=newMapPoint(108,Symbol=graphics[1]=new{Geometry=newMapPoint(108,Symbol=new{Color=newSize=Style=}graphics[2]=new{Geometry=newMapPoint(108,Symbol=graphics[3]=new{Geometry=newMapPoint(108,Symbol=new{FontFamilynewFontFamily("微软雅黑,宋体FontSize=Foreground=newTexttext}graphics[4]=newgraphics[4].Symbol=39.newnew.ArcGIS.Geometry.Polylinepl= graphics[5]=new50.newnew.ArcGIS.Geometry.Polylinepl1= graphics[6]=new{Symbol=63..ArcGIS.Geometry.Polygonpg= graphics[7]=new//MediaElement的Name属性只能在xaml(见帮助Bear.Source=newUri("http://s .ArcGIS.Geometry.Polygonpg2= 83.newgraphics[7].Symbol=new{Fill= {SourceName=BearOpacity=Stretch=}foreach(Graphicgin{}}{Graphicg=oas111.xaml中改写一遍。看到这里肯定会产生一个疑问:难道每个Geometry的定义都这么吗?其实SilverlightAPI已经给我们提供了 的捕捉到用户的鼠标操作,从而获取各种Geometry来供程序使用。可以看到地图上可以实时反映出我们绘画的内容,而这些则利用了Draw的预定义Symbol:DefaultMarkerSymbol,DefaultLineSymbol,DefaultPolygonSymbol等。对应关系如下: plete,利用参数就可以获得画好的这个Graphic添加到一个GraphicsLayer中。Color="Red"Size="12"Style="Circle"/><Symbols:CartographicLineSymbolx:Name="DefaultLineSymbol"Color="Red"Width="4"/>BorderBrush="Red"BorderThickness="2"/>Fill="#33FF0000"BorderBrush="Red"BorderThickness="2"/> Margin="20,20,0,0"Width="430"Height="110"><RectangleRadiusX="10"RadiusY="10"Width="430"Height="110" "Stroke="#FF6495ED"/><RectangleFill="#FFFFFFFF"Stroke="DarkGray"RadiusX="5"RadiusY="5"Canvas.Left="10"Canvas.Top="10"Width="410"Height="90"/><Widgets:Toolbarx:Name="ToolBar1"MaxItemHeight="80"MaxItemWidth="80"Width="380"Height="80" Margin="5"/> <ImageSource="imgs/Drawhand.png"Stretch="UniformToFill" Text="清空绘制的图形<TextBlockx:Name="StatusTextBlock"Text=""FontWeight="Bold"{Draw1.Map=} {.ArcGIS.Graphicgraphic= 9.Geometry=Symbol=}{}{switch{case0:// _activeSymbol=case1:// _activeSymbol=case2:// _activeSymbol=case3:// _activeSymbol=case4: _activeSymbol=case5://Stopcase6://Clear}}ArcGISArcGISAPIforSilverlight开 来看一下如何通过SilverlightAPI完成GIS中的分析功能。 中提供 SilverlightAPI目前给我们提供了那些Task功能EngineSpatialFilter,当然也QueryFilter。果(ReverseGeocoding)。由于国内地图数据工作做的相当好,这个Task暂时用不到。GeometryService:可以对输入的地理数据进行如缓冲区,动态投影,面积/周长量算等几何操作。Geoprocessing:能够完成复杂的GIS任务,类似ToolBox中的工具。抽象一下,可以看出,Query完全可以完成Identity和Find的工作,但后两者在特定场合下起来比Query要方便的多;Geoprocessing完全可以替代GeometryService,但是在利用REST 再抽象一下,SilverlightAPI中的这几个Task和JavaScript/FlexAPI中的Task是大同小异的,因为其实它们都是AGS9.3RESTAPI中出来的操作资源(OperationResource)见下图:后面的代码中实际上也是把输入参数封装起来提交到了RESTAPIEndpoint上。要理解好客户端API中的Task,建议熟读AGSRESTSDK。吃。好了,下面我们就通过一个实例(点击这里,查看实例),来学下Query和Geometry两个Task的用法。查看详细信息。这里假设你已学习了前几节的内容,只讨论Task用法的部分。1、利用所画的线生成缓冲区Draw工具中的hand,在这个动作完成后会触Draw的初始GeometryServiceMap1中添加了ID为glayerResultGraphicsLayer,linesymbolred是提前设置好的CartographicLineSymbol:private { hand hand画的曲线显示在地图Graphicg=newg.Symbol=g.Geometry=GeometryServicegeometrytask=GeometryService("}GeometryService的初始化使用构造函数来完成的,里面接受一URLGeometryService个GeometryService,并且它的名称必须是Geometry。 pleted+=new geometrytask.Failed+=newBufferParametersbufferparameters=newbufferparameters.Unit=//必须指定下面两个spatialreference,否则buffer结果集为为公里,Buffer的输出一般与地图坐标系一致;Buffer参数有一Features属性List类型,里面的Graphic都将被Buffer。下来将Buffer的任务提交到服务器(可以看出为什么这些动作要叫Task): privatevoidgeom pleted(objectsender,GraphicsEventArgs{if{Graphicg=newg.Symbol=g.Geometry=}}privatevoidgeom pleted(objectsender,GraphicsEventArgs{if{Graphicg=newg.Symbol=g.Geometry=//初始化QueryTaskquerytask=QueryTask("/ArcGIS/rest/services/Demo pleted+=new querytask.Failed+=newQueryquery=newquery.OutFields.Add("*");//也顺便设置了query.Geometry=Map1.Cursor=}}返回的字段,这里返回全部字段,如果返回全部字段,则强制设置了ReturnGeometry为true,如果我考API,与Engine中的完全一致。接下来处理QueryTask完成后的privatevoid {FeatureSetfeatureset=if(featureset!=null&&featureset.Features.Count>{foreach(Graphicgraphicin{graphic.Symbol=}}Map1.Cursor=}全部属性字段吗?它们在每个Graphic的Attributes属性中。要么绑定到DataGrid里,要么一条条添加……你可能已经发现了这条语句MyMapTip.GraphicsLayergraphicslayer;,还记得第三节的Widgets吗?那里我们落下了MapTip这个小家伙,现在派上用场了。除了在这里设置MapTip的GraphicsLayer属性外,在xaml中有如下的定义: Widgets:MapTipx:Name="MyMapTip" ""仅此而已。MapTip会自动找寻自己GraphicsLayer中的GraphicGrpahic上时,会自动它的Attributes属性并显示,小玩具又发挥了大作用。{MessageBox.Show("BufferError:"+}{MessageBox.Show("Queryfailed:"+Map1.Cursor=}本节内容完毕。上面讲的相对简略,要理解各个Task和参数的用法,还是需要熟悉SilverlightAPI和前面提到的RESTAPIGeoprocessingService实际上是最强大Task,如果有自己的GISServer,完全可以在上面发布的Model或者Python,以完成各种GIS分析任务,简单的编辑也是可能的。它的用法也万变不离其宗:初始化,设置参数,提交任务,处理结果。不同的是GeoprocessingService有两种提交任务的方法:同步和异步。前者服务器端处理完任务后会立即将结果下厨毕竟能过程的方方面面,哪怕你想做出饺立方也都是有可能的。同样,ADF编程可以调用服务器端的ArcObjects,让你,这点是客户端API无论如何也办不到的。ArcGISArcGISAPIforSilverlight开 SvelghAPI开发的过程中,不论是从客户端提交到服务器端的数据,还是从服务器端返回客户端的数据,都要表现在浏览器中,具体的来说是MapGaphcsaer 下面就按顺序认识一下这些图层吧,也包括SilverlightAPI中独有的FeatureLayer1、继承自Silverlight中的DependencyObject,并实现了INotifyPropertyChanged API中其他图层的基类。可以把它看成,再好吃的凉皮,泡馍都是由它做出来的2、不同数据源的地图服务。比如ArcGISServer的地图服务,Map的地图,VirtualEarth的地图3、存地图服务不支持REST方式连接,如果要在93的客户端API中使用的话,就可以通过4、自5、继承DynamicLayer,对TiledMapServiceLayer,要使用过缓存的动态地图服务,6、如果要在客户API中使用其他动态地图服务OGCWMS服务,则也需要像这个图层一样,扩展上面的DynamicMapServiceLayer来实现;7、为影像服务也属于动态的地图服务。在客API中,可以通ArcGISImageServiceLayer的一些属的组合(RGB通道),提供不同结果供用户查看。点击这里,查看一个实例;自继承自GraphicsLayer,这也是SilverlightAPI中的亮点之一,通过它可以完整个过程在xaml中就可以实现,只需要在Map的Layers中插入以下代码即可 :ArcGISTiledMapServiceLayerID="StreetMaUrl="/ArcGIS/rest/services/_StreetMap_Wo :FeatureLayerUrl="/ArcGIS/rest/services/Specialty/ESWhere="POP1990>75000"ClusterFeatures="True"FlareBackground="#99FF0000"FlareForeground="White"<Grid<TextBlockText="{BindingConverter={StaticResource<TextBlockText="Population(1990):"<TextBlockText="{BindingConverter={StaticResource查询的图层,where指定查询条件(也可以输入geometry指定查询的图形),最关键的是ClusterFeatures="True",当一个范围内feature过多时,就将他们“聚合”在一起,以一个更大的符号 umFlareCount设置的数目,那么就会出现那个flare动画。在MapTip(继承自GraphicsLayer)里面进行了简单的设置,一个背景为黄色的Grid里显示两行文字,用一个DictionaryConverter类将返回的Graphic.Attributes效果来;但是,对于需要展现海量(成百上千个)点数据的图层来说,ClusterFeatures是一个非常有用说到FeatureLayer,还有两个Renderer不得不提一下:UniqueValueRenderer和简单,可以查APIConceptsSamplesThematicRendering例子并没有采用这两种肋,但毕竟是现在3种客户端API中提供的唯一现成的Renderer,可以猜想也许下个版本的SilverlightAPI中会有更加成专题图Renderer直接供我们使用;等。虽然在FillSymbol的Fill属性中也能利用Brush类来展现一段,但毕竟有些“小气”,在素中不是也能放置Silverlight要放在ElementLayer里呢?其实有个问题经常困扰GIS在Extent变化后重新计算客户端坐标,手工改变这些元素的位置。瞧,ElementLayer正解决了这个问BetaAPI中暂时有这么多图层类型,以后也许会继续增加。但万变不离其宗,无非就是达到使用非ArcGISServer数据源的目的。ArcGISArcGISAPIforSilverlight开 通过上一节学习,可以看出在SilverlightAPI中不仅可以轻松使用ArcGISServer9.3发布的地图服务,或者其他免费的数据。本节就通过一个实例,来看看如何将Map作为底图数据。1、TilingScheme5、最后就是重写GetTileUrl方法。ie123、那么对于Map的前4个参数,如何取得呢?记得在Catalog中做缓存时,有一个LoadTilingSchemefromMap吗?按照这个TilingScheme将一个地图服务做缓存,然后查1.publicclass publicoverridevoid{this.FullExtent= 7.-85.0511287798066,180, SpatialReference= this.SpatialReference=this.TileInfo=new{Height=Width=Origin= .342787)//Origin= SpatialReference= Lods=new doubleresolution=for(inti=0;i<TileInfo.Lods.Length;{TileInfo.Lods[i]=newLod(){Resolution=resolutionresolution/= publicoverridestringGetTileUrl(intlevel,introw,int{//maps//stringbaseUrl //stringurl=baseUrl+col.ToString()+"&y="+row.ToString()+"&z="+level.ToString()+"&s=";//return////mapsstringbaseUrl= stringurl=baseUrl+col.ToString()+"&y="+row.ToString()++level.ToString()+return 中查不到,但在ServiceDirecotry中可以找到,是102113。另外,重写DynamicMapServiceLayer也之后也可以按照这个TilingScheme对自己的服务作缓存,自己的数据和Map便可以叠加在一起了。但是这样子使用Map的数据不仅担心会被封IP,而且更重要的是问题,毕竟不像JSAPI(有ArcGISJavaScriptExtensionfortheMapsAPI)或者FlexAPI(有MapAPIforFlex)。别忘了MS有自己的VirtualEarth,下一节中就来看看如何在我们的程序中名正言顺的使用VE的数据吧。ArcGISArcGISAPIforSilverlight开 SilverlightAPI中还包括了一个 的VirtualEarth服务。目前SilverlightAPI中提供的VirtualEarth服务有三种:Map,Geocode和直接看如何使用它的Map服务获取地图数据吧。同前,新建一个Silverlight.ArcGIS.dll .ArcGIS.VirtualEarth.dll的引入xml命名空间,在xaml里面这样写 可以看出,和添加其他图层基本是一样的。SIlverlightAPI中针对VE地图的图层类型是TileLayer,LayerStyle有三种:Road,AerialAerialWithLabels,分别对应矢量图,影像图和带街道标注的影键的token属性没有设置。VE的服务那是相当安全,每次VE的服务,都要提供一个token(一个加密字符串)来进验证,而这个token又是根据TokenService自动生成的,要通过TokenService生成一个token,又需 VirtualEarthtformdeveloperaccount……明白了这个过程,就来做我们 VirtualEarthtformdeveloperaccount,当然之前你还得有一服务,如果要把它变成Production版本,可以通过邮件联系微软,然后缴费; VirtualEarth tformdeveloperaccount和windowsserver2008是一样的),我们平常肯定不会这样设置,为了以防万一,建议赶紧把设没准哪天就忘了现在就可以用这个账户和来TokenService,通过它生成token,交给token这样办:1、通过装Silverlightaspx页面的Page_Load方法,来申请我们的token,并把它添加到中,赋给TileLayer。1、通过TokenService申请webappaddwebreference,url privatestringVEAccountPassword="你的";{ commenservice= commenservice.Credentials=new{ { stringtoken=token= 29.2、Silverlight插件载入时读出这个token。在App.xaml.cs中:1.privatevoidApplication_Startup(objectsender,StartupEventArgs VEtoken=this.RootVisual=new foreach(Layerlayerinif(layeris (layerasTileLayer).Token=(Application.Currentas 终于能看见VE的图了。当然,我们的开发账户是免费的,所以地图上有很多“Staging”麻点(每个至此,ArcGISAPIforSilverlight

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论