要求:
编写程序,访问位于文件型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