/// <summary>
/// 单一符号选择事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void rbSymbol_CheckedChanged(object sender, EventArgs e)
{
if (rbSymbol.Checked)
{
onlySymbol.Visible = true;
onlyField.Visible = false;
}
}
/// <summary>
/// 唯一值选择事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void rbField_CheckedChanged(object sender, EventArgs e)
{
if (rbField.Checked)
{
onlySymbol.Visible = false;
onlyField.Visible = true;
}
}
/// <summary>
/// 添加所有值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void addAllValue_Click(object sender, EventArgs e)
{
if (null == layer || !(layer is IFeatureLayer)) return;
IFeatureLayer featureLayer = layer as IFeatureLayer;
if (null == featureLayer.FeatureClass) return;
IFeatureClass featureClass = featureLayer.FeatureClass;
IFeatureCursor featureCursor = featureClass.Search(null,true);
IFeature feature = featureCursor.NextFeature();
//获取指定字段的所有值
List<object> fieldValue = new List<object>();
while(feature != null)
{
int l = feature.Fields.FindField(checkedFields.Text);
fieldValue.Add(feature.get_Value(l));
feature = featureCursor.NextFeature();
}
//去重复
List<object> fieldValue_Distinct = fieldValue.Distinct().ToList();
//临时符号
ISymbol pSymbol = UniqueValueSymbol[0];
//清空显示
if (fieldValue_Distinct.Count != 0)
{
UniqueValueSymbol.RemoveRange(0, FeatureGridView.Rows.Count);
FeatureGridView.Rows.Clear();
}
//添加到显示
for (int i = 0; i < fieldValue_Distinct.Count; i++)
{
int k = FeatureGridView.Rows.Add(1);
//添加符号(根据色带添加,此处临时固定一个Symbol)
FeatureGridView.Rows[k].Cells[0].Value = PreViewFillSymbol(pSymbol, FeatureGridView.Columns[0].Width, FeatureGridView.Rows[0].Height);
UniqueValueSymbol.Add(pSymbol);
//添加值字段
FeatureGridView.Rows[k].Cells[1].Value = fieldValue_Distinct[i];
//添加标注字段
FeatureGridView.Rows[k].Cells[2].Value = fieldValue_Distinct[i];
//添加计数字段
FeatureGridView.Rows[k].Cells[3].Value = fieldValue.Count(s => s.ToString() == fieldValue_Distinct[i].ToString());
}
UpdateRemove();
}
/// <summary>
/// 移除
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void removeValue_Click(object sender, EventArgs e)
{
if (FeatureGridView.SelectedRows.Count > 0)
{
int i = FeatureGridView.SelectedRows[0].Index;
FeatureGridView.Rows.RemoveAt(i);
UniqueValueSymbol.RemoveAt(i);
}
if (FeatureGridView.Rows.Count == 0)
{
removeValue.Enabled = false;
removeAllValue.Enabled = false;
}
UpdateRemove();
}
/// <summary>
/// 移除全部
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void removeAllValue_Click(object sender, EventArgs e)
{
FeatureGridView.Rows.Clear();
UpdateRemove();
}
/// <summary>
/// 符号点击打开符号选择器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FeatureGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0)
{
//获取选择行号
int row = e.RowIndex;
//初始化符号
ISymbol pSymbol = UniqueValueSymbol[row];
//符号窗口
SymbolForm symbolForm = null;
//判断图层要素类型
IFeatureLayer featureLayer = layer as IFeatureLayer;
if (featureLayer == null) return;
//点类型
if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
{
symbolForm = new SymbolForm(pSymbol, esriSymbologyStyleClass.esriStyleClassMarkerSymbols);
}
//线类型
if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
{
symbolForm = new SymbolForm(pSymbol, esriSymbologyStyleClass.esriStyleClassLineSymbols);
}
//面类型
if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
{
symbolForm = new SymbolForm(pSymbol, esriSymbologyStyleClass.esriStyleClassFillSymbols);
}
DialogResult dialogResult = symbolForm.ShowDialog(this);
if (dialogResult == System.Windows.Forms.DialogResult.OK)
{
//获取填充符号
pSymbol = symbolForm.SymbolObject as ISymbol;
//填充符号
FeatureGridView.Rows[row].Cells[0].Value = PreViewFillSymbol(pSymbol, FeatureGridView.Columns[0].Width, FeatureGridView.Rows[0].Height);
//储存符号
UniqueValueSymbol[row] = pSymbol;
}
}
}
/// <summary>
/// 单一符号化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void picPreview_Click(object sender, EventArgs e)
{
//符号窗口
SymbolForm symbolForm = null;
//判断图层要素类型
IFeatureLayer featureLayer = layer as IFeatureLayer;
if (featureLayer == null) return;
//点类型
if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
{
symbolForm = new SymbolForm(SimpleSymbol, esriSymbologyStyleClass.esriStyleClassMarkerSymbols);
}
//线类型
if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
{
symbolForm = new SymbolForm(SimpleSymbol, esriSymbologyStyleClass.esriStyleClassLineSymbols);
}
//面类型
if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
{
symbolForm = new SymbolForm(SimpleSymbol, esriSymbologyStyleClass.esriStyleClassFillSymbols);
}
DialogResult dialogResult = symbolForm.ShowDialog(this);
if (dialogResult == System.Windows.Forms.DialogResult.OK)
{
//获取填充符号
SimpleSymbol = symbolForm.SymbolObject as ISymbol;
//填充符号
picPreview.Image = PreViewFillSymbol(SimpleSymbol, picPreview.Width, picPreview.Height);
}
}
/// <summary>
/// 更新移除
/// </summary>
private void UpdateRemove()
{
if (FeatureGridView.Rows.Count != 0)
{
removeValue.Enabled = true;
removeAllValue.Enabled = true;
}
else
{
removeValue.Enabled = false;
removeAllValue.Enabled = false;
}
}
/// <summary>
/// 填充符号字段列表
/// </summary>
/// <param name="layer"></param>
private void FillSymbolFields(ILayer layer)
{
if (null == layer || !(layer is IFeatureLayer)) return;
IFeatureLayer featureLayer = layer as IFeatureLayer;
if (null == featureLayer.FeatureClass) return;
IFeatureClass featureClass = featureLayer.FeatureClass;
IFields fields = featureClass.Fields;
for (int i = 0; i < fields.FieldCount; i++)
{
IField field = fields.get_Field(i);
if (MapHelper.IsReservedField(featureClass, field.Name)) continue;
checkedFields.Properties.Items.Add(field.Name);
}
if (checkedFields.Properties.Items.Count != 0)
{
checkedFields.SelectedIndex = 0;
}
}
/// <summary>
/// 填充图层渲染符号
/// </summary>
/// <param name="pLayer"></param>
private void FillLayerRenderer(ILayer player)
{
if (null == layer || !(layer is IFeatureLayer)) return;
//获取要素图层
IFeatureLayer pFeatureLayer = player as IFeatureLayer;
IGeoFeatureLayer geoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;
if (geoFeatureLayer == null) return;
//单要素渲染
if (geoFeatureLayer.Renderer is ISimpleRenderer)
{
ISimpleRenderer pSimpleRenderer = geoFeatureLayer.Renderer as ISimpleRenderer;
if (pSimpleRenderer == null) return;
//填充图层符号
SimpleSymbol = pSimpleRenderer.Symbol;
if (SimpleSymbol != null)
{
picPreview.Image = PreViewFillSymbol(SimpleSymbol, picPreview.Width, picPreview.Height);
}
rbSymbol.Checked = true;
}
//唯一值渲染
if (geoFeatureLayer.Renderer is IUniqueValueRenderer)
{
IUniqueValueRenderer uniqueValueRenderer = geoFeatureLayer.Renderer as IUniqueValueRenderer;
if (uniqueValueRenderer == null) return;
//填充渲染字段名字
checkedFields.SelectedItem = uniqueValueRenderer.get_Field(0);
//填充符号样式
for (int i = 0; i < uniqueValueRenderer.ValueCount; i++)
{
//获取值名称
string name = uniqueValueRenderer.get_Value(i);
//获取标签
string lable = uniqueValueRenderer.get_Label(name);
//获取符号
ISymbol pSymbol = uniqueValueRenderer.get_Symbol(name);
//储存符号
UniqueValueSymbol.Add(pSymbol);
//填充到表格
int k = FeatureGridView.Rows.Add(1);
//添加符号
FeatureGridView.Rows[k].Cells[0].Value = PreViewFillSymbol(pSymbol, FeatureGridView.Columns[0].Width, FeatureGridView.Rows[0].Height);
//添加值
FeatureGridView.Rows[k].Cells[1].Value = name;
//添加标注
FeatureGridView.Rows[k].Cells[2].Value = lable;
//添加数量
FeatureGridView.Rows[k].Cells[3].Value = "?";
}
rbField.Checked = true;
UpdateRemove();
}
}
/// <summary>
/// 图层单要素渲染器
/// </summary>
/// <param name="player"></param>
/// <param name="fillSymbol"></param>
private void SimpleRenderer(ILayer player, ISymbol pSymbol)
{
//获取要素图层
IFeatureLayer pFeatureLayer = player as IFeatureLayer;
IGeoFeatureLayer geoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;
//单要素渲染
ISimpleRenderer pSimpleRenderer = new SimpleRendererClass();
pSimpleRenderer.Symbol = pSymbol;
//将样式附给图层
geoFeatureLayer.Renderer = pSimpleRenderer as IFeatureRenderer;
}
/// <summary>
/// 图层唯一值渲染器
/// </summary>
/// <param name="player"></param>
/// <param name="nameValue"></param>
/// <param name="RenderField"></param>
/// <param name="UniqueValueSymbol"></param>
private void UniqueValueRenderer(ILayer player, List<string> nameValue, string RenderField, List<ISymbol> UniqueValueSymbol)
{
//获取要素图层
IFeatureLayer pFeatureLayer = player as IFeatureLayer;
IGeoFeatureLayer geoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;
//唯一值渲染
IUniqueValueRenderer uniqueValueRenderer = new UniqueValueRendererClass();
uniqueValueRenderer.FieldCount = 1;
uniqueValueRenderer.set_Field(0, RenderField);
//符号同步
for (int i = 0; i < nameValue.Count; i++)
{
uniqueValueRenderer.AddValue(nameValue[i], RenderField, UniqueValueSymbol[i]);
}
//将样式附给图层
geoFeatureLayer.Renderer = uniqueValueRenderer as IFeatureRenderer;
}
/// <summary>
/// Symbol转为Image
/// </summary>
/// <param name="pSymbol"></param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <returns></returns>
private Image PreViewFillSymbol(ISymbol pSymbol, int width, int height)
{
if (pSymbol == null) return null;
IStyleGalleryClass pStyleGalleryClass = null;
if (pSymbol is IMarkerSymbol)
{
pStyleGalleryClass = new MarkerSymbolStyleGalleryClass();
}
if (pSymbol is ILineSymbol)
{
pStyleGalleryClass = new LineSymbolStyleGalleryClass();
}
if (pSymbol is IFillSymbol)
{
pStyleGalleryClass = new FillSymbolStyleGalleryClass();
}
Image img = new Bitmap(width, height);
Graphics gc = Graphics.FromImage(img);
IntPtr hdc = gc.GetHdc();
tagRECT rect = new tagRECT();
rect.left = 0;
rect.top = 0;
rect.right = width;
rect.bottom = height;
pStyleGalleryClass.Preview(pSymbol, hdc.ToInt32(), ref rect);
gc.ReleaseHdc(hdc);
gc.Dispose();
return img;
}
ArcGIS Engine - 图层渲染
于 2020-11-20 16:23:18 首次发布