实验三操作步骤_第1页
实验三操作步骤_第2页
实验三操作步骤_第3页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、实验三一图层符号选择器的实现1摘要:我们要实现的是图层符号选择器,与ArcMap 的Symbol Selector的类似。本讲较前 几讲而言,些许有些复杂,不过只要仔细琢磨,认真操作,你就很容易实现如卜所示的符号 选择器。因为本讲篇幅较长,故我将其分成两个阶段,这是第一阶段。图1在AE开发中,符号选择器冇两种实现方式。一是在程序中直接调用ArcMap中的符号选择器,如卜所示:区)Category:| AllGreenPreviewOptions RU Color:HolowRoseOuthne Widh: |040BeigeYe»owOliveOutlne Color:GreenJa

2、deBlueSyabol Selector二是自定义符号选择器,如图1所示。由于第一种方式前提是必须安装ArcGIS Desktop.其界面还是英文的,而对二次开发來说, 人局部用户希望应该是中文界而。因此开发人员通常选择第二种方式,本讲也着重讲解第二 种方式。自定义符号选择器AE9.3提供了 SymbologyControl控件,极大的方便了图层符号选择器的制作。本讲实现的符 号选择器有如下功能。用户双击TOCControl控件中图层的符号时,弹出选择符号对话框,对话框能够根据图层类 型自动加我相应的符号,如点、线、面。用户可以调協符号的颜色、线宽、角度等参数。还 可以翻开自定义的符号文件(

3、*.ServerStyle),加載更多的符号。新建Winodws窗体,命名为SymbolSelectorFrm,修改窗体的Text属性为"选择符号"。并 添加 SymbologyControk GroupBox. PictureBox. Button. Label. NumericUpDown ColorDialog. OpenFileDialog、ContextMenuStrip 控件<> 控件布局如卜所示:AE9.2提供了 SymbologyControl控件,极人的方便了图层符号选择器的制作。本讲实现的符 号选择器有如下功能。用户双击TOCControl控

4、件中图层的符号时,弹出选择符号对话框,对话框能够根据图层类 型自动加载相应的符号,如点、线、面。用户可以调整符号的颜色、线宽、角度等参数。还 可以翻开自定义的符号文件(*.ServerStyle),加我更多的符号。图32设置控件属性设盘相应控件的相关属性,如卜我所示空那么不用修改:控件Name属性Text属性其它SymbologyC on trolaxSymbologyControlPictureBoxptbPreviewLabelIbIColor颜色LabelIblSize大小LabelIbIWidth线宽LabelIblAngle角度LabelIblOutlineColor外框颜色Nume

5、ricUpDownnudSizeNumericlIpDow nn udWidthNumericlIpDow nn udAngleButtonbtnColor设亘为空ButtonbtnOutlineColor设置为空ButtonbtnMoreSymbols更多符号ButtonbtnOK确定DialogResult 属性设 为0KButtonbtnCa ncel取消GroupBoxgroupBoxl预览GroupBoxgroupBox2设置ColorDialogcolorDialogOpenFileDialogOpenFileDialogFilt祈属性设豐为: Styles文 件.ServerSt

6、yleContextMenuStripcontextMenuStripMoreSymbol3添加引用在解决方案资源管理器中添加ArcGIS Engine的引用,在SymbolSelectorFrm.cs文件中添加如卜引用代码:using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Display;using ESRI.ArcGIS.esriSystem;using ESRI.ArcGIS.SystemUI;using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.Geodatabase;4 初始化(1) 添加SymbolSelecto

7、rFrm的全局变量,代码如下:private IStyleGalleryltem pStyleGalleryltem;private ILegendClass pLegendClass;private I Layer pLayer;public ISymbol pSymbol;public Image pSymbollmage;(2) 修改SymbolSelectorFrm的构造函数,传入图层和图例接II。代码如下:III <summary>/构造函数,初始化全局变量III </summary>III <param name=,ltempLegendClass&q

