ArcEngine符号
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2009-12-22 09:26
符号化Symbol(符号)体系
ArcGIS Engine9.3为开发人员提供了32种符号,主要分为三大类符号MarkerSymbol(点符号)、 LineSymbol(线符号)和FillSymbol(填充符号)来绘制地理要素的几何图形。
此外还有两种特殊类型的符号:一种是TextSymbol用于文字标注;另一种是3D Chart符号,用于显示饼图等三维对象,如需详细了解请查找帮助文档。
1. MarkerSymbol对象
MarkerSymbol用于修饰点对象的符号,它拥有十三个子类如表2所示,其中不同的子类可以产生不同类型的点符号。
所有的MarkerSymbol类都实现了IMarkerSymbol接口,这个接口定义了标记符号的公共方法和属性,如角度、颜色、大小和X,Y偏移量等
表二
点符号类型描述
ArrowMarkerSymbol预定义的肩头符号
BarChartSymbol柱状图符号
CharacterMarker3DSymbol三维字体符号CharacterMarkerSymbol字体符号
Marker3DSymbol3D 符号
MultiLayerMarkerSymbol多个符号叠加产生新点符号PictureMarkerSymbol图片符号(bmp或emf) PiechartSymbol饼图符号
SimpleMarker3DSymbol简单3D符号SimpleMarkerSymbol简单符号
StackedChartSymbol堆叠符号
TextMarkerSymbol文字符号用来符号化点
常用的有以下5种类型:
如何创建MarkerSymbol?接下来以SimpleMarkerSymbol构建为例演示如何创建一个点符号:
//创建SimpleMarkerSymbolClass对象
ISimpleMarkerSymbol pSimpleMarkerSymbol = new SimpleMarkerSymbolClass();
//创建RgbColorClass对象为pSimpleMarkerSymbol设置颜色
IRgbColor pRgbColor = new RgbColorClass();
pRgbColor.Red = 255;
pSimpleMarkerSymbol.Color = pRgbColor as IColor;
//设置pSimpleMarkerSymbol对象的符号类型,选择钻石pSimpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSDiamond;
//设置pSimpleMarkerSymbol对象大小,设置为5
pSimpleMarkerSymbol.Size = 5;
//显示外框线
pSimpleMarkerSymbol.Outline = true;
//为外框线设置颜色
IRgbColor pLineRgbColor = new RgbColorClass();
pLineRgbColor.Green = 255;
pSimpleMarkerSymbol.OutlineColor = pLineRgbColor as IColor;
//设置外框线的宽度
pSimpleMarkerSymbol.OutlineSize = 1;
如何使用这个符号,在接下来介绍Renderer对象的时候将为大家演示如何用创建的点符号去符号化一个图层。
2. LineSymbol对象
LineSymbol对象是用于修饰线型几何对象的符号,它拥有八个子类如表3所示,其中不同的子类可以产生不同类型的线符号,所有的LineSymbol类都实现了ILineSymbol接口, ILineSymbol定义了两个公共属性:Color和Width。
表三
线符号类型描述
CartographicLineSymbol实心或者虚线线符号HashLineSymbol离散线符号
MarkerLineSymbol点线符号
MultiLayerLineSymbol多符号叠加产生新线符号PictureLineSymbol图片线符号
SimpleLine3DSymbol 3D 线符号
SimpleLineSymbol预定义风格的线符号TextureLineSymbol (3DAnalyst)纹理贴图线符号
常用的LineSymbol如下图所示:
如何创建LineSymbol?接下来以MarkerLineSymbol构建为例演示如何创建一个线符号:
IArrowMarkerSymbol pArrowMarker = new ArrowMarkerSymbolClass();
IRgbColor pRgbColor = new RgbColorClass();
pRgbColor.Red = 255;
pArrowMarker.Color = pRgbColor as IColor;
pArrowMarker.Length = 10;
pArrowMarker.Width = 8;
pArrowMarker.Style = esriArrowMarkerStyle.esriAMSPlain;
IMarkerLineSymbol pMarkerLine = new MarkerLineSymbolClass(); pMarkerLine.MarkerSymbol = arrowMarker;
IRgbColor pLineColor = new RgbColorClass();
pLineColor.Blue = 255;
pMarkerLine.Color = pLineColor as IColor;
3. FillSymbol对象
FillSymbol是用来修饰如多边形等具有面积的几何形体的符号对象,它拥有十一个子类如表4所示它实现了IFillSymbol,这个接口定义了两个属性Color和OutLine,以满足所有类型的FillSymbol对象的公共属性设置。
表四
填充符号类型描述
ColorRampSymbol (Carto)用于渲染Raster数据的颜色带
ColorSymbol (Carto)用于渲染Raster数据的颜色符号DotDensityFillSymbol点密度填充符号
GradientFillSymbol渐变填充符号
LineFillSymbol包含线符号的填充符号
MarkerFillSymbol包含点符号的填充符号
MultiLayerFillSymbol多符号叠加产生新填充符号
PictureFillSymbol图片填充符号
RasterRGBSymbol用于渲染Raster数据RGBSymbol SimpleFillSymbol简单填充符号
TextureFillSymbol纹理贴图填充符号
常用的FillSymbol如下图所示:
如何创建FillSymbol?接下来以MarkerLineSymbol构建为例演示如何创建一个线符号:
//为填充符号创建外框线符号
IColor pLineColor = new RgbColorClass();
ICartographicLineSymbol pCartoLineSymbol = new CartographicLineSymbolClass();
pCartoLineSymbol.Width = 2;
pCartoLineSymbol.Color = pLineColor;
//创建一个填充符号
ISimpleFillSymbol pSmplFillSymbol = new SimpleFillSymbol();
//设置填充符号的属性
IColor pRgbClr = new RgbColorClass();
IFillSymbol pFillSymbol = pSmplFillSymbol;
pFillSymbol.Color = pRgbClr;
pFillSymbol.Outline = pCartoLineSymbol;
如果没有ArcGIS Desktop使用经验的开发看了以上代码片段会一头雾水,不明白填充符号的创建为什么还要创建线符号等等,如果有ArcGIS Desktop使用经验就会非常容易理解这些符号的创建的机制,如图8是SimpleFillSymbol设置信息。
所以熟悉ArcGIS Desktop的使用对开发人员进行ArcGIS Engine开发非常有用。
4. TextSymbol对象
TextSymbol对象是用于修饰文字元素的,文字元素在要素标注等方面很有用处。
TextSymbol符号最重要的设置对象是它的字符,它实现了三个主要的接口来设
置字符:ITextSymbol 、 ISimpleTextSymbol 和 IFormattedTextSymbol 。
ITextSymbol接口是定义文本字符样式的主要接口,它定义的ITextSymbol::Font属性是产生一个TextSymbol符号的关键。
可以使用IFontDisp接口来设置字体的大小和是否是粗体、倾斜等属性。
使用ITextSymbol 接口还可以定义TextSymbol对象的颜色、角度、水平排列方式、垂直排列方式和文本等内容。
以下是一个构建TextSymbol的函数:
///<summary>
///生成文本符号
///</summary>
///<param name="pTxtSymbol">文本符号</param>
///<param name="sFontName">字体名称</param>
///<param name="iFont">字体大小</param>
///<param name="iColor">字体颜色</param>
public static void MakeTextSymbol(ref ITextSymbol pTxtSymbol, string sFontName, int iFont, int iColor)
{
try
{
= sFontName;
pTxtSymbol.Font.Size = (decimal)iFont;
IRgbColor pRGBColor = new RgbColorClass();
pRGBColor.RGB = iColor;
pTxtSymbol.Color = (IColor)pRGBColor;
pTxtSymbol.Angle = 0;
pTxtSymbol.RightToLeft = false;
pTxtSymbol.HorizontalAlignment =
esriTextHorizontalAlignment.esriTHACenter;
pTxtSymbol.VerticalAlignment =
esriTextVerticalAlignment.esriTVABaseline;
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, rmation);
}
}
5. 3DChartSymbol对象
3DChartSymbol是一个抽象类,它拥有三个子类:BarChart、PieChart和StackedChart。
如下图所示:
BarChartSymbol是最常用的三维着色符号,它使用不同类型的柱子来代表一个要素类中不同的属性,而柱子的高度取决于属性值的大小。
PieChartSymbol符号进行着色的方法是使用一个饼图来显示不同要素类中的不同属性,不同的属性按照它们的数值大小占有一个饼图中的不同比例的扇形区域。
PieChartSymbol符号进行着色的方法是使用一个饼图来显示不同要素类中的不同属性,不同的属性按照它们的数值大小占有一个饼图中的不同比例的扇形区
域。
至于如何创建这些3DChartSymbol符号这里不再提供代码片段演示,读者可以根据前边学习的知识,自己操作ArcGIS Desktop使用3DChartSymbol制作专题图,然后根据ArcGIS Engine的帮助文档开发创建3DChartSymbol。
2009-12-22 09:38
使用ServerStyle
如果熟悉ArcGIS Desktop的使用,就会对Style符号库文件有所了解,相对应的在ArcGIS Engine开发中对应的是ServerStyle符号库,它的结构体系如下图所示。
可以通过专门的转换程序把ArcGIS Desktop Style符号库转换为ArcGIS Engine所能够使用的ServerStyle符号库。
用于获取ServerStyle符号库中的符号主要涉及到以下接口如表所示:
表
接口名称功能描述
IStyleGallery用于管理Style Gallery IStyleGalleryStorage管理Style Gallery中的符号库文件IStyleGalleryClass控制符号库中Style Gallery Class IEnumStyleGalleryItem枚举一组Style Gallery items IStyleGalleryItem定义Style Galle ry itme
4.5.1获取符号库中符号
如何获取到一个符号库中符号?接下来以获取ESRI符号库中名称为Rose的符号的流程:
1.首先构建一个ServerStyleGallery对象
2.其次使用IStyleGalleryStorage接口的AddFile方法加载ServerStyle文件
3.遍历ServerGallery中的Class,如果是FillSymbol使用IStyleGallery的GetItems方法返回一个可枚举的包含一系列StyleGalleryItem的
EnumStyleGalleryItem对象。
4.遍历EnumServerStyleGalleryItme枚举对象中的StylegalleryItme如果名称是Rose即可获取ESRI符号库中名称为Rose的StylegalleryItme,然后通过IStyleGalleryItem的Item属性即可转换为ISymbol。
整个流程图如下图所示:
SymbologyControl控件
SymbologyControl用来显示ServerStyle符号库中的符号样式,可以选择在该控件上选择一个符号用来符号化一个图层或者作为一个Element的符号。
使用SymbologyControl可以再设计的模式下在其属性页中加载ServerStyle符号库文件,同样也可以使用的LoadStyleFile和RemoveFile方法加载和移除Serverstyle符号库文件。
运行效果如下图所示:
符号化之Renderer( 渲染)体系
ArcGIS Engine9.3对GIS数据的符号化分为矢量数据渲染和栅格数据渲染两大类。
接下来分别介绍FeatureRender和RasterRender。
1. FeatureRender对象
FeatureRenderer是一个抽象类,它有15个子类负责进行不同类型的着色运算。
它们都实现了IFeatureRenderer接口,这个接口定义了进行要素图层符号化的公共属性和方法。
可以通过IGeoFeatureLayer::Renderer属性获得一个要素图层的符号化对象
表四
要素符号化类型描述
SimpleRender简单符号化
UniqueValueRender唯一值符号化
BiUniqueValueRender双变量唯一值符号化ChartRender图表符号化ClassBreaksRenderer分类等级符号化DotDensityRenderer点密度符号化
ProportionalSymbolRenderer 根据属性值设置符号大小进行符号化
ScaleDependentRenderer依比例尺符号化RepresentationRenderer制图表达符号化
CoTrackSymbologyRenderer(TrackingAnalyst)轨迹符号化(应用于TrackingAnaylyst 扩展模块)
EnhancedInfoRenderder(TrackingAnalyst)增强信息符号化(应用于TrackingAnaylyst扩展模块)
UniqueValueTextRenderer(TrackingAnalyst)唯一值文本符号化(应用于TrackingAnaylyst扩展模块)
NAStopRenderer(NetworkAnalyst)停止符号化(应用于网络分析扩展模块)
FeatureVertexRenderer(SurveyExt)要素定点符号化(应用于测量分析扩展模块)
SharedEdgeRenderer(EditorExt)用于绘制拓扑元素常用的要素符号化类型主要有以下6种类型,如下图所示:
2. RasterRender对象
RasterRender是一个抽象类,它有15个子类负责进行不同类型的着色运算。
它们都实现了IRasterRender接口,这个接口定义了栅格图层符号化的公共属性和方法。
可以通过IRasterLayer::Renderer属性获得一个栅格图层的符号化对象。
要素符号化类型描述
RasterRGBRenderer栅格RGB符号化RasterUniqueValueRenderer唯一值符号化RasterColormapRenderer双变量唯一值符号化RasterClassifyColorRampRenderer图表符号化RasterStretchColorRampRenderer分类等级符号化RasterDiscreteColorRenderer点密度符号化
栅格符号化类型结构图如下图所示:
以下代码片段是对一个RasterLayer进行RasterStretchColorRampRenderer符号化操作:
///<summary>
/// StretchColorRamp符号化RasterLayer
///</summary>
///<param name="pRasterLayer">RasterLayer</param>
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,rmation);
ArcGIS Engine开发 --图层符号化(四)
2009-12-22 09:43
利用ESRI自带的符号库进行唯一值符号化一图层开发实例
实现唯一值符号化功能代码如下:
///<summary>
///获取符号库中符号
///</summary>
///<param name="sServerStylePath">符号库全路径名称</param>
///<param name="sGalleryClassName">GalleryClass名称</param>
///<param name="symbolName">符号名称</param>
///<returns>符号</returns>
private ISymbol GetSymbol(string sServerStylePath, string sGalleryClassName, string symbolName)
{
try
{
//ServerStyleGallery对象
IStyleGallery pStyleGaller = new ServerStyleGalleryClass();
IStyleGalleryStorage pStyleGalleryStorage = pStyleGaller as IStyleGalleryStorage;
IEnumStyleGalleryItem pEnumSyleGalleryItem=null; IStyleGalleryItem pStyleGallerItem = null;
IStyleGalleryClass pStyleGalleryClass = null;
//使用IStyleGalleryStorage接口的AddFile方法加载ServerStyle文件pStyleGalleryStorage.AddFile(sServerStylePath);
//遍历ServerGallery中的Class
for (int i = 0; i < pStyleGaller.ClassCount; i++)
{
pStyleGalleryClass = pStyleGaller.get_Class(i);
if ( != sGalleryClassName)
continue;
//获取EnumStyleGalleryItem对象
pEnumSyleGalleryItem = pStyleGaller.get_Items(sGalleryClassName, sServerStylePath, "");
pEnumSyleGalleryItem.Reset();
//遍历pEnumSyleGalleryItem
pStyleGallerItem = pEnumSyleGalleryItem.Next();
while (pStyleGallerItem != null)
{
if ( == symbolName)
{
//获取符号
ISymbol pSymbol = pStyleGallerItem.Item as ISymbol;
System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumSyleGall eryItem);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pStyleGallery Class);
return pSymbol;
}
pStyleGallerItem = pEnumSyleGalleryItem.Next();
}
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumSyleGall eryItem);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pStyleGallery Class);
return null;
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, rmation);
return null;
}
}
///<summary>
///设置要素图层唯一值符号化
///</summary>
///<param name="pFeatureLayer"></param>
private void UniqueValueRenderFlyr(IFeatureLayer pFeatureLayer)
{
try
{
//创建UniqueValueRendererClass对象
IUniqueValueRenderer pUVRender = new UniqueValueRendererClass();
List<string> pFieldValues= new List<string>();
pFieldValues.Add("Hospital 2");
pFieldValues.Add("School 1");
pFieldValues.Add("Airport");
for(int i=0;i<pFieldValues.Count;i++)
{
ISymbol pSymbol= new SimpleMarkerSymbolClass();
pSymbol =GetSymbol(@"C:\Program
Files\ArcGIS\Styles\ESRI.ServerStyle","Marker
Symbols",pFieldValues[i])
//添加唯一值符号化字段值和相对应的符号
pUVRender.AddValue(pFieldValues,pFieldValues,pSymbol);
}
//设置唯一值符号化的字段个数和字段名
pUVRender.FieldCount = 1;
pUVRender.set_Field(0, "类别");
IGeoFeatureLayer pGFeatureLyr = pFeatureLayer as IGeoFeatureLayer;
//设置IGeofeatureLayer的Renderer属性
pGFeatureLyr.Renderer = pUVRender as IFeatureRenderer;
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, rmation);
}
}
private void button1_Click(object sender, EventArgs e)
{
IFeatureLayer pFeatureLayer = this.axMapControl1.get_Layer(0) as IFeatureLayer;
UniqueValueRenderFlyr(pFeatureLayer);
this.axMapControl1.Refresh();
}
设计GIS系统符号化模块
大家首先有个观念:用ArcEngine开发C/S应用程序时,一个成熟的GIS项目在加载数据这方面是不允许直接把SDE里边的数据以MXD的形式组织起来这是不科学的,原因如下:
1.从数据安全性考虑
一个MXD文档包含了SDE数据库里与MXD数据的详细信息,通常对于数据拥有者来说是不希望外部能够获取这些信息的。
2.从系统灵活性考虑
通过程序动态加载所需同层,动态符号化相关图层能够为程序带来很大的灵活性,例如根据不同的用户的权限从数据库加载不同的数据,符号化不同的图层等
等。
习惯直接在MapControl上Load MXD File的就会有疑问,不通过MXD怎么展现图层的符号化。
接下来我将从两种途径给大家介绍一下如果动态符号化图层:
使用ArcEngine开发C/S应用程序数据加载一个重要的功能模块,在数据加载模块符号图层是其技术核心之一:
1. 通过系统符号化配置表存储图层符号化信息符号化图层。
首先在关系型数据库中创建一个图层符号化配置表详细记录每一个图层的符号
化信息,如下表(我只列出简单符号化的配置表设计,至于唯一值等大家可以自己根据需求设计):
图层ID符号化类型符号库ID 符号名称符号类型
点图层1简单符号化1火车站点
线图层1简单符号化2铁路线线
面图层1简单符号化3绿色面面
然后使用ArcEngine提供的每种符号化类型的接口对图层进行符号化渲染。
2. 通过ArcEngine提供的Represatation存储要素符号化
Representation是ArcGIS9.3的新特性,能够通过Representation制作更精美,更复杂的地图操作过程,下图是ArcGIS Desktop中Repre sentation工具条。
通过一下操作可以把通过Representation工具条制作出来的地图效果存储在要素类中(只能是Geodat abase类型的)。
从以上可以看出每一个要素的符号化信息都以Blob方式存储在相对应的数据表中,这样就不需要通过配置表的设置进行动态符号化,直接通过Engine中提供的与Representation相关的接口和类符号化每一个图层。