欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Arcgis Engine 实现单波段栅格图层色带渲染(包括色带反转)

发布时间:2024/3/12 编程问答 55 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Arcgis Engine 实现单波段栅格图层色带渲染(包括色带反转) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

    最近有同事问我ArcMap中的色带反转怎么实现,刚好我在整理以前的项目,找到了一些源码备忘。

            

    先说下思路,简单来说就是得到栅格图层的IRasterRenderer,转换为IRasterStretchColorRampRenderer,在将这个接口转换为IRasterStretch,IRasterStretch中有个Invert的方法可以控制色带是否反转。下面详细说下实现过程。

    1、重写一个可以添加图片的ComboBox

public partial class ComboboxSymbol : ComboBox{public ComboboxSymbol(){DrawMode = DrawMode.OwnerDrawFixed;DropDownStyle = ComboBoxStyle.DropDownList;}//重写函数protected override void OnDrawItem(DrawItemEventArgs e){e.DrawBackground();e.DrawFocusRectangle();try{//显示图片Image image = (Image)Items[e.Index];System.Drawing.Rectangle rect = e.Bounds;e.Graphics.DrawImage(image, rect);}catch{}finally{base.OnDrawItem(e);}}}

2、设计一个窗体,就下图中的几个按钮,另外添加一个隐藏显示的AxSymbologyControl,用来调用显示系统色带

3、窗体下的代码如下

private IRasterLayer _pRasyerLayer = null;public ColorRamp(IRasterLayer pRasterLayer,int X,int Y){InitializeComponent();_pRasyerLayer = pRasterLayer;this.Location = new System.Drawing.Point(X, Y); //得到当前鼠标位置,用来确定窗体显示的位置}private void btnCancel_Click(object sender, EventArgs e){this.Close();}private void LoadSymbolProperty(IRasterLayer mRasterLayer){IRasterStretchColorRampRenderer pStretchRen;try{pStretchRen = (IRasterStretchColorRampRenderer)mRasterLayer.Renderer;IRasterStretch pRasterStretch = pStretchRen as IRasterStretch;if (pRasterStretch.Invert){ckInvert.Checked = true;}}catch (Exception ex){WriteLog.LogWritter.WriteLogToFile(ex.Message);return;}try{//加载系统样式string sInstall = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path;string defaultStyle = System.IO.Path.Combine(sInstall, "Styles\\ESRI.ServerStyle");axSymbologyControl1.LoadStyleFile(defaultStyle);axSymbologyControl1.StyleClass = esriSymbologyStyleClass.esriStyleClassColorRamps;ISymbologyStyleClass symbologyStyleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps);IStyleGalleryItem styleGalleryItem = new ServerStyleGalleryItem();styleGalleryItem.Item = pStretchRen.ColorRamp;styleGalleryItem.Name = "mySymbol";symbologyStyleClass.AddItem(styleGalleryItem, 0);symbologyStyleClass.SelectItem(0);//将样式转为图片并添加入ComboBoxfor (int i = 0; i < symbologyStyleClass.get_ItemCount(symbologyStyleClass.StyleCategory); i++){stdole.IPictureDisp picture = symbologyStyleClass.PreviewItem(symbologyStyleClass.GetItem(i), cbSymbol.Width, cbSymbol.Height);System.Drawing.Image image = System.Drawing.Image.FromHbitmap(new System.IntPtr(picture.Handle));cbSymbol.Items.Add(image);}if (cbSymbol.Items.Count > 0)cbSymbol.SelectedIndex = 0;}catch (Exception ex){WriteLog.LogWritter.WriteLogToFile(ex.Message);}}private void SetRasterSymbol(IRasterLayer mRasterLayer){try{//获取选择的序号int symbol_index = cbSymbol.SelectedIndex;ISymbologyStyleClass symbologyStyleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps);IStyleGalleryItem mStyleGalleryItem = symbologyStyleClass.GetItem(symbol_index);//获取选择的符号IColorRamp colorramp_select = (IColorRamp)mStyleGalleryItem.Item;IRasterStretchColorRampRenderer pStretchRen = (IRasterStretchColorRampRenderer)mRasterLayer.Renderer;pStretchRen.ColorRamp = colorramp_select;IRasterStretch pRasterStretch = pStretchRen as IRasterStretch;//控制色带是否反转if (ckInvert.Checked){pRasterStretch.Invert = true;}else{pRasterStretch.Invert = false;}}catch (Exception ex){WriteLog.LogWritter.WriteLogToFile(ex.Message);this.Close();}}private void ColorRamp_Load(object sender, EventArgs e){LoadSymbolProperty(_pRasyerLayer);}private void btnOk_Click(object sender, EventArgs e){SetRasterSymbol(_pRasyerLayer);this.DialogResult = DialogResult.OK;this.Close();}}

 

 

 

总结

以上是生活随笔为你收集整理的Arcgis Engine 实现单波段栅格图层色带渲染(包括色带反转)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。