8、uot;>TOC 图例</param>III <param name="tempLayer">图层</param>public SymbolSelectorFrm(ILegendClass tempLegendClass, I Layer tempLayer)In itializeComponentf);this.pLege ndClass = tempLegendClass;this.pLayer = tempLayer; 添加 Symbolcontrol 的 SymbologyStyleClass 设置函数 SetFeature

9、ClassStyle()» 代码如 b :III <summary>III初始化SymbologyControl的StyleClass,图层如果己有符号,那么把符兮添加到 SymbologyControl中的第一个符号,并选中/</summary>III <param name=,symbologyStyleClass,x/param>private void SetFeatureClassStyle(esriSymbologyStyleClass SymbologyStyleClass)this.axSymbologyControl.StyleC

10、lass = SymbologyStyleClass;ISymbologyStyleClasspSymbologyStyleClass=this.axSymbologyC on trol.GetStyleClass(symbologyStyleClass);if (this.pLegendClass != null)IStyleGalleryltem currentStyleGalleryltem = new ServerStyleGalleryltem();currentStyleGalleryltem.Name ="当前符号"currentStyleGallerylte

11、m.ltem = pLegendClass.Symbol;pSymbologyStyleClass.AddltemfcurrentStyleGalleryltem);this.pStyleGalleryltem = currentStyleGalleryltem;pSymbologyStyleClass.Selectltem(O);(4) 添加注册表读取函数ReadRegistryO,此函数从注册表中读取ArcGIS的安装路径,代码 如下:/<summary>III从注册表中取得指定软件的路径/</summary>III <param name=nsKey&quo

12、t;></param>III <returns></returns>private string ReadRegistry(string sKey)/Open the subkey for readingMicrosoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey/ true);if (rk = null) return ,M,;/ Get the data from a specified item in the key.return (s

13、tringlrk.GetValuef'InstallDir");(5) 添加SymbolSelectorFrm的Load jf件。根据图层类型为SymbologyControl 4?入相应的 符号样式文件,如点、线、面,并设置控件的可视性。代码如下:private void SymbolSelectorFrm_Load(object sender, EventArgs e)取得ArcGIS安装路径string slnstall = ReadRegistryfOFTWAREWESRlWCoreRuntime");this.axSymbologyControl.Load

14、StyleFile(slnstall + "WStylesWESRI.ServerStyle");确定图层的类型(点线面),设置好SymbologyControl的StyleClass,设置好各控件的町见性 (visible)IGeoFeatureLayer pGeoFeatureLayer = (IGeoFeatureLayer)pLayer;switch (IFeatureLayer(pLayer).FeatureClass.ShapeType)case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint:th

15、is.SetFeatureClassStyle(esriSymbologyStyleClass.esriStyleClassMarkerSymbols);this.lblAngle.Visible = true;this.nudAngle.Visible = true;this.lblSize.Visible = true;this.nudSize.Visible = true;this.lbIWidth.Visible = false;this.nudWidth.Visible = false;this.lblOutlineColor.Visible = false;this.bt nO u

16、tlineColor.Visible = false;break;case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:this.SetFeatureClassStyle(esriSymbologyStyleClass.esriStyleClassLineSymbols);this.lblAngle.Visible = false;this.nudA ngle.Visible = false;this.lblSize.Visible = false;this.nudSize.Visible = false;this.lb

17、lWidth.Visible = true;this.nudWidth.Visible = true;this.lblOutlineColor.Visible = false;this.btnOutlineColor.Visible = false;break;case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:this.SetFeatureClassStyle(esriSymbologyStyleClass.esriStyleClassFillSymbols);this.lblAngle.Visible = false

18、;this.nudAngle.Visible = false;this.lblSize.Visible = false;this.nudSize.Visible = false;this.lblWidth.Visible = true;this.nudWidth.Visible = true;this.lblOutlineColor.Visible = true;this.bt nO utlineColor.Visible = true;break;case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryMultiPatch:this.Se

19、tFeatureClassStyle(esriSymbologyStyleClass.esriStyleClassFillSymbols);this.lblAngle.Visible = false; this.nudAngle.Visible = false; this.lblSize.Visible = false; this.nudSize.Visible = false; this.lbIWidth.Visible = true; this.nudWidth.Visible = true; this.lblOutlineColor.Visible = true; this.bt nO

20、utlineColor.Visible = true; break;default:this.Closef);break;(6) 双击确定按钮和取消按钮,分别添加如卜代码:/<summary>III确定按钮/ </summary>III <param name=,lsender,x/param>III <param name=HeH></param>private void btnOK_Click(object sender, EventArgs e)取得选定的符号this.pSymbol = (ISymbol)pStyleGalle

