ArcEngine簡單教程彙總
目錄
1 目的
實現簡單的按照arcmap自帶色帶,進行圖層渲染功能,包括
對柵格圖層,按柵格值進行拉伸渲染、分級渲染、唯一值渲染
對矢量圖層,按某一字段值進行分級渲染、唯一值渲染
2 概要
本文只介紹主要功能方法,具體的調用關係、窗口實現等完整完整demo可見:
https://download.csdn.net/download/nominior/12454058
色帶:
1)獲取
使用SymbologyControl控件獲取ArcMap色帶,色帶位置:ArcMap安裝路徑/Styles/ESRI.Style
2)顯示
使用C#中的combobox對色帶進行顯示(比SymbologyControl效果略好),分兩個過程:
- 修改combobox的DrawItem方法,使得combobox可以繪製色帶
- 遍歷SymbologyControl中的色帶,繪製到combobox中
柵格渲染:
- 包括拉伸渲染、分級渲染、唯一值渲染等渲染方式
- 基本渲染流程爲:創建並設置對應渲染器,渲染顏色與渲染值映射,柵格圖層渲
具體見 代碼及註釋
矢量渲染:
- 包括拉伸渲染、分級渲染、唯一值渲染等渲染方式
- 基本渲染流程爲:創建並設置對應渲染器,數值處理,渲染顏色與渲染值映射,柵格圖層渲染
具體見 代碼及註釋
3代碼
涉及的ArcGIS引用、界面示意如圖:
combobox色帶顯示代碼
// combobox重繪
private void cb_colormap_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();
e.Graphics.DrawImage(cb_colormap.Items[e.Index] as Image, e.Bounds);
}
// 初始化符號庫
private void InitSymbologyControl()
{
//色帶定位
string sInstall = "D:\\ArcGIS\\Desktop10.2\\";
string defaultStyle = System.IO.Path.Combine(sInstall, "Styles\\ESRI.ServerStyle");
//色帶讀取
this.axSymbologyControl1.LoadStyleFile(defaultStyle);
this.axSymbologyControl1.StyleClass = esriSymbologyStyleClass.esriStyleClassColorRamps;
//色帶另存
this.pSymbologyStyleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps);
}
// 初始化色帶下拉框
private void InitColorRampCombobox()
{
this.cb_colormap.DrawMode = DrawMode.OwnerDrawFixed;
this.cb_colormap.DropDownStyle = ComboBoxStyle.DropDownList;
//繪製色帶
for (int i = 0; i < pSymbologyStyleClass.ItemCount; i++)
{
//從另存中讀取色帶
IStyleGalleryItem pStyleGalleryItem = pSymbologyStyleClass.GetItem(i);
IPictureDisp pPictureDisp = pSymbologyStyleClass.PreviewItem(pStyleGalleryItem, cb_colormap.Width, cb_colormap.Height);
Image image = Image.FromHbitmap(new IntPtr(pPictureDisp.Handle));
cb_colormap.Items.Add(image);
}
cb_colormap.SelectedIndex = 25;
}
柵格渲染代碼
#region 不同方式的柵格渲染
private void SetRasterSymbol(IRasterLayer pRasterLayer)
{
//獲取cb選擇的色帶序號,根據序號選擇色帶
int symbol_index = cb_colormap.SelectedIndex;
ISymbologyStyleClass symbologyStyleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps);
IStyleGalleryItem mStyleGalleryItem = symbologyStyleClass.GetItem(symbol_index);
IColorRamp colorramp_select = (IColorRamp)mStyleGalleryItem.Item;
if (cb_method.Text == "Stretch")
{
RasterStretchRender(colorramp_select, pRasterLayer);
}
else if (cb_method.Text == "Classify")
{
if (textBox1.Text == "不分")
{
}
else
{
int cls_num = Convert.ToInt32(textBox1.Text);
RasterClassifyRender(colorramp_select, pRasterLayer, cls_num);
}
}
else if (cb_method.Text == "Unique")
{
RasterUniqueRender(colorramp_select, pRasterLayer);
}
//視圖刷新
map.ActiveView.ContentsChanged();
map.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
private void RasterStretchRender(IColorRamp pColorRamp, IRasterLayer pRasterLayer)
{
//渲染器定義
IRasterStretchColorRampRenderer pSRRender = new RasterStretchColorRampRendererClass();
IRasterRenderer pRRender = pSRRender as IRasterRenderer;
//渲染器設置
pRRender.Raster = pRasterLayer.Raster;
pRRender.Update();
pSRRender.ColorRamp = pColorRamp;
//柵格渲染
pRasterLayer.Renderer = pRRender;
}
private void RasterClassifyRender(IColorRamp pColorRamp, IRasterLayer pRasterLayer, int cls_num)
{
//渲染器定義
IRasterClassifyColorRampRenderer pRCRender = new RasterClassifyColorRampRendererClass();
IRasterRenderer pRRend = pRCRender as IRasterRenderer;
//渲染器設置
pRRend.Raster = pRasterLayer.Raster;
pRRend.Update();
pRCRender.ClassCount = cls_num;
//渲染映射
int gap = pColorRamp.Size / (cls_num-1);
IFillSymbol fillSymbol = new SimpleFillSymbol() as IFillSymbol;
for (int i = 0; i < pRCRender.ClassCount; i++)
{
int index;
if (i < pRCRender.ClassCount - 1)
{
index = i * gap;
}
else
{
index = pColorRamp.Size-1;
}
fillSymbol.Color = pColorRamp.get_Color(index);
pRCRender.set_Symbol(i, fillSymbol as ISymbol);
pRCRender.set_Label(i, pRCRender.get_Break(i).ToString("0.00") +"-"+ pRCRender.get_Break(i+1).ToString("0.00"));
}
//柵格渲染
pRasterLayer.Renderer = pRRend;
}
private void RasterUniqueRender(IColorRamp pColorRamp, IRasterLayer pRasterLayer)
{
//渲染器定義
IRasterUniqueValueRenderer pRURender = new RasterUniqueValueRendererClass();
IRasterRenderer pRRend = pRURender as IRasterRenderer;
//渲染器設置
pRRend.Raster = pRasterLayer.Raster;
pRRend.Update();
IUniqueValues uniqueValues = new UniqueValuesClass();
IRasterCalcUniqueValues calcUniqueValues = new RasterCalcUniqueValuesClass();
calcUniqueValues.AddFromRaster(pRasterLayer.Raster, 0, uniqueValues);//計算第0通道的唯一值
//渲染映射
int gap = pColorRamp.Size / (uniqueValues.Count - 1);
IFillSymbol fillSymbol = new SimpleFillSymbol() as IFillSymbol;
for (int i = 0; i < uniqueValues.Count; i++)
{
int index;
if (i < uniqueValues.Count - 1)
{
index = i * gap;
}
else
{
index = pColorRamp.Size - 1;
}
fillSymbol.Color = pColorRamp.get_Color(index);
pRURender.AddValue(0, i, uniqueValues.get_UniqueValue(i));
pRURender.set_Label(0, i, uniqueValues.get_UniqueValue(i).ToString());
pRURender.set_Symbol(0, i, fillSymbol as ISymbol);
}
//柵格渲染
pRasterLayer.Renderer = pRRend;
}
#endregion
矢量渲染代碼
#region 不同方式的矢量渲染
private void SetFeatureSymbol(IFeatureLayer pFeatureLayer)
{
//獲取cb選擇的色帶序號,根據序號選擇色帶
int symbol_index = cb_colormap.SelectedIndex;
ISymbologyStyleClass symbologyStyleClass = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps);
IStyleGalleryItem mStyleGalleryItem = symbologyStyleClass.GetItem(symbol_index);
IColorRamp colorramp_select = (IColorRamp)mStyleGalleryItem.Item;
if (cb_method.Text == "Classify")
{
if (textBox1.Text == "不分")
{
}
else
{
int cls_num = Convert.ToInt32(textBox1.Text);
FeatureClassifyRender(colorramp_select, pFeatureLayer, cls_num);
}
}
else if (cb_method.Text == "Unique")
{
FeatureUniqueRender(colorramp_select, pFeatureLayer);
}
//視圖刷新
map.ActiveView.ContentsChanged();
map.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
private void FeatureClassifyRender(IColorRamp pColorRamp, IFeatureLayer pFeatureLayer, int cls_num)
{
if (pField.Type == esriFieldType.esriFieldTypeDouble || pField.Type == esriFieldType.esriFieldTypeInteger || pField.Type == esriFieldType.esriFieldTypeOID)
{
//渲染器定義
IClassBreaksRenderer pFCRender = new ClassBreaksRendererClass();
IFeatureRenderer pFRender = pFCRender as IFeatureRenderer;
//渲染器設置
pFCRender.Field = pField.Name;
pFCRender.BreakCount = cls_num+1;
//數值處理
ITableHistogram histo = new BasicTableHistogramClass();//獲取直方圖
histo.Field = pField.Name;
histo.Table = pFeatureLayer.FeatureClass as ITable;
object dbArray, nArray;//定義分級數組
(histo as IBasicHistogram).GetHistogram(out dbArray, out nArray);
double[] dataArray = dbArray as double[];
int[] fredArray = nArray as int[];
IClassifyGEN classify = new EqualIntervalClass();//平均分級法
classify.Classify(dataArray, fredArray, cls_num);
double[] Breaks = classify.ClassBreaks as double[];//分級數組確定
//渲染映射
pFCRender.MinimumBreak = Breaks[0];
int gap = pColorRamp.Size / (pFCRender.BreakCount - 1);
for (int i = 0; i < cls_num; i++)
{
int index;
if (i < cls_num - 1)
{
index = i * gap;
}
else
{
index = pColorRamp.Size - 1;
}
ISymbol pSymbol = null;
if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
{
pSymbol = new SimpleFillSymbolClass();
(pSymbol as IFillSymbol).Outline.Width = 1.0;
(pSymbol as IFillSymbol).Color = pColorRamp.get_Color(index);
}
else if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
{
pSymbol = new SimpleLineSymbolClass();
(pSymbol as ILineSymbol).Width = 1.0;
(pSymbol as ILineSymbol).Color = pColorRamp.get_Color(index);
}
else if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
{
pSymbol = new SimpleMarkerSymbolClass();
(pSymbol as IMarkerSymbol).Size = 1.0;
(pSymbol as IMarkerSymbol).Color = pColorRamp.get_Color(index);
}
pFCRender.set_Break(i, Breaks[i + 1]);
pFCRender.set_Symbol(i, pSymbol);
pFCRender.set_Label(i, Breaks[i].ToString() + "-" + Breaks[i + 1].ToString());
}
//矢量圖層渲染
(pFeatureLayer as IGeoFeatureLayer).Renderer = pFRender;
}
}
private void FeatureUniqueRender(IColorRamp pColorRamp, IFeatureLayer pFeatureLayer)
{
//渲染器定義
IUniqueValueRenderer pFURender = new UniqueValueRendererClass();
IFeatureRenderer pFRender = pFURender as IFeatureRenderer;
//渲染器設置
pFURender.FieldCount = 1;
pFURender.set_Field(0, pField.Name);
if (pField.Type == esriFieldType.esriFieldTypeString)
{
pFURender.set_FieldType(0, true);
}
else
{
pFURender.set_FieldType(0, false);
}
//數值處理
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IFeatureCursor lFeatureCursor = pFeatureClass.Search(null, false);
IDataStatistics pData = new DataStatisticsClass();
pData.Field = pField.Name;
pData.Cursor = lFeatureCursor as ICursor;
IEnumerator pEnumVar = pData.UniqueValues;
string[] uniqueValues = new string[pData.UniqueValueCount];
pEnumVar.Reset();
int n = 0;
while (pEnumVar.MoveNext())
{
uniqueValues[n++] = pEnumVar.Current.ToString();
}
//渲染映射
int gap = pColorRamp.Size / (uniqueValues.Length - 1);
for (int i = 0; i < uniqueValues.Length; i++)
{
int index;
if (i < uniqueValues.Length - 1)
{
index = i * gap;
}
else
{
index = pColorRamp.Size - 1;
}
ISymbol pSymbol = null;
if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
{
pSymbol = new SimpleFillSymbolClass();
(pSymbol as IFillSymbol).Outline.Width = 1.0;
(pSymbol as IFillSymbol).Color = pColorRamp.get_Color(index);
}
else if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
{
pSymbol = new SimpleLineSymbolClass();
(pSymbol as ILineSymbol).Width = 1.0;
(pSymbol as ILineSymbol).Color = pColorRamp.get_Color(index);
}
else if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
{
pSymbol = new SimpleMarkerSymbolClass();
(pSymbol as IMarkerSymbol).Size = 2.0;
(pSymbol as IMarkerSymbol).Color = pColorRamp.get_Color(index);
}
pFURender.AddValue(uniqueValues[i], "", pSymbol);
}
//矢量圖層渲染
(pFeatureLayer as IGeoFeatureLayer).Renderer = pFRender;
}
#endregion
4小結
渲染過程2個關鍵對象:色帶、渲染器,1個重要過程渲染器與對應渲染值、渲染顏色的關係映射