4.7符号化之Renderer( 渲染)体系
ArcGIS Engine9.3对GIS数据的符号化分为矢量数据渲染和栅格数据渲染两大类。接下来分别介绍FeatureRender和RasterRender。
4.7.1FeatureRender对象
FeatureRenderer是一个抽象类,它有15个子类负责进行不同类型的着色运算。它们都实现了IFeatureRenderer接口,这个接口定义了进行要素图层符号化的公共属性和方法。
可以通过IGeoFeatureLayer::Renderer属性获得一个要素图层的符号化对象
表四
要素符号化类型 描述
简单符号化 SimpleRender
唯一值符号化 UniqueValueRender
双变量唯一值符号化 BiUniqueValueRender
图表符号化 ChartRender
分类等级符号化 ClassBreaksRenderer
点密度符号化 DotDensityRenderer
根据属性值设置符号大小进行符号化 ProportionalSymbolRenderer
依比例尺符号化 ScaleDependentRenderer
制图表达符号化 RepresentationRenderer
轨迹符号化(应用于TrackingAnaylyst扩CoTrackSymbologyRenderer(TrackingAnalyst) 展模块)
增强信息符号化(应用于EnhancedInfoRenderder(TrackingAnalyst) TrackingAnaylyst扩展模块)
唯一值文本符号化(应用于UniqueValueTextRenderer(TrackingAnalyst)
TrackingAnaylyst扩展模块)
停止符号化(应用于网络分析扩展模块) NAStopRenderer(NetworkAnalyst)
要素定点符号化(应用于测量分析扩展模FeatureVertexRenderer(SurveyExt) 块)
用于绘制拓扑元素 SharedEdgeRenderer(EditorExt)
常用的要素符号化类型主要有以下6种类型,如图13所示:
图13
由于篇幅有限不再对每一种符号化类型的使用进行讲解,在后边的实例中将为读者演示如何进行唯一值符号化。
4.7.2RasterRender对象
RasterRender是一个抽象类,它有15个子类负责进行不同类型的着色运算。它们都实现了IRasterRender接口,这个接口定义了栅格图层符号化的公共属性和方法。可以通过IRasterLayer::Renderer属性获得一个栅格图层的符号化对象。
要素符号化类型 描述
栅格RGB符号化 RasterRGBRenderer
唯一值符号化 RasterUniqueValueRenderer
双变量唯一值符号化 RasterColormapRenderer
图表符号化 RasterClassifyColorRampRenderer
分类等级符号化 RasterStretchColorRampRenderer
点密度 符号化 RasterDiscreteColorRenderer
栅格符号化类型结构图如图14所示:
图14
以下代码片段是对一个RasterLayer进行RasterStretchColorRampRenderer符号化操作: ///
/// StretchColorRamp符号化RasterLayer
///
///
RasterLayer
public void SetStretchColorRampRenderer(IRasterLayer pRasterLayer)
{
try
{
//创建RasterStretchColorRampRendererClass对象
IRasterStretchColorRampRenderer pRStretchRender= new RasterStretchColorRampRendererClass();
//QI到IRasterRenderer
IRasterRenderer pRasterRender=pRStretchRender as IRasterRenderer;
pRasterRender.Raster = pRasterLayer as IRaster;
pRasterRender.Update();
//创建两个起始颜色
IRgbColor pFromRgbColor = new RgbColorClass(); pFromRgbColor.Red = 255;
IRgbColor pToRgbColor = new RgbColorClass(); pToRgbColor.Blue = 255;
//创建起止颜色带
IAlgorithmicColorRamp pAlgorithmicColorRamp = new AlgorithmicColorRampClass();
pAlgorithmicColorRamp.Size = 255;
pAlgorithmicColorRamp.FromColor = pFromRgbColor as IColor; pAlgorithmicColorRamp.ToColor = pToRgbColor as IColor;
bool btrue= true;
pAlgorithmicColorRamp.CreateRamp(out btrue);
//选择拉伸颜色带符号化的波段
pRStretchRender.BandIndex = 0;
//设置拉伸颜色带符号化所采用的颜色带
pRStretchRender.ColorRamp = pAlgorithmicColorRamp as IColorRamp;
pRasterRender.Update();
//符号化RasterLayer
pRasterLayer.Renderer = pRasterRender;
}
catch(Exception Err)
{
MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
原创)基于ArcGIS Engine编写的
ColorRamp对栅格渲染代码
上一篇 / 下一篇 2010-03-01 16:25:22 / 个人分类:ArcGIS
查看( 167 ) / 评论( 1 ) / 评分( 0 / 0 )
需要实现类似ArcMap中的单击TOC控件来对图层进行渲染,示例代码中主要针对的是矢量图层
FeatureLayerClass, 没有针对RasterLayerClass, 不过原理是很类似的,我们都知道对栅格渲染主要有三种方式:
1.Raster Unique value Renderer 唯一值渲染
2.Raster Classify Renderer 分类渲染
3.Raster Stretch Renderer 色带渲染
而现在要实现ColorRamp 色带的渲染:
原理主要就是 利用一个axSymbolControl来承载AE中的ColorRamp枚举值,然后主程序TOC控件调用选中的Style. Item 样式并赋值给IRasterStretchColorRampRenderer的对象实例。
关键源代码是:
1. 在ColorSymbolForm的载入初始化时,添加ESRI中包含ColorRamp的样式:
//Get the ArcGIS install location
string sInstall = routin_ReadRegistry("SOFTWARE\\ESRI\\CoreRuntime");
//Load the ESRI.ServerStyle. file into the SymbologyControl axSymbologyControl1.LoadStyleFile(sInstall + "\\Styles\\ESRI.ServerStyle");
2.选中其中的一个样式
public IStyleGalleryItem GetItem(ESRI.ArcGIS.Controls.esriSymbologyStyleClass styleClass)
{
m_StyleGalleryItem = null;
//Disable ok button
button1.Enabled = false;
//Set the style. class
axSymbologyControl1.StyleClass = styleClass;
//Unselect any selected item in the current style. class
axSymbologyControl1.GetStyleClass(styleClass).UnselectItem();
//Show the modal form. this.ShowDialog();
//Return the selected label style. return m_StyleGalleryItem;
}
3. 选中样式时相应的事件
private void axSymbologyControl1_OnItemSelected(object sender, ESRI.ArcGIS.Controls.ISymbologyControlEvents_OnItemSelectedEvent e)
{
//Get the selected item
m_StyleGalleryItem =
axSymbologyControl1.GetStyleClass(axSymbologyControl1.StyleClass).GetSelectedItem();
//Enable ok button
button1.Enabled = true;
}
4.然后在主程序中添加TOC右击事件,用Stretch Renderer 色带渲染:
private void axTOCControl_Temp_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
{
if (e.button != 2)
return;
IBasicMap map = new MapClass();
ILayer layer = new RasterLayerClass();
object ther = new object();
object index = new object();
esriTOCControlItem item = new esriTOCControlItem();
//Determine what kind of item has been clicked on
this.axTOCControl_Temp.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);
if (layer == null) return;
IRasterLayer rasterLayer = layer as IRasterLayer;
if (rasterLayer == null) return;
IRasterStretchColorRampRenderer pStretchColorRasterRenderer = new RasterStretchColorRampRendererClass();
IRasterRenderer pRasterRenderer = pStretchColorRasterRenderer as IRasterRenderer;
pRasterRenderer.Raster = rasterLayer.Raster;
pRasterRenderer.Update();
//Get the IStyleGalleryItem
IStyleGalleryItem styleGalleryItem = null;
//Create the form. with the SymbologyControl
ColorSymbolForm. symbolForm. = new ColorSymbolForm();
//Get teh symbol item
styleGalleryItem =
symbolForm.GetItem(esriSymbologyStyleClass.esriStyleClassColorRamps);
//Release the form. symbolForm.Dispose();
this.Focus();
if (styleGalleryItem == null) return;
IColorRamp colorRamp = (IColorRamp)styleGalleryItem.Item;
pStretchColorRasterRenderer.BandIndex = 0;
pStretchColorRasterRenderer.ColorRamp = colorRamp as IColorRamp;
pRasterRenderer.Update();
rasterLayer.Renderer = pStretchColorRasterRenderer as IRasterRenderer;
this.axMapControl_Temp.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
this. axMapControl_Temp.SetBuddyControl(axMapControl_Temp);
this.axTOCControl_Temp.Refresh();
}