21、rylte rrd tem;更新预览图像this.pSymbollmage = this.ptbPreview.lmage;关闭窗体this.Close();/<summary>/収消按钮/</summary>III <param name=usender,x/param>III <param name=,eHx/param>private void btnCancel_Click(object sendee EventArgs e)this.Closef);(7:为了操作上的方便,我们添加SymbologyControl的DoubleClick

22、爭件,当双击符号时同 按下确定按钮一样,选定符号并关闭符号选择器窗体。代码如下:/<summary>III双击符号同单击确定按钮,关闭符号选择器。/</summary>III <param name=,sender,x/param>Ill <param name="e"x/param>privatevoidaxSymbologyControLOnDoubleClick(objectsender,ESRI.ArcGIS.Controls.lSymbologyControlEvents_OnDoubleClickEvent e)t

23、his.bt nOK.PerformClick();再添加符号预览函数,当用户选定某一符号时,符号可以显示在PictureBox控件中, 方便预览,函数代码如下:/<summary>III把选中并设置好的符号在picturebox控件中预览/</summary>private void Previewlmage()stdolePictureDisppicture=this.axSymbologyControl.GetStyleClassfthis.axSymbologyC on trol.StyleClass).Previewltem(pStyleG allerylte

24、m, this.ptbPreview.Width, this.ptbPreview.Height);System .Drawingage image =Syste m. Drawingm age.FromHbitmap(newSystem.lntPtr(picture.Handle);this.ptbPreview Jmage = image;(9)当SymbologyControl的样式改变时,需要重新i殳宜符号参数调整控件的可视性,故要 添加SymbologyControl的OnStyleClassChanged事件.事件代码与Load事件类似,如卜:/<summary>III

25、肖样式(Style)改变时,重新设置符号类型和控件的可视性/</summary>III <param name=MsenderMx/param>Ill <param name=,e,x/param>sender,privatevoidaxSymbologyControl_OnStyleClassCha nged(objectESRI.ArcGIS.Controls.lSymbologyControlEventsOnStyleClassChangedEvent e)switch (esriSymbologyStYleClass)(e.symbologyStyl

26、eClass)case esriSymbologyStyleClass.esriStyleClassMarkerSymbols:this.lblAngle.Visible = true;this.nudA ngle. Visible = true;this.lblSize.Visible = true;this.nudSize.Visible = true;this.lbIWidth.Visible = false;this.nudWidth.Visible = false;this.lblOutlineColor.Visible = false;this.btnOutlineColor.Vi

27、sible = false;break;case esriSymbologyStyleClass.esriStyleClassLineSymbols:this.lblAngle.Visible = false;this.nudAngle.Visible = false;this.lblSize.Visible = false;this.nudSize.Visible = false;this.lbIWidth.Visible = true;this.nudWidth.Visible = true;this.lblOutlineColor.Visible = false; this.btnOut

28、lineColor.Visible = false; break;case esriSymbologyStyleClass.esriStyleClassFillSymbols: this.lblAngle.Visible = false;this.nudA ngle. Visible = false;this.lblSize.Visible = false;this.nudSize.Visible = false;this.lblWidth.Visible = true; this.nudWidth.Visible = true; this.lblOutlineColor.Visible =

29、true; this.btnOutlineColor.Visible = true;break;5调用自定义符号选择器通过以上操作,本符号选择器雏形已经完成,我们町以3sdnMap主窗体中调用并进行测试。 如来您已经完成“直接调用ArcMap中的符号选择器这一节,请注释 axTOCControll_OnDoubleClick爭件响应函数里的代码,并添加如下代码。如果您是直接学习 自定义符号选择器这一节的,请先添加axTOCControll控件的0nDoubleClick爭件,再添加如 下爭件响应函数代码:/<summary>Ill双击TOCControl控件时触发的爭件/</

30、summary>III <param name=Hsender"x/param>III <param name=,e,x/param>privatevoidaxTOCControll_ On DoubleClick(objectsender,ITOCControlEvents_OnDoubleClickEvent e)esriTOCControlltem itemType = esriTOCControlltem.esriTOCControlltemNone;IBasicMap basicMap = null;I Layer layer = null;o

31、bject unk = null;object data = null;axTOCC on troll.HitTestfe.x, e.y, ref itemType, ref basicMap, ref layer, ref unkz ref data);if (e.butto n = 1)if(itemType=esriTOCControlltem.esnTOCControlltemLegendClass)取得图例I LegendClass pLegendClass = (ILegendGroup)unk).get_Class(int)data);创立符号选择器Symbolselector实

