您的当前位置:首页正文

ArcGIS Engine基础开发教程(4)— 学习图层符号化

2020-02-05 来源:步旅网
ArcGIS Engine基础开发教程(4)— 学习图层符号化

本帖最后由 fxlcoco 于 2009-5-21 09:31

编辑

地图符号不仅具有确定的空间位置以及空间地物的性质:例如在一个城市管线系统中不同的线符号表示不同类型的管线,不同的点符号表示不同类型的设备等等,而且地图符号也可以表达与空间位置相关的丰富信息:例如人口密度符号可以直观的表示人口数量的空间分布情况。所以地图数据的符号化决定着地图以何种“面目”展现给地图的使用者,自此空间数据的符号化对GIS开发有非常重要的意义。

ArcGIS Engine9.3提供了丰富的控件和组件库来实现图层符号化的相关功能。ArcGIS Engine9.3提供了SymbologyControl控件用于显示ArcGIS符号库中的符号(关于ArcGIS符号请查找相关文档),而组件库中的组件对象分为Color , Symbol, Renderer三大系列,图层符号化就是通过多个组件对象来合作完成。 4.1目标

1.熟悉ArcGIS Engine符号化之Color(颜色)体系

2.熟悉ArcGIS Engine符号化之Symbol

(符号)体系

3.熟悉ArcGIS Engine符号化之Renderer( 渲染)体系

4.利用ESRI自带的符号库进行符号化图层

4.2准备工作

1.IDE:Visual Studio 2005/2008 2.ArcGIS Engine Developer kit 9.3 3.自造一份用于唯一值符号化的点数据(文章内有说明)

5

评分次数

稀饭

long87096682

竹疏

gispeng

yoyo

本主题由 fxlcoco 于 2010-3-3 17:44 提升

收藏 分享 评分

努力不一定成功,放弃就一定

失败。

学习是一种信仰(In learning

we trust)!

回复 引用

订阅 报告 道具 TOP

fxlcoco

2#

发表于 2009-5-20 19:14 | 只看该作者

4.3符号化Color(颜色)体系

4.3.1ArcGIS颜色模型

版主

ArcGIS提供Color(颜色)的模型有多种分别是:

帖子 1409 精华

14

RGB颜色模型:最常用,所有颜色都是通过红色(Red)、绿色(Green)、蓝色(Blue)这三原色的混合来显示。 

CMY颜色模型:青(Cyan)、洋红(Magenta)和黄(Yellow)三种颜色的简写,是相减混色模式,用这种方法产生的颜色之所以称为相减色,主要用于印刷中。  HSV颜色模型:色彩(H),纯度(S),明度(V)。 

Gray模型:没有彩色的,灰度图像由8位信息组成,并使用256级的灰色来模拟颜色层次。 

HLS模型: Hue(色相)、Luminance(亮度)、Saturation(饱和度)。

图1

如上图所示Color对象是一个抽象类,它包括5个子类:它有5个颜色子类,即CmykColor、RGBColor、HSVColor、HLSColor和GrayColor,它们可以使用IColor接口定义的方法设置颜色对象的基本属性。在ArcGIS engine中最常使用的两种颜色模型是RGB和HSV,RGB类实现IRgbColor接口,而HSV类则实现IHsvColor接口,两个接口分别定义了设置一个RGBColor对象和RGBColor对象需传递的值。

接下来以一个函数来通过R,G,B值来构建一个RGBColor对象

private IRgbColor GetRGB(int r,int g,int b)

{

IRgbColor pRgbColor= new RgbColorClass();//构建一个RgbColorClass

pRgbColor.Red = r;//设置Red属性 pRgbColor.Green = g;//设置Green属性

pRgbColor.Blue = b;//设置Blue属性

return pRgbColor;

}

4.3.2ColorRamp对象

在地图符号化的过程中,需要的颜色常常不是一种,而是随机或有序产生的一组颜色。如果对某一个图层进行符号化需要上百种颜色如图2所示,程序开发者肯定不能逐个产生出来。ArcGIS

Engine提供了ColorRamp对象:

图2

ColorRamp类的对象可以产生颜色带,这个类实现了IColorRamp接口,它定义了一系列颜色带的属性,如 Size(产生多少种颜色),

Colors(颜色带 IEnumColor)。

ColorRamp类是一个抽象类,它包括4个子类分别是:RandomColorRamp(随机颜色带)、PresetColorRamp(预设颜色带)、AlgorithmicColorRamp(起止颜色带)、MultiPartColorRamp

(叠加颜色带),它们的说明如表一所示。

表一

