C#AE练习 (3)地图的简单渲染和唯一值渲染

要求:

  编写程序,访问位于文件型Geodatabase的FeatureClass,并实现两种Renderer
在这里插入图片描述

  1、加载数据显示到地图中。
  2、实现一个简单Renderer,能够World Lakes采用RGB颜色进行填充。
  3、实现一个唯一值Renderer,根据World Countries的CNTRY_NAME字段进行唯一值Renender。


作答:

1.☆访问File Geodatabase的要素类FeatureClass

private void button2_Click(object sender, EventArgs e)
{
	//访问File Geodatabase,需要引用Geodatabase,DataSourcesGDB,DataSourcesFile,并把嵌入互操作类型改为False
	IWorkspaceFactory pWSF = new FileGDBWorkspaceFactoryClass();
	IWorkspace pWS = pWSF.OpenFromFile(@"Databases\World.gdb",0); //OpenFromFile("gdb路径地址",0)

	IEnumDataset pEnumDataset = pWS.get_Datasets(esriDatasetType.esriDTAny);
	pEnumDataset.Reset();
	IDataset pDataset = pEnumDataset.Next();
	
	//访问File Geodatabase中的数据集→要素类
	if (pDataset is IFeatureDataset)
	{
		IFeatureWorkspace pFWS = pWS as IFeatureWorkspace;
        IFeatureDataset pFDS = pFWS.OpenFeatureDataset(pDataset.Name);
	
		//遍历数据集中的要素类FeatureClass
		IEnumDataset pEnumDataset1 = pFDS.Subsets;
		pEnumDataset1.Reset();
		IDataset pDataset1 = pEnumDataset1.Next();
		while (!(pDataset1 == null))
		{
			IFeatureLayer pFeatureLayer = new FeatureLayerClass();
			pFeatureLayer.FeatureClass = pFWS.OpenFeatureClass(pDataset1.Name);

			 pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
			 pFeatureLayer.ShowTips = true;
			 axMapControl1.Map.AddLayer(pFeatureLayer);
			 axMapControl1.ActiveView.Refresh();

			pDataset1 = pEnumDataset1.Next();
		}
	}
	//直接访问File Geodatabase中的要素类FeatureClass
	else if (pDataset is IFeatureClass)
	{
		while (!(pDataset == null))
		{
			IFeatureWorkspace pFWS = pWS as IFeatureWorkspace;
			IFeatureLayer pFeatureLayer1 = new FeatureLayerClass();
			pFeatureLayer1.FeatureClass = pFWS.OpenFeatureClass(pDataset.Name);

			pFeatureLayer1.Name = pFeatureLayer1.FeatureClass.AliasName;
			pFeatureLayer1.ShowTips = true;
			axMapControl1.Map.AddLayer(pFeatureLayer1);
			axMapControl1.ActiveView.Refresh();
			
			pDataset = pEnumDataset.Next();
		}
	}
}

在这里插入图片描述
2.获取要素类后,在下拉框中显示图层名称

 不知道为什么OnMapReplaced事件 对 前面从file geodatabase添加的要素类,并没有发生响应(用工具条上的添加地图 或 写LoadMxFile的代码 是可以响应的);

 OnMapReplaced:替换MapControl包含的Map后触发

 那就不用代码加载了,用工具条吧!

private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e)
{
	IMap pMap = axMapControl1.Map;
	for (int LayerIndex = 0; LayerIndex < pMap.LayerCount; LayerIndex++)
	{
		ILayer pLayer = pMap.get_Layer(LayerIndex);
		
		comboBox1.Items.Add(pLayer.Name);
	}
} 

3.从下拉框选择图层时,向其他下拉框里写入相关信息

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
	comboBox2.Items.Clear();
	comboBox3.Items.Clear();
	comboBox4.Items.Clear();
	comboBox5.Items.Clear();

	//设置地图的所有图层先不显示
	IMap pMap = axMapControl1.Map;
	for (int LayerIndex = 0; LayerIndex < pMap.LayerCount; LayerIndex++)
	{
		ILayer pLayer = pMap.get_Layer(LayerIndex);
		pLayer.Visible = false;
	}
	
	//选择要显示的图层 ComboBox1
	int ComboBox1Index = comboBox1.SelectedIndex;
	if (ComboBox1Index < 0) return;
	ILayer pLayer1 = pMap.get_Layer(ComboBox1Index);
	pLayer1.Visible = true;

	axMapControl1.ActiveView.Refresh();
	axMapControl1.Extent = axMapControl1.FullExtent;

	//获取图层的字段名称 ComboBox5
	IFeatureLayer pFeatureLayer = pLayer1 as IFeatureLayer;
	IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
	
	int fieldcount = pFeatureClass.Fields.FieldCount;
	for (int i = 0; i < fieldcount; i++)
	{
		string filedname = pFeatureClass.Fields.get_Field(i).Name;
	
		comboBox5.Items.Add(filedname);
	}
	
	//RGB值  0-255   ComboBox2,ComboBox3,ComboBox4
	int j = 0;
	while (j <= 255)
	{
		comboBox2.Items.Add(j);
		comboBox3.Items.Add(j);
		comboBox4.Items.Add(j);
		j++;
	}
}				

4.☆图层渲染(简单渲染、唯一值渲染)

简单渲染:图层中所有要素采用同一符号(样式、颜色等)

唯一值渲染:根据矢量图层的某一个数值字段的属性值,按照值得不同大小进行着色。属性数值相等的所有要素归为同一种类,即同一颜色。