32、例SymbolSelectorFrmSymbolSelectorFrm=newSymbolSelectorFrmfpLegendClass, layer);if (SymbolSelectorFrm.ShowDialog() = DialogKesult.OK)局部更新主Map控件m_mapControl.ActiveView.PartialRefreshfesriViewDrawPhase.esriViewGeography, null, null);设置新的符号pLegendClass.Symbol = SymbolSelectorFrm.pSymbol;更新主Map控件和图层控件this

33、.axMapControll.ActiveView.Refresh();this.axTOCControll.Refresh();在地图整饰中.符号参数的调整是必须的功能。卜面我们将实现符号颜色、外框颜色、线宽、 角度等参数的调整。(1) 添加SymbologyControl的OnltemSelected事件,此爭件在鼠标选中符号时触发,此时显示出选定符号的初始参数事件响应函数代码如下:/<summary>III选中符号时触发的爭件/</summary>Ill <param name=Hsender"x/param>III <param na

34、me=,e"x/param>privatevoidaxSymbologyControl_ On ltemSelected(objectsen dei;ESRI.ArcGIS.Controls.lSymbologyControlEvents_OnltemSelectedEvent e)pStyleGalleryltem = (IStyleGalleryltem)e.styleGalleryltem;Color color;switch (this.axSymbologyControl.StyleClass)点符号case esriSymbologyStyleClass.esriS

35、tyleClassMarkerSymbols:color=this.ConvertlRgbColorToColor(IMarkerSymbol)pStyleGalleryltem.ltem).Color as IRgbColor);设置点符号角度和人小初始值this.nudAngle.Value=(decimal)(IMarkerSymbol)this.pStyleGalleryltem.ltem).Angle;this.nudSize.Value = (decimal)(IMarkerSymbol)this.pStyleGalleryltem.ltem).Size;break;线符号case

36、 esriSymbologyStyleClass.esriStyleClassLineSymbols:color = this.ConvertlRgbColorToColor(ILineSymbol)pStyleGalleryltem.ltem).Color as IRgbColor);设置线宽初始值this.nudWidth.Value = (decimal)(IUneSymbol)this.pStyleGalleryltem .ltem).Width;break;而符号case esriSymbologyStyleClass.esriStyleClassFillSymbols:color

37、= this.ConvertlRgbColorToColor(IFillSymbol)pStyleGalleryltem.ltem).Color as IRgbColor);this.btnOutlineColor.BackColor=this.ConvertlRgbColorToColor(IFillSymbol)pStyleGalleryltem.ltem).Outline.Color as IRgbColor);设置外框线宽度初始值this.nudWidth.Value=(decimal)(IFillSymbol)this.pStyleGalleryltem.ltem).Outline.