RandomColorRamp 使用HSV颜色模型来确定一串颜色 预设的颜色模式,可存储13种颜色 用起始颜色、终止颜色PresetColorRamp AlgorithmicColorRamp 确定一个颜色带,起始、终止颜色使用HSV模型 MultiPartColorRamp 叠加产生颜色带 在GIS应用开发中用到比较多得是RandomColorRamp(随机颜色带)和AlgorithmicColorRamp(起止颜色带)接下来详细介绍一

下这两个颜色带。

AlgorithmicColorRamp是通过起止颜色来确定多个在这两个颜色之间的色带。AlgorithmicColorRamp类实现了两个接口:IColorRamp和IAlgorithmicColorRamp,两个接口之间是接口继

承关系,后者包含了前者所有的方法和属性。

4.3.3生成颜色带实例

接下来制作一个实例演示AlgorithmicColorRamp(起止颜色

带)的Demo:

1.创建一个窗体,在窗体上添加5个Picturebox用于分别显示产生的包含5个颜色的起始颜色带中的颜色,如图3所示

图3

2.在“生成颜色带”Button的Click事件中生成颜色带,代码片

段如下所示:

private void button1_Click(object sender, EventArgs e) {

//创建一个新AlgorithmicColorRampClass对象

IAlgorithmicColorRamp algColorRamp = new AlgorithmicColorRampClass();

//创建起始颜色对象

IRgbColor startColor = new RgbColor(); startColor.Red = 255; startColor.Green = 0; startColor.Blue = 0;

//创建终止颜色对象

IRgbColor endColor = new RgbColor();

endColor.Red = 0; endColor.Green = 255; endColor.Blue = 0;

//设置AlgorithmicColorRampClass的起止颜色属性 algColorRamp.ToColor = startColor; algColorRamp.FromColor = endColor;

//设置梯度类型

algColorRamp.Algorithm =

esriColorRampAlgorithm.esriCIELabAlgorithm;

//设置颜色带颜色数量

algColorRamp.Size = 5;

//创建颜色带

bool bture = true;

algColorRamp.CreateRamp(out bture);

//使用IEnumColors获取颜色带

IEnumColors pEnumColors = null; pEnumColors = algColorRamp.Colors;

//设置5个picturebox的背景色为产生颜色带的5个颜色

this.pictureBox1.BackColor =

ColorTranslator.FromOle(pEnumColors.Next().RGB);

this.pictureBox2.BackColor =

ColorTranslator.FromOle(pEnumColors.Next().RGB);

this.pictureBox3.BackColor =

ColorTranslator.FromOle(pEnumColors.Next().RGB);

this.pictureBox4.BackColor =

ColorTranslator.FromOle(pEnumColors.Next().RGB);

this.pictureBox5.BackColor =

ColorTranslator.FromOle(pEnumColors.Next().RGB);

}

运行点击Button 结果如图4所示:

图4

RandomColorRamp对象产生随机颜色带,RandomColorRamp也需要设定一个范围,但是这个范围是HSV颜色模型的,颜色将在这个范围内随机出现。 RandomColorRamp类实现了IRandomColorRamp

接口

以下是生成RandomColorRamp的代码片段

IRandomColorRamp pRandomColorRamp = new RandomColorRampClass();

//** 制作一系列介于橘黄色和蓝绿色之间的随机颜色 pRandomColorRamp.StartHue = 40; pRandomColorRamp.EndHue = 120; pRandomColorRamp.MinValue = 65; pRandomColorRamp.MaxValue = 90;

pRandomColorRamp.MinSaturation = 25; pRandomColorRamp.MaxSaturation = 45; pRandomColorRamp.Size = 20; pRandomColorRamp.Seed = 23;

bool bture = true;

pRandomColorRamp.CreateRamp(out bture);

IEnumColors pEnumColors = pRandomColorRamp.Colors

//** 对pEnumColors进行操作

努力不一定成功,放弃就一定失败。

学习是一种信仰(In learning we trust)!

影音更酷!马上访问GISALL视频分享中心

回复 引用

报告 道具 TOP

3

fxlcoco

发表于 2009-5-20 19:15 | 只看该作者

4.4符号化Symbol(符号)体系

#

ArcGIS Engine9.3为开发人员提供了32种符号,主要分为三大类符号MarkerSymbol(点符号)、 LineSymbol(线符号)和FillSymbol(填充符号)来绘制地理要素的几何图形。此外还有两种特殊类型的符号:一种是TextSymbol用于文字标注;另一种是3D Chart符号,

用于显示饼图等三维对象,如需详细了解请查找帮助文档。

版主

4.4.1MarkerSymbol对象

MarkerSymbol用于修饰点对象的符号,它拥有十三个子类如表2所示,其中不同的子类可

帖子

1409以产生不同类型的点符号。所有的MarkerSymbol类都实现了IMarkerSymbol接口,这个接

口定义了标记符号的公共方法和属性,如角度、颜色、大小和X,Y偏移量等。

表二 精华

14 点符号类型 ArrowMarkerSymbol BarChartSymbol CharacterMarker3DSymbol CharacterMarkerSymbol Marker3DSymbol MultiLayerMarkerSymbol PictureMarkerSymbol 描述 预定义的肩头符号 柱状图符号 三维字体符号 字体符号 3D 符号 多个符号叠加产生新点符号 图片符号(bmp或emf) 饼图符号 简单3D符号 简单符号 堆叠符号 文字符号用来符号化点

PiechartSymbol SimpleMarker3DSymbol SimpleMarkerSymbol StackedChartSymbol TextMarkerSymbol 常用的有以下5种 类型:

图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对象的时候将为大家演示如何用创建的点符号去符号化一个图层。

4.4.2LineSymbol对象

LineSymbol对象是用于修饰线型几何对象的符号,它拥有八个子类如表3所示,其中不同的子类可以产生不同类型的线符号,所有的LineSymbol类都实现了ILineSymbol接口, ILineSymbol定义了两个公共属性:Color和Width。

表三 线符号类型 CartographicLineSymbol HashLineSymbol MarkerLineSymbol MultiLayerLineSymbol PictureLineSymbol SimpleLine3DSymbol SimpleLineSymbol TextureLineSymbol (3DAnalyst)

常用的LineSymbol如下图所示:

描述 实心或者虚线线符号 离散线符号 点线符号 多符号叠加产生新线符号 图片线符号 3D 线符号 预定义风格的线符号 纹理贴 图线符号

图6

如何创建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;

4.4.3FillSymbol对象

FillSymbol是用来修饰如多边形等具有面积的几何形体的符号对象,它拥有十一个子类如表4所示它实现了IFillSymbol,这个接口定义了两个属性Color和OutLine,以满足所有类型的FillSymbol对象的公共属性设置。

表四 填充符号类型 描述 ColorRampSymbol (Carto) ColorSymbol (Carto) DotDensityFillSymbol GradientFillSymbol LineFillSymbol MarkerFillSymbol MultiLayerFillSymbol PictureFillSymbol RasterRGBSymbol SimpleFillSymbol TextureFillSymbol 用于渲染Raster数据的颜色带 用于渲染Raster数据的颜色符号 点密度填充符号 渐变填充符号 包含线符号的填充符号 包含点符号的填充符号 多符号叠加产生新填充符号 图片填充符号 用于渲染Raster数据 RGBSymbol 简单填充符号 纹理贴图填充符号

常用的FillSymbol如下图所示:

图7

如何创建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开发非常有用。

图8

4.4.4TextSymbol对象

TextSymbol对象是用于修饰文字元素的,文字元素在要素标注等方面很有用处。TextSymbol符号最重要的设置对象是它的字符,它实现了三个主要的接口来设置字符:

ITextSymbol 、 ISimpleTextSymbol 和 IFormattedTextSymbol 。

ITextSymbol接口是定义文本字符样式的主要接口,它定义的ITextSymbol::Font属性是产生一个TextSymbol符号的关键。可以使用IFontDisp接口来设置字体的大小和是否是粗体、倾斜等属性。使用ITextSymbol接口还可以定义TextSymbol对象的颜色、角度、水平

排列方式、垂直排列方式和文本等内容。

以下是一个构建TextSymbol的函数:

///

///生成文本符号

///

///文本符号

///字体名称

///字体大小

///字体颜色

public static void MakeTextSymbol(ref ITextSymbol pTxtSymbol, string sFontName, int iFont, int iColor)

{

try {

pTxtSymbol.Font.Name = 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, MessageBoxIcon.Information); } }

4.4.5 3DChartSymbol对象

3DChartSymbol是一个抽象类,它拥有三个子类:BarChart、PieChart和StackedChart。

如图9所示:

图9

BarChartSymbol是最常用的三维着色符号,它使用不同类型的柱子来代表一个要素类中不

同的属性,而柱子的高度取决于属性值的大小。

PieChartSymbol符号进行着色的方法是使用一个饼图来显示不同要素类中的不同属性,不

同的属性按照它们的数值大小占有一个饼图中的不同比例的扇形区域。

PieChartSymbol符号进行着色的方法是使用一个饼图来显示不同要素类中的不同属性,不

同的属性按照它们的数值大小占有一个饼图中的不同比例的扇形区域。

至于如何创建这些3DChartSymbol符号这里不再提供代码片段演示,读者可以根据前边学习的知识,自己操作ArcGIS Desktop使用3DChartSymbol制作专题图,然后根据ArcGIS

Engine的帮助文档开发创建3DChartSymbol。

努力不一定成功,放弃就一定失败。

学习是一种信仰(In learning we trust)!

没有个人空间?GISALL全新上线,点击申请开通

回复 引用

报告 道具 TOP

fxlcoco

4

发表于 2009-5-20 19:16 | 只看该作者

社区公告

ESRI社区近期管理规则!!(关于注册、发帖等事项)

#

版主

4.5使用ServerStyle

如果熟悉ArcGIS Desktop的使用,就会对Style符号库文件有所了解,相对应的在ArcGIS

帖子

Engine开发中对应的是ServerStyle符号库,它的结构体系如图10所示。可以通过专门的转换程序把ArcGIS Desktop Style符号库转换为ArcGIS Engine所能够使用的ServerStyle

符号库。

1409 精华 14 用于获取ServerStyle符号库中的符号主要涉及到以下接口如表所示:

表 接口名称 IStyleGallery IStyleGalleryStorage IStyleGalleryClass IEnumStyleGalleryItem IStyleGalleryItem 功能描述 用于管理Style Gallery 管理Style Gallery中的符号库文件 控制符号库中Style Gallery Class 枚举一组Style Gallery items 定义Style Galle ry itme

图10

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。

整个流程图如图11所示:

图11

回复 引用

报告 道具 TOP

5#

发表于 2009-5-20 19:16 | 只看该作者

4.6SymbologyControl控件

SymbologyControl用来显示ServerStyle符号库中的符号样式,可以选择在该控件上

选择一个符号用来符号化一个图层或者作为一个Element的符号。使用SymbologyControl可以再设计的模式下在其属性页中加载ServerStyle符号库文件,

fxlcoco 同样也可以使用的LoadStyleFile和RemoveFile方法加载和移除Serverstyle符号库

文件。运行效果如图12所示:

版主

帖子

1409 精华

14

图12

努力不一定成功,放弃就一定失败。

学习是一种信仰(In learning we trust)!

回复 引用

报告 道具 TOP

fxlcoco

6#

发表于 2009-5-20 19:17 | 只看该作者

4.7符号化之Renderer( 渲染)体系

ArcGIS Engine9.3对GIS数据的符号化分为矢量数据渲染和栅格数据渲染两大类。接

版主

帖子

下来分别介绍FeatureRender和RasterRender。

4.7.1FeatureRender对象

140FeatureRenderer是一个抽象类,它有15个子类负责进行不同类型的着色运算。它们9 都实现了IFeatureRenderer接口,这个接口定义了进行要素图层符号化的公共属性和精华

14

方法。

可以通过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种类型,如图13所示:

图13

由于篇幅有限不再对每一种符号化类型的使用进行讲解,在后边的实例中将为读者演示

如何进行唯一值符号化。

4.7.2RasterRender对象

RasterRender是一个抽象类,它有15个子类负责进行不同类型的着色运算。它们都实现了IRasterRender接口,这个接口定义了栅格图层符号化的公共属性和方法。可以通

过IRasterLayer::Renderer属性获得一个栅格图层的符号化对象。

要素符号化类型 RasterRGBRenderer RasterUniqueValueRenderer RasterColormapRenderer RasterClassifyColorRampRenderer RasterStretchColorRampRenderer RasterDiscreteColorRenderer 描述 栅格RGB符号化 唯一值符号化 双变量唯一值符号化 图表符号化 分类等级符号化 点密度 符号化 栅格符号化类型结构图如图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);

}

}

努力不一定成功,放弃就一定失败。

学习是一种信仰(In learning we trust)!

关注2009年ArcGIS&ENVI校园行活动

回复 引用

报告 道具 TOP

fxlcoco

7#

发表于 2009-5-20 19:18 | 只看该作者

社区公告

ESRI社区近期管理规则!!(关于注册、发帖等事项)

本帖最后由 fxlcoco 于 2009-5-23 15:26 编辑

版主

4.8利用ESRI自带的符号库进行唯一值符号化一图层开发实例

4.8.1目的

学会开发唯一值符号化要素图层功能

帖子

1409 精华

14

图1 5

图 16

图17 4.8.2步骤

1.准备点数据,添加属性字段“类别”;

2.并为要素“类别”属性值分别设置为“Hospital2”,“School 1”,“Airport”三种属

性值。

3.实现唯一值符号化功能 4.运行程序实现效果

