实验:符号化元素和图层
使用c#+ArcGIS Engine开发一个界面,点击菜单,调用shapefile文件。
图层渲染
要求,点击不同的图层,渲染方式不同。
林班分布图:简单渲染,颜色为红色,斜纹填充。
小班分布图:ValueMapRenerer,按LBH字段渲染
等高线:ClassBreakRender,分级渲染,按ID字段分级渲染,分成5级。
Form1.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.esriSystem;
// Form2.Designer.cs中class Form2改变private成public
// public ESRI.ArcGIS.Controls.AxMapControl axMapControl1;
// public ESRI.ArcGIS.Controls.AxTOCControl axTOCControl1;
// public ESRI.ArcGIS.Controls.AxLicenseControl axLicenseControl1;
// public ESRI.ArcGIS.Controls.AxToolbarControl axToolbarControl1;
namespace 实验四
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void 林班分布图ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.axMapControl1.AddShapeFile(Application.StartupPath+"\\实验四数据","林班分布图");
form2.Show();
form2.axTOCControl1.SetBuddyControl(form2.axMapControl1);
IFeatureLayer pFeatureLayer;
pFeatureLayer = form2.axMapControl1.get_Layer(0) as IFeatureLayer;
IGeoFeatureLayer pGeoFeatureLayer;
pGeoFeatureLayer = pFeatureLayer as IGeoFeatureLayer; //qi
ISimpleFillSymbol pSimpleFillSymbol=new SimpleFillSymbol();
pSimpleFillSymbol.Style=esriSimpleFillStyle.esriSFSCross;
IRgbColor pRgbColor = new RgbColorClass();
pRgbColor.Red = 255;
pSimpleFillSymbol.Color = pRgbColor;
ISimpleRenderer pSimpleRender = new SimpleRendererClass();
pSimpleRender.Symbol = pSimpleFillSymbol as ISymbol;
pGeoFeatureLayer.Renderer = pSimpleRender as IFeatureRenderer;
}
private void 小班分布图ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.axMapControl1.AddShapeFile(Application.StartupPath + "\\实验四数据", "小班分布图");
form2.Show();
form2.axTOCControl1.SetBuddyControl(form2.axMapControl1);
IFeatureLayer pFeaturelayer;
pFeaturelayer = form2.axMapControl1.get_Layer(0) as IFeatureLayer;
IGeoFeatureLayer pGeofeaturelayer;
pGeofeaturelayer = pFeaturelayer as IGeoFeatureLayer;
IUniqueValueRenderer pUniqueValueRenderer = new UniqueValueRendererClass();
ITable pTable = pFeaturelayer as ITable;
int fieldnumber = pTable.FindField("LBH");
pUniqueValueRenderer.FieldCount = 1;
pUniqueValueRenderer.set_Field(0, "LBH");
IQueryFilter pQueryFilter = new QueryFilterClass();
pQueryFilter.AddField("LBH");
ICursor pCursor;
pCursor = pTable.Search(pQueryFilter, true);
IRow pRow;
pRow = pCursor.NextRow();
IRandomColorRamp pRandomColorRamp = new RandomColorRampClass();
pRandomColorRamp.StartHue = 0;
pRandomColorRamp.EndHue = 360;
pRandomColorRamp.MinSaturation = 0;
pRandomColorRamp.MaxSaturation = 100;
pRandomColorRamp.MinValue = 0;
pRandomColorRamp.MaxValue = 100;
pRandomColorRamp.Size = 100;
Boolean btrue = true;
pRandomColorRamp.CreateRamp(out btrue);
IEnumColors pEnumColors;
pEnumColors = pRandomColorRamp.Colors;
IColor pColor;
pColor = pEnumColors.Next();
while (pRow != null)
{
IRowBuffer pRowBuffer = pRow as IRowBuffer;
string codevalue = pRowBuffer.get_Value(fieldnumber).ToString();
pColor = pEnumColors.Next();
if (pColor == null)
{
pEnumColors.Reset();
pColor = pEnumColors.Next();
}
ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbolClass();
pSimpleFillSymbol.Color = pColor;
pUniqueValueRenderer.AddValue(codevalue, "林班号", pSimpleFillSymbol as ISymbol);
pRow = pCursor.NextRow();
pGeofeaturelayer.Renderer = pUniqueValueRenderer as IFeatureRenderer;
}
}
private void 等高线ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.axMapControl1.AddShapeFile(Application.StartupPath + "\\实验四数据", "等高线");
form2.Show();
form2.axTOCControl1.SetBuddyControl(form2.axMapControl1);
IGeoFeatureLayer pGeoFeatureLayer;
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer = form2.axMapControl1.Map.get_Layer(0) as IFeatureLayer;
pGeoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;
ITable pTable;
pTable = pGeoFeatureLayer as ITable;
string classBreaksField = "ID";//要渲染的字段名称
object dataValues;
object dataFrequency;
ITableHistogram tableHistogram = new BasicTableHistogramClass();
IBasicHistogram basicHistogram = (IBasicHistogram)tableHistogram;
tableHistogram.Field = classBreaksField;
tableHistogram.Table = pTable;
basicHistogram.GetHistogram(out dataValues, out dataFrequency);
int classesNumber = 5;
IClassifyGEN classifyGEN = new EqualIntervalClass();
classifyGEN.Classify(dataValues, dataFrequency, ref classesNumber);
double[] classes = (double[])classifyGEN.ClassBreaks;
int classCount = classes.GetUpperBound(0);
//设置着色对象的分级数据
IClassBreaksRenderer classBreaksRenderer = new ClassBreaksRendererClass();
classBreaksRenderer.Field = "ID";
classBreaksRenderer.BreakCount = classCount;
classBreaksRenderer.SortClassesAscending = true;
//产生分级着色需要的颜色带对象的起止颜色对象
IAlgorithmicColorRamp pColorRamp = new AlgorithmicColorRampClass();
pColorRamp.FromColor = GetHSV(60, 100, 96);
pColorRamp.ToColor = GetHSV(0, 100, 96);
pColorRamp.Size = classCount;
pColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;
bool aaa = true;
pColorRamp.CreateRamp(out aaa);
//获得颜色
IEnumColors pEnumColors;
pEnumColors = pColorRamp.Colors;
pEnumColors.Reset();
IColor pColor;
ISimpleLineSymbol pLineSymbol;
int breakIndex;
//需要注意的是分级着色对象中的symbol和break的下标都是从0开始
for (breakIndex = 0; breakIndex < classCount - 1; breakIndex++)
{
pColor = pEnumColors.Next();
pLineSymbol = new SimpleLineSymbolClass();
pLineSymbol.Color = pColor;
pLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid;
classBreaksRenderer.set_Symbol(breakIndex, pLineSymbol as ISymbol);
classBreaksRenderer.set_Break(breakIndex, classes[breakIndex]);
pGeoFeatureLayer.Renderer = classBreaksRenderer as IFeatureRenderer;
}
}
private IHsvColor GetHSV(int r, int g, int b)
{
IHsvColor pColor;
pColor = new HsvColorClass();
pColor.Hue = r;
pColor.Saturation = g;
pColor.Value = b;
return pColor;
}
}
}
Form1:
Form2.cs[设计]:
实验:使用输入坐标点画要素
从用户输入的点创建要素,输入四个点,画一个网格多边形。
(每产生一个点,我们可以在dbf文件中查看多了部分记录)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
namespace shiyan5_2
{
public partial class Form1 : Form
{
IScreenDisplay m_pSDisplay;
ISimpleFillSymbol pSym;
IRgbColor pColor;
IPointCollection m_pPointCol;
IPoint m_pPoint;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
axMapControl1.AddShapeFile(Application.StartupPath, "\\wind");
m_pSDisplay = axMapControl1.ActiveView.ScreenDisplay;
m_pPointCol = new PolygonClass();
pSym = new SimpleFillSymbolClass();
pColor = new RgbColorClass();
pColor.Red = 255;
pSym.Style = esriSimpleFillStyle.esriSFSCross;
pSym.Color = pColor;
m_pSDisplay.SetSymbol(pSym as ISymbol);
}
private void button1_Click(object sender, EventArgs e)
{
m_pPoint = new PointClass();
object missing1 = Type.Missing;
object missing2 = Type.Missing;
m_pPoint.X = double.Parse(textBox1.Text);
m_pPoint.Y = double.Parse(textBox2.Text);
m_pPointCol.AddPoint(m_pPoint, missing1, missing2);
textBox1.Text = null;
textBox2.Text = null;
}
private void button2_Click(object sender, EventArgs e)
{
m_pSDisplay.StartDrawing(m_pSDisplay.hDC, (short)esriScreenCache.esriNoScreenCache);
m_pSDisplay.SetSymbol(pSym as ISymbol);
m_pSDisplay.DrawPolygon(m_pPointCol as IGeometry);
m_pSDisplay.FinishDrawing();
}
}
}