38、Width;break;default:color = Color.Black;break;设置按钮背景色this.bt nColor.BackColor = color;预览符号this.Previewlmage();(2) 调整点符号的人小 添加nudSize 件的ValueChanged H件.艮卩在控件的怕:改变时响应此爭件.然后申新设貿点 符号的大小。代码如下:/<summary>III调整符号大小点符号III </summary>III <param name=,lsender"x/param>III <param name=,e

39、"x/param>private void nudSize_ValueChanged(object sender, EventArgs e)(IMarkerSymbol)this.pStyleGalleryltem.Item).Size = (double)this.nudSize.Value;this.Previewlmage();(3) 调整点符号的角度添加nudAngle控件的ValueChanged事件,以重新设置点符号的角度。代码如下:/<summary>III调整符号角度点符号/ </summary>III <param name=,l

40、sender,x/param>III <param name=,e,x/param>private void nudAngle_ValueChanged(object senderz EventArgs e)(IMarkerSymbol)this.pStyleGalleryltem.ltem).Angle = (double)this.nudAngle.Value;this.Previewlmage();(4) 调整线符号利面符号的线宽添加nudWidth控件的ValueChanged V件,以重新设置线符号的线宽和面符号的外框线的线 宽。代码如下:III <summa

41、ry>/调整符号宽度限于线符号和面符号/</summary>III <param name=,sender,x/param>III <param name=Me"></param>private void nudWidth_ValueChanged(object sendee EventArgs e)switch (this.axSymbologyControl.StyleClass)case esriSymbologyStyleClass.esriStyleClassLineSymbols:(ILineSymbol)this.p

42、StyleGalleryltem.ltem).Width=Convert.ToDouble(this.nudWidth.Value);break;case esriSymbologyStyleClass.esriStyleClassFillSymbols:取得面符号的轮娜线符号ILineSymbol pLineSymbol = (IFillSymbol)this.pStyleGalleryltem.ltem).Outline;pLineSymbol.Width = Convert.ToDouble(this.nudWidth.Value);(IFillSymbol)this. pStyleGa

43、lleryltem. Item). Outline = pUneSymbol;break;this.Previewlmage();(5) 颜色转换在ArcGIS Engine中,颜色由IRgbColor接I I实现,而在.NET框架中,颜色那么由Color结构表 示。故在调整颜色参数Z前,我们必须完成以上两种不同颜色表示方式的转换。关于这两种 颜色结构的具体信息,请人家自行查阅相关资料。下面添加两个颜色转换函数。ArcGIS Engine中的IRgbColor接I I转换至.NET中的Color结构的萌数:/<summary>/</summary>III <par

44、am name=,pRgbColor,'>IRgbColor</param>/<returns>.NET 中的 System.Drawing.Color 结构表示 ARGB 颜色</returns>public Color ConvertlRgbColorToColor(IRgbColor pRgbColor)return ColorTranslator.FromOle(pRgbColor.RGB);NET中的Color结构转换至于ArcGIS Engine中的IColor接I 1的函数:/<summary>III将.NET中的Co

45、lor结构转换至于ArcGIS Engine中的IColor接I I/</summary>III <param name="color">.NET 中的 System.Drawing.Color 结构表示 ARGB 颜色</param>III <returns>IColor</returns>public IColor ConvertColorTolColor(Color color)IColor pColor = new RgbColorClassf);pColor.RGB = color.B * 65536 +

46、 color.G * 256 + colorR;return pColor;(6) 调整所有符号的颜色选择颜色时,我们调用.NET的颜色对话框ColorDialog,选定颜色后,修改颜色按钮的背景 色为选定的颜色,以方便预览。双击btnColor按钮,添加如下代码:/<summary>III颜色按钮/</summary>III <param name=Hsender"x/param>III <param name=,e"></param>private void btnColor_Click(object send

47、ee EventArgs e)调用系统颜色対话框if (this.colorDialog.ShowDialogf) = DialogResult.OK)将颜色按钮的背景颜色设宣为用户选定的颜色this.bt nColor.BackColor = this.colorDialog.Color;设置符号颜色为用户选定的颜色switch (this.axSymbologyControl.StyleClass)点符号case esriSymbologyStyleClass.esriStyleClassMarkerSymbols:(IMarkerSymbol)this.pStyleGalleryltem

