ArcGISAPIForSilverlight实例分析.doc_第1页
ArcGISAPIForSilverlight实例分析.doc_第2页
ArcGISAPIForSilverlight实例分析.doc_第3页
ArcGISAPIForSilverlight实例分析.doc_第4页
ArcGISAPIForSilverlight实例分析.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

ArcGIS API For Silverlight 实例分析-功能篇(一):图层可见性控制这一篇我们给地图加上图层可见性的控制。在开始之前需要说明一下,这里的图层和之前两篇提到的图层不是一个概念,这里的图层概念是和ArcMap里所对应的图层概念。也对于之前的“图层”,我们可以通过设置Visible属性来操作其可见性。 首先看一下效果:添加地图控件,叠加两个“图层”,一个是缓存后的瓦片层,作底图效果,另一个动态“图层”,是可见性控制的对象。 复制代码添加显示和控制图层的任务框 复制代码这里用到一个listBox来显示图层,它的子项模板是由一个checkBox,一个Image,一个TextBlock构成,其中checkBox采用双向绑定的方式,以方便更改其状态后,在后台设置图层的可见性。 完成界面的设置后,就开始Code-Behinde的编写设计类LayerListData,是图层信息类 / / 图层类 / public class LayerListData:INotifyPropertyChanged private bool _visible; private string _layerName; private int _layerIndex; / / 是否可见 / public bool Visible get return _visible; set _visible = value; proPertychange(Visible); / / 图层的名称 / public string LayerName get return _layerName; set _layerName = value; proPertychange(ServiceName); / / 图层的ID / public int LayerIndex get return _layerIndex; set _layerIndex = value; proPertychange(ServiceName); / / 触发属性改变事件的方法 / / private void proPertychange(string ProName) if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(ProName); #region INotifyPropertyChanged 成员 public event PropertyChangedEventHandler PropertyChanged; #endregion 复制代码这个类实现接口INotifyPropertyChanged以达到属性改变时通知代码做出相应的更改。 在Page里实现相应的功能首先声明一个动态图层的全局变量并在初始化完成是绑定显示图层和可见性 private ArcGISDynamicMapServiceLayer DynamicLayer; public Page() InitializeComponent(); / /动态图层初始化完成时 / / / private void ArcGISDynamicMapServiceLayer_Initialized(object sender, EventArgs e) DynamicLayer = MainMap.LayersDynamicLayer as ArcGISDynamicMapServiceLayer; if (DynamicLayer = null) throw (new Exception(动态图层不对); LayerVisibilityListBox.ItemsSource=BindingLayerList(); / / 绑定图层 / private List BindingLayerList() List LayerList = new List(); List visibleLayerList = new List(); foreach (LayerInfo Layer in DynamicLayer.Layers) LayerListData Ldata= new LayerListData() LayerIndex = Layer.ID, LayerName = Layer.Name, Visible = Layer.DefaultVisibility ; /如果图层可见,把它加入到可见图层列表中 if(Layer.DefaultVisibility) visibleLayerList.Add(Layer.ID); Ldata.PropertyChanged += new PropertyChangedEventHandler(Ldata_PropertyChanged); LayerList.Add(Ldata); DynamicLayer.VisibleLayers = visibleLayerList.ToArray(); return LayerList; 复制代码然后是属性改变时,更改图层的可见性: / / 属性发生改变时 / / / void Ldata_PropertyChanged(object sender, PropertyChangedEventArgs e) if (e.PropertyName.Trim() != Visible) return; LayerListData LData = sender as LayerListData; int layerIndex = LData.LayerIndex; Boolean visible = LData.Visible; /得到可见图层列表 List visibleLayerList = DynamicLayer.VisibleLayers != null ? DynamicLayer.VisibleLayers.ToList() : new List(); /设置可见图层列表中的内容,并将其赋值给DynamicLayer.VisibleLayers if (visible) if (!visibleLayerList.Contains(layerIndex) visibleLayerList.Add(layerIndex); else if (visibleLayerList.Contains(layerIndex) visibleLayerList.Remove(layerIndex); DynamicLayer.VisibleLayers = visibleLayerList.ToArray(); 复制代码(文/张亚)ArcGIS API For Silverlight 实例分析-功能篇(二):在地图上 “画图”这一节,我们来看这样的一个例子:实现在地图上 “画图”的效果。很多工具比如点选、框选还有查询结果的展示等等都是在它基础上完成的。还是先看看效果。frame=600,400/invoke/102987/Draw/iframe.html/frame创建一个Silverlight工程,在默认的MainPage.xaml(2.0时是叫Page.xaml)里,编写代码如下: 复制代码绘画要用到一个很重新的类:ESRI.ArcGIS.Client.Draw,它提供了画图的方式。因为这里的几个工具都要用到它,所有我们把它声明为一个全局变量。另外,我们在Map里添加了一个名为MyGraphicsLayer的GraphicsLayer,它是把画的图形显示出来的图层。以下的代码都是在MainPage.xaml.cs文件里添加. / / 全局变量:绘图用 / private Draw draw; / / 全局变量:绘图层 / private GraphicsLayer gra;复制代码在初始化函数里,初始化全局变量。这里需要说明的是:Draw的属性中LineSymbol是画线,任意线时所用到的临时符号,FillSymbol则是画框、面时所用到的临时符号。事件DrawComplete固名思义就知道是完成绘制所触发的事件。 public MainPage() InitializeComponent(); /初始化变量 gra = this.MyMap.LayersMyGraphicsLayer as GraphicsLayer; draw = new Draw(this.MyMap) LineSymbol = new LineSymbol() Color = new SolidColorBrush(Colors.Red), Width = 2 , FillSymbol=new SimpleFillSymbol() BorderBrush = new SolidColorBrush(Colors.Red) , BorderThickness = 2, Fill = new SolidColorBrush(Colors.Green) Opacity = 0.5 , ; /注册事件 draw.DrawComplete += new EventHandler(draw_DrawComplete); 复制代码添加DrawComplete事件函数。我们需要在该函数里把所绘制的图形保存在GraphicsLayer里,才能起到显示的效果。Graphic的属性Symbol是显示出来的符号类型,我们根据不同几何形状选择相应的符号。 / / 绘画完成后,显示出来/ / / private void draw_DrawComplete(object sender, DrawEventArgs e) gra.Graphics.Add( new Graphic() Geometry=e.Geometry, Symbol=GetSymbol(e.Geometry,Colors.Blue) );/ / 根据几何要素取得对应的渲染符号/ / / public Symbol GetSymbol(ESRI.ArcGIS.Client.Geometry.Geometry ge, Color color) if (ge is MapPoint) return new SimpleMarkerSymbol() Color = new SolidColorBrush(color), Size = 10, Style = ESRI.ArcGIS.Client.Symbols.SimpleMarkerSymbol.SimpleMarkerStyle.Circle ; else if (ge is ESRI.ArcGIS.Client.Geometry.Polyline) return new LineSymbol() Color = new SolidColorBrush(color), Width = 3 ; else if (ge is ESRI.ArcGIS.Client.Geometry.Polygon | ge is ESRI.ArcGIS.Client.Geometry.Envelope) Symbol MySm = new SimpleFillSymbol() BorderBrush = new SolidColorBrush(color) , BorderThickness = 3, Fill = new SolidColorBrush(Colors.Green) Opacity = 0.5 ; return MySm; return null;复制代码最后就是完成在XAML文件里注册的工具事件函数。需要说明的是:Draw的属性DrawMode即是画图的类型。 / / 工具按钮按下后 / / / private void Button_Click(object sender, RoutedEventArgs e) Button button = sender as Button; string modetype = button.Content.ToString(); /设置绘画的方式 switch(modetype) case 点: draw.DrawMode = DrawMode.Point; break; case 线: draw.DrawMode = DrawMode.Polyline; break; case 面: draw.DrawMode = DrawMode.Polygon; break; case 框: draw.DrawMode = DrawMode.Rectangle; break; case 任意: draw.DrawMode = DrawMode.Freehand; break; case 取消: draw.DrawMode = DrawMode.None; break; case 清空: gra.Graphics.Clear(); return; /激活工具 draw.IsEnabled = true; 复制代码编译运行。OK!接下来几节会在这个基础之上,实现放大缩小,点选、框选等功能。ArcGIS API For Silverlight 实例分析-功能篇(三) :放大缩小等导航功能 题记: ESRI公司已经发布了正式版的API for Silverlight,微软Silverlight 3.0正式版也已发布Silverlight给Web GIS 带来的许多新特性也正在被越来越多的人所关注本系列文章是以ESRI公司所提供的实例为基础,全面感受Arcgis api for Silverlight 带来的超炫效果窗体顶端 这一节,我们实现地图控件的导航功能。还是先看看效果。 1 创建一个Silverlight工程,在默认的MainPage.xaml里,编写代码如下: 2 在放大缩小时,有一个拉框的效果,因此,也是要添加一个画图层,用来显示拉框,同样声明一个全局变量。同时为了区分不同的工具,声明一个工具类型的枚举并定义一个表示当前工具的属性。/ /全局变量:绘图用 / privateDrawdraw; / /全局变量:绘图层 / privateGraphicsLayergra; / /声明一个工具枚举 / public enumToolType 放大, 缩小, / /当前的地图工具 / privateToolTypeCurrentToolType get; set; 3 同样,在初始化事件里,初始化所有变量。这里Draw的对象只用绘制放大缩小时所用的框,因此,在初始化进就给DrawMode属性赋值。 publicMainPage() InitializeComponent(); /初始化变量 gra = this.MyMap.LayersMyGraphicsLayer asGraphicsLayer; draw = newDraw(this.MyMap) LineSymbol = newLineSymbol() Color = newSolidColorBrush(Colors.Red), Width = 2 , FillSymbol=newSimpleFillSymbol() BorderBrush = newSolidColorBrush(Colors.Red) , BorderThickness = 2, Fill = newSolidColorBrush(Colors.Green) Opacity = 0.5 , DrawMode=DrawMode.Rectangle, ; /注册事件 draw.DrawComplete += newEventHandler(draw_DrawComplete); 4 实现在XAML里声明的工具事件函数。平移是地图控件默认的操作,因此,只需要关闭Draw功能就行了。全图功能就是把当前视图范围缩放到图层的全图范围。/ /工具按钮按下后 / / / private voidButton_Click(objectsender, RoutedEventArgse) Buttonbutton = sender asButton; stringmodetype = button.Content.ToString(); /设置绘画的方式 switch(modetype) case放大: CurrentToolType = ToolType.放大;

温馨提示

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

评论

0/150

提交评论