private void button1_Click(object sender, EventArgs e)
{	
	IMap pMap = axMapControl1.Map;
	ILayer pLayer;
	
	int i = comboBox1.SelectedIndex;	
	if (i < 0) return;
	
	if (radioButton1.Checked == true /*&& (i == 0)*/)
	{
		//将RGB颜色ComboBox中的Text值,String类型转换为Int类型
		if (comboBox2.Text == "" || comboBox3.Text == "" || comboBox4.Text == "") return;
		int RedValue = Convert.ToInt32(comboBox2.Text); //红
		int GreenValue = Convert.ToInt32(comboBox3.Text); //绿
		int BlueValue = Convert.ToInt32(comboBox4.Text); //蓝
	
		pLayer = pMap.get_Layer(i);
	
	///----------------------☆SimpleRenderer--------------------------//
		IGeoFeatureLayer pGeoFeatureLayer = pLayer as IGeoFeatureLayer;   
		//定义符号Symbol的样式和颜色
		ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbolClass()
		pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid; //定义符号样式
			
		IRgbColor pRgbColor = new RgbColor();
		pRgbColor.Red = RedValue;
		pRgbColor.Green = GreenValue;
		pRgbColor.Blue = BlueValue;
		pSimpleFillSymbol.Color = pRgbColor; //定义符号颜色
	
		//渲染
		ISimpleRenderer pRenderer = new SimpleRendererClass();
		pRenderer.Symbol = pSimpleFillSymbol as ISymbol;
		pGeoFeatureLayer.Renderer = pRenderer as IFeatureRenderer;
	/---------------------------------------------------------/
	
		axMapControl1.Extent = axMapControl1.FullExtent;
		axMapControl1.ActiveView.Refresh();
		axTOCControl1.Update();
		
		 MessageBox.Show("简单渲染成功!");
	}
	
	
	if (radioButton2.Checked == true)
	{
		pLayer = pMap.get_Layer(i);
		
//-------------UniqueValueRenderer----------------------///	
		IGeoFeatureLayer pGeoFeatureLayer = pLayer as IGeoFeatureLayer;
		IUniqueValueRenderer pUniqueValueRenderer = new UniqueValueRendererClass();
	
		pUniqueValueRenderer.FieldCount = 1;
		string FieldName = comboBox5.SelectedItem.ToString(); //*获取字段名称
		pUniqueValueRenderer.set_Field(0, FieldName); 
		
		//可选代码,颜色差异小,颜色均为随机色,多次点击渲染会不断变色,给每一个值定义一种颜色
		//设置色谱的范围
		IRandomColorRamp pRandomColorRamp = new RandomColorRampClass();
		/*
		pRandomColorRamp.StartHue = 0;  //设置随机色带的起始色度
		pRandomColorRamp.EndHue = 360;  //设置随机色带的末尾色度
		pRandomColorRamp.MinSaturation = 10;  //设置随机色带的最小饱和度
		pRandomColorRamp.MaxSaturation = 30;  //设置随机色带的最大饱和度
		pRandomColorRamp.MinValue = 100;  //设置随机色带的最小纯度
		 pRandomColorRamp.MaxValue = 100;  //设置随机色带的最大纯度
		 */
	
		IQueryFilter pQueryFilter = new QueryFilterClass(); 
		pRandomColorRamp.Size = pGeoFeatureLayer.FeatureClass.FeatureCount(pQueryFilter);//根据渲染字段的唯一值的个数,设置一组随机颜色
	
		bool out_outparameter = false;
		pRandomColorRamp.CreateRamp(out out_outparameter);  //创建随机颜色;需要输出参数,输出参数的类型为bool
	
		IEnumColors pEnumRamp = pRandomColorRamp.Colors;  //创建颜色枚举
		IColor pNextUniqueColor;  //用来移动的指示颜色的指针
		pQueryFilter = new QueryFilterClass();
		pQueryFilter.AddField(FieldName); //添加待查询的字段
		
		ITable pTable = pLayer as Table;
		int FieldNumbero = pTable.FindField(FieldName);  //将字段在表中的索引(第几列)存储到FieldNumbero
	
		ICursor pCursor = pTable.Search(pQueryFilter, true);
		IRow pNextRow = pCursor.NextRow();
		IRowBuffer pNextRowBuffer = null;
		object codeValue = null;  //创建移动指针,用来指向要渲染字段的每一个值
	
		while (pNextRow != null)
		{
			pNextRowBuffer = pNextRow as RowBuffer;
			codeValue = pNextRowBuffer.get_Value(FieldNumbero);  //获取要渲染字段的每一个值
			pNextUniqueColor = pEnumRamp.Next();  //将pNextUniqueColor指向之前创建好的色带pEnumRamp的下一个颜色
	
			//若为空值返回色带的第一个颜色进行赋值
			if (pNextUniqueColor == null)
			{
				pEnumRamp.Reset();  //跳回pEnumRamp顶部
				pNextUniqueColor = pEnumRamp.Next();
			}
			ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbolClass();
			pSimpleFillSymbol.Color = pNextUniqueColor;
			pUniqueValueRenderer.AddValue(codeValue.ToString(), "", pSimpleFillSymbol as ISymbol);
			pNextRow = pCursor.NextRow();			
		}
		pGeoFeatureLayer.Renderer = pUniqueValueRenderer as IFeatureRenderer;
//-----------------------------------------------/
	
		axMapControl1.Extent = axMapControl1.FullExtent;
		axMapControl1.ActiveView.Refresh();
		axTOCControl1.Update();
		
		MessageBox.Show("唯一值渲染成功!");
	}
}

参考文章:
https://blog.csdn.net/m0_37768631/article/details/84452172
https://blog.csdn.net/Domen_Dragon/article/details/86498616#commentBox

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值