48、.ltem).Colorthis.ConvertColorTolColor(this.colorDialog.Color);break;线符号case esriSymbologyStyleClass.esriStyleClassLineSymbols:(ILineSymbol)this.pStyleGalleryltem.ltem).Colorthis.ConvertColorTolColor(this.colorDialog.Color);break;面符兮case esriSymbologyStyleClass.esriStyleClassFillSymbols:(IFillSymbol)

49、this.pStyleGalleryltem.ltem).Colorthis.C onv ertColorTolColor(this.colorDialog.Color);break;更新符号预览this.Previewlmage();(刀调整面符号的外框线颜色同上一步类似,双击btnOutlineColor按钮.添加如卜代码:/<summary>III外框颜色按钮/</summary>III <param name=,sender,x/param>III <param name=Me"></param>private vo

50、id btnOutlineColor_Click(object sender, Eve nt Args e)if (this.colorDialog.ShowDialog() = DialogResult.OK)取得面符号中的外框线符号ILineSymbol pLineSymbol = (IFillSymbol)this.pStyleGalleryltem.ltem).Outline;设趕外框线颜色pLineSymbol.Color = this.ConvertColorTolColor(this.colorDialog.Color);币新设置面符号中的外框线符号(IFillSymbol)th

51、is.pStyleGalleryltem.ltem).Outline = pLineSymbol;设置按钮背景颜色this.bt nO utlineColor.BackColor = this.colorDialog.Color;更新符号预览this.Previewlmage();至此.你可以编译运行程序,看看效果如何,是不是感觉很不错了?我们己经能够 修改符号的参数,自定义符号了。但是,SymbologyControl默认加載的是ESRI.ServerStyle文件的样式,用过ArcMap的 你可能已经注意到,ArcMap中的Symbol Selector有一个“More Symbols&q

52、uot;按钮,可以加裁 其它的符号和ServerStyle文件。3sdnMap当然"一个都不能少。(二)添加更多符号菜单还记得我们在开始的时候添加了 ContextMenuStrip控件吗?现在它终于派上用场了。我们要 实现的功能是:单击“更多符号弹出菜单(ContextMenu),菜单中列出了 ArcGIS自带的 其它符号,勾选相应的菜单项就町以在SymbologyControl中增加相应的符弓。在菜单的放后 一项为哪一项“添加符号,选择这项时,将弹出翻开文件对话框,我们可以由此选择其它的 ServerStyle文件,以加载更多的符号。(1)定义全局变量在SymbolSelecto

53、rFrm中定义如下全局变屋,用于判断菜单是否己经初始化。菜单是否己经初始化标志bool contextMe nuMoreSymboll nitiated = false;(2)双击“更多符号"按钮,添加Click出件。在此爭件响应函数中,我们要完成Serverstyle文件的读取,将其文件名作为菜单项名称生 成菜单并显示菜单。代码如下:/<summary>III “更多符号按下时触发的事件/</summary>III <param name=nsender"></param>III <param name="e

54、,x/param>private void btn MoreSymbols_Click(object sen dec Eve ntArgs e)if (this.contextMenuMoreSymbollnitiated = false)string slnstall = ReadRegistryCSOFTWAREWESRlWCoreRuntime11);string path = System.IO.Path.Combine(slnstalL "Styles");取得菜单项数量string styleNames = System.10.Directory.GetFiles(path, ".ServerStyle");ToolStripMenultemsymbolContextMe nultem=newToolStripMenultemstyleNames 丄 ength + 1;循环添加其它符号菜单项到菜单for (int i =

温馨提示

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

评论

0/150

提交评论