4.8.3功能开发

实现唯一值符号化功能代码如下:

///

///获取符号库中符号

///

///符号库全路径名称

///GalleryClass名称

///符号名称

///符号

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 (pStyleGalleryClass.Name != sGalleryClassName)

continue;

//获取EnumStyleGalleryItem对象

pEnumSyleGalleryItem = pStyleGaller.get_Items(sGalleryClassName, sServerStylePath, \"\");

pEnumSyleGalleryItem.Reset();

//遍历pEnumSyleGalleryItem

pStyleGallerItem = pEnumSyleGalleryItem.Next();

while (pStyleGallerItem != null)

{

if (pStyleGallerItem.Name == symbolName) {

//获取符号

ISymbol pSymbol = pStyleGallerItem.Item as ISymbol;

System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumSyleGalleryItem);

System.Runtime.InteropServices.Marshal.ReleaseComObject(pStyleGalleryClass);

return pSymbol;

}

pStyleGallerItem = pEnumSyleGalleryItem.Next();

}

}

System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnumSyleGalleryItem);

System.Runtime.InteropServices.Marshal.ReleaseComObject(pStyleGalleryClass);

return null;

}

catch (Exception Err)

{

MessageBox.Show(Err.Message, \"提示\MessageBoxButtons.OK,

MessageBoxIcon.Information);

return null;

}

}

///

///设置要素图层唯一值符号化

///

///

private void UniqueValueRenderFlyr(IFeatureLayer pFeatureLayer)

{

try

{

//创建UniqueValueRendererClass对象

IUniqueValueRenderer pUVRender = new UniqueValueRendererClass();

List pFieldValues= new List();

pFieldValues.Add(\"Hospital 2\"); pFieldValues.Add(\"School 1\"); pFieldValues.Add(\"Airport\");

for(int i=0;iISymbol 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, MessageBoxIcon.Information); } } private void button1_Click(object sender, EventArgs e) { IFeatureLayer pFeatureLayer = this.axMapControl1.get_Layer(0) as IFeatureLayer; UniqueValueRenderFlyr(pFeatureLayer); this.axMapControl1.Refresh(); } 努力不一定成功,放弃就一定失败。

学习是一种信仰(In learning we trust)!

回复 引用

报告 道具 TOP

8#

发表于 2009-5-20 19:18 | 只看该作者

fxlcoc

4.9设计GIS系统符号化模块

o 大家首先有个观念:用ArcEngine开发C/S应用程序时,一个成熟的GIS项目在加载数据这

方面是不允许直接把SDE里边的数据以MXD的形式组织起来这是不科学的,原因如下:

1.从数据安全性考虑

版主

一个MXD文档包含了SDE数据库里与MXD数据的详细信息,通常对于数据拥有者来说是不希

望外部能够获取这些信息的。

2.从系统灵活性考虑

通过程序动态加载所需同层,动态符号化相关图层能够为程序带来很大的灵活性,例如根据帖子

1409精华

14

不同的用户的权限从数据库加载不同的数据,符号化不同的图层等等。习惯直接在MapControl上Load MXD File的就会有疑问,不通过MXD怎么展现图层的符号化。

接下来我将从两种途径给大家介绍一下如果动态符号化图层:

使用ArcEngine开发C/S应用程序数据加载一个重要的功能模块,在数据加载模块符号图层

是其技术核心之一:

4.9.1通过系统符号化配置表存储图层符号化信息符号化图层。

首先在关系型数据库中创建一个图层符号化配置表详细记录每一个图层的符号化信息,如下表(我只列出简单符号化的配置表设计,至于唯一值等大家可以自己根据需求设计):

图层ID

符号化类型 符号库ID 符号名称 符号类型 点图层1 简单符号化 1 火车站 点 线图层1 简单符号化 2 铁路线 线 面图层1 简单符号化 3

绿色面 面 然后使用ArcEngine提供的每种符号化类型的接口对图层进行符号化渲染。

4.9.2通过ArcEngine提供的Represatation存储要素符号化

Representation是ArcGIS9.3的新特性,能够通过Representation制作更精美,更复杂的

地图操作过程,下图是ArcGIS Desktop中Repre sentation工具条。

通过一下操作可以把通过Representation工具条制作出来的地图效果存储在要素类中(只

能是Geodat abase类型的)。

从以上可以看出每一个要素的符号化信息都以Blob方式存储在相对应的数据表中,这样就不需要通过配置表的设置进行动态符号化,直接通过Engine中提供的与Representation相

关的接口和类符号化每一个图层。

4

评分次数

因篇幅问题不能全部显示,请点此查看更多更全内容