ArcEngine部分工作总结

Arcengine工作总结
地物点查询
本部分可以在一个窗体中实现,也可以在两个窗体中实现。由于工作要求本人是在两个窗体中实现的:
弹出窗体的名称为FormQuery
主窗体单机查询时间的代码
FormQuery qu = new FormQuery(axMapControl);
qu.TopMost = true;
qu.Show();
FormQuery中要有
public FormQuery(ESRI.ArcGIS.Controls.AxMapControl axMapControl1)
{
// TODO: Complete member initialization
m_axMapControl = axMapControl1;
InitializeComponent();
}
在formload中
private void Query_Load(object sender, EventArgs e)
{
RefreshLayer();
}
加载图层部分的函数,建议写在类中
private void RefreshLayer()
{

layerComboBox.Items.Clear();
for (int i = 0; i < m_axMapControl.LayerCount; i++)
{
//判断是否为矢量图层
if (m_axMapControl.get_Layer(i) is IFeatureLayer)

layerComboBox.Items.Add(m_axMapControl.get_Layer(i).Name);
else
return;

}

layerComboBox.Text = layerComboBox.Items[0].ToString();

}
弹出窗体设置为:(控件和名称请自行设置)

查询条件可以使字段或者其他属性信息。
坐标定位
在主窗体的单机事件中
private void menuCoordinatePosition_Click(object sender, EventArgs e)
{
FormFixedPosition fp = new FormFixedPosition(g_MapControl);
fp.TopMost = true;
fp.Show();
}
FixedPosition为弹出窗体的名称。
在弹出窗体中设置字段:
string strTxtInputX = "";
string strTxtInputY = "";
弹出窗体的构造函数
public FormFixedPosition(IMapControl4 MapControl)
{
InitializeComponent();
m_MapControl = MapControl;
}
弹出窗体的formload事件
private void FixedPosition_Load(object sender, EventArgs e)
{
pMap = m_MapControl.Map;
pActiveView = pMap as IActiveView;
pGraContainer = pMap as IGraphicsContainer;
}
弹出窗体格局:

Txtbox的keypress事件:
//Y坐标
private void txtY_KeyPress(object sender, KeyPressEventArgs e)
{
if (pElement != null)
{
pGraContainer.DeleteAllElements();
}
if ((e.KeyChar < 48 || e.KeyChar > 57) && (e.KeyChar != 8) && (e.KeyChar != 13) && (e.KeyChar != 46))
{
e.Handled = true;
}
if (e.KeyChar == (char)13)
{
strTxtInputX = txtX.Text;
strTxtInputY = txtY.Text;

if (strTxtInputX == "" || strTxtInputY == "")
{
MessageBox.Show("请输入XY坐标!");
}
else
{
dleTxtInputX = System.Convert.ToDouble(strTxtInputX);//获取输入X坐标
dleTxtInputY = System.Convert.ToDouble(strTxtInputY);//获取输入Y坐标

IPoint pPoint = new ESRI.ArcGIS.Geometry.Point();
pPoint.X = dleTxtInputX;
pPoint.Y = dleTxtInputY;

IRgbColor pColor = new RgbColorClass();
pColor.Red = 255;
pColor.Blue = 0;
pColor.Green = 0;

ISimpleMarkerSymbol pMarkerSym = new SimpleMarkerSymbolClass();
pMarkerSym.Color = pColor;
pMarkerSym.Size = 8;
pMarkerSym.Style = esriSimpleMarkerStyle.esriSMSCircle;

IMarkerElement pMarkerEle = new MarkerElementClass();
pMarkerEle.Symbol = pMarkerSym;

pElement = pMarkerEle as IElement;
pElement.Geometry = pPoint;
pGraContainer.AddElement(pElement, 0);
m_MapControl.CenterAt(pPoint);
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

Marshal.ReleaseComObject(pPoint);
Marshal.ReleaseComObject(pColor);
Marshal.ReleaseComObject(pMarkerSym);
Marshal.ReleaseComObject(pMarkerEle);
}
}
}
//X坐标
private void txtX_KeyPress(object sender, KeyPressEventArgs e)
{
if (pElement != null)
{
pGraContainer.DeleteAllElements();
}
if ((e.KeyChar < 48 || e.KeyChar > 57) && (e.KeyChar != 8) && (e.KeyChar != 13) && (e.KeyChar != 46))
{
e.Handled = true;
}
if (e.KeyChar == (char)13)
{
strTxtInputX = txtX.Text;
strTxtInputY = txtY.Text;

if (strTxtInputX == "" || strTxtInputY == "")
{
MessageBox.Show("请输入XY坐标!");
}
else
{
dleTxtInputX = System.Convert.ToDouble(strTxtInputX);//获取输入X坐标
dleTxtInputY = System.Convert.ToDouble(strTxtInputY);//获取输入Y坐标

IPoint pPoint = new ESRI.ArcGIS.Geometry.Point();
pPoint.X = dleTxtInputX;
pPoint.Y = dleTxtInputY;

IRgbColor pColor = new RgbColorClass();
pColor.Red = 255;
pColor.Blue = 0;
pColor.Green = 0;

ISimpleMarkerSymbol pMarkerSym = new SimpleMarkerSymbolClass();
pMarkerSym.Color = pColor;
pMarkerSym.Size = 8;
pMarkerSym.Style = esriSimpleMarkerStyle.esriSMSCircle;

IMarkerElement pMarkerEle = new MarkerElementClass();
pMarkerEle.Symbol = pMarkerSym;

pElement = pMarkerEle as IElement;
pElement.Geometry = pPoint;
pGraContainer.AddElement(pElement, 0);
m_MapControl.CenterAt(pPoint);
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

Marshal.ReleaseComObject(pPoint);
Marshal.ReleaseComObject(pColor);
Marshal.ReleaseComObject(pMarkerSym);
Marshal.ReleaseComObject(pMarkerEle);
}
}
}

定位效果。
若想实现地物点定位,需要明确地物点的坐标进行参数传递即可。
图幅号定位
主窗体的单击事件调出FormSheetNoPosition窗体:
FormSheetNoPosition form = new FormSheetNoPosition(axMapControl);
form.TopMost = true;
form.Show();
然后FormSheetNoPosition窗体的代码具体如下:
(本部分要添加g_MapControl.Update();避免会出现先闪烁后刷新的情况)
public partial class FormSheetNoPosition : Form
{

public int iLayerIndex;
private IMap m_Map;
IFeatureLayer featurelayer1;//用于闪烁
IFeature feature1;//用于闪烁
AxMapControl g_MapControl;
int i = 0;
public FormSheetNoPosition(AxMapControl axMapControl)
{
InitializeComponent();
this.g_MapControl = axMapControl;
}

private void btnOK_Click(object sender, EventArgs e)
{
positon();


}
public void positon()
{
if (layercmb.Text == "")
{
MessageBox.Show("请选择类型", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (filecmb.Text == "")
{
MessageBox.Show("请选择名称", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
//单点定位
IActiveView pActiveView;
pActiveView = (IActiveView)m_Map;
m_Map.ClearSelection();
pActiveView.Refresh();
IQueryFilter pQueryFilter = new QueryFilterClass();
IFeatureLayer pFeatureLayer;
pFeatureLayer = (IFeatureLayer)m_Map.get_Layer(iLayerIndex);
IFields pFields;
pFields = pFeatureLayer.FeatureClass.Fields;
IField pField;
pField = pFields.get_Field(3);
string str;
str = pFields.get_Field(3).Name;
IFeatureCursor pFeatureCursor1;
pFeatureCursor1 = pFeatureLayer.FeatureClass.Search(null, false);

IFeature pFeature1;
pFeature1 = pFeatureCursor1.NextFeature();
switch (pField.Type)
{
case esriFieldType.esriFieldTypeString:
pQueryFilter.WhereClause = str + " = '" + filecmb.Text + "'";
break;
case esriFieldType.esriFieldTypeDouble:
case esriFieldType.esriFieldTypeInteger:
case esriFieldType.esriFieldTypeSingle:
case esriFieldType.esriFieldTypeSmallInteger:
pQueryFilter.WhereClause = str + " = " + filecmb.Text;
break;
}

IFeatureCursor pFeatureCursor;
pFeatureCursor = pFeatureLayer.FeatureClass.Search(pQueryFilter, false);

IFeature pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
m_Map.SelectFeature(pFeatureLayer, pFeature);
filecmb.Text = pFeature.get_Value(3).ToString();//用于显示文本框内容
//居中显示
IPoint pPoint = new PointClass();
pPoint.X = (pFeature.Extent.XMin + pFeature.Extent.XMax) / 2;
pPoint.Y = (pFeature.Extent.YMin + pFeature.Extent.YMax) / 2;
this.g_MapControl.CenterAt(pPoint);
this.g_MapControl.MapScale = 500000;
g_MapControl.MapScale = 500000;
featurelayer1 = pFeatureLayer;
feature1 = pFeature;
pFeature = pFeatureCursor.NextFeature();
g_MapControl.Update();//关键语句
g_MapControl.FlashShape(feature1.Shape);
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
}
}
private void layercmb_SelectedIndexChanged(object sender, EventArgs e)
{
iLayerIndex = layercmb.Items.IndexOf(layercmb.Text);
filecmb.Text = "";
filecmb.Items.Clear();

if (layercmb.Text == "")
{
MessageBox.Show("请选择图层", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}

//地点名称添加到列表框
IFeatureLayer pFeatureLayer;
pFeatureLayer = (IFeatureLayer)m_Map.get_Layer(iLayerIndex);

//string a;
//a =Convert.ToString(m_Map.LayerCount);

IFeatureCursor pFeatureCursor;
pFeatureCursor = pFeatureLayer.FeatureClass.Search(null, false);

IFeature pFeature;
pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
string fldValue;

fldValue = Convert.ToString(pFeature.get_Value(3));
filecmb.Items.Add(fldValue);
pFeature = pFeatureCursor.NextFeature();
}
}

private void clearbtn_Click(object sender, EventArgs e)
{

//清除已选择要素
filecmb.Text = "";
layercmb.Text = "";
ControlsClearSelectionCommand clscmd = new ControlsClearSelectionCommandClass();
clscmd.OnCreate(g_MapControl.Object);
clscmd.OnClick();
//全图
ControlsMapFullExtentCommand mfecmd = new ControlsMapFullExtentCommandClass();
mfecmd.OnCreate(g_MapControl.Object);
mfecmd.OnClick();
}
private void AddLayername()
{

m_Map = g_MapControl.Map;
ILayer pLayer;
for (int i = 0; i < m_Map.LayerCount; i++)
{
pLayer = m_Map.get_Layer(i);
if (i >= 0 && i <= m_Map.LayerCount)
{
this.layercmb.Items.Add(pLayer.Name);
}
}
}

private void filecmb_DropDown(object sender, EventArgs e)
{

}

private void layercmb_DropDown(object sender, EventArgs e)
{
layercmb.Items.Clear();
AddLayername();
}

}

Shp数据的导入与导出
Shp数据导入SDE数据库
首先是要连接SDE然后要确定函数shpFeatureClassToGeodatabase(string inputPath, string sdePath)的两个路径。电脑上需要有E:arcgis-test est这个路径。其中axlisensecontrol的属性要做一些改动,只能是这种选择,不要多也不要少,不然会出现转换失败等各种问题。
private void menuImportSHP_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "(*.shp)|*.shp";
dlg.Title = "打开shp文件路径";
if (DialogResult.OK == dlg.ShowDialog())
{
string shpPath = dlg.FileName;

//string shpPath = @"C:UsersdpdDesktopCalifornia estGolfCourses.shp";
//string sdePath = @"C:UsersdpdAppDataRoamingESRIDesktop10.1ArcCatalogConnection to 192.168.159.186.sde";
IPropertySet pProSet = new PropertySet();

try
{
pProSet.SetProperty("Server", "192.168.159.186");

pProSet.SetProperty("Instance", "sde:oracle11g:192.168.159.186/orcl");

pProSet.SetProperty("Database", "orcl");

pProSet.SetProperty("user", "sde");

pProSet.SetProperty("password", "sde");

pProSet.SetProperty("version", "SDE.DEFAULT");

}

catch (Exception ex)
{
string msg = ex.Message;
}

string path = @"E:arcgis-test est";

string sdeName = @"test.sde";

string sdePath = path + "\" + sdeName;

if (File.Exists(sdePath))
{
File.Delete(sdePath);
}

IWorkspaceFactory workspaceFactory = new SdeWorkspaceFactoryClass();
IWorkspaceName workspaceName = workspaceFactory.Create(path, sdeName, pProSet, 0);

shpFeatureClassToGeodatabase(shpPath, sdePath);
}
}
public static void shpFeatureClassToGeodatabase(string inputPath, string sdePath)
{

ESRI.ArcGIS.ConversionTools.FeatureClassToGeodatabase featureClassToGeodatabase = new ESRI.ArcGIS.ConversionTools.FeatureClassToGeodatabase();

featureClassToGeodatabase.Output_Geodatabase = sdePath;

featureClassToGeodatabase.Input_Features = inputPath;

featureClassToGeodatabase.Derived_Geodatabase = "";

Geoprocessor geoprocessor = new Geoprocessor();

geoprocessor.OverwriteOutput = true;

try
{

geoprocessor.Execute(featureClassToGeodatabase, null);

string mess = null;

for (int k = 0; k < geoprocessor.MessageCount; k++)
{

mess += geoprocessor.GetMessage(k) + " ";

}

MessageBox.Show(mess);

}

catch (Exception ex)
{

string mess = null;

for (int k = 0; k < geoprocessor.MessageCount; k++)
{

mess += geoprocessor.GetMessage(k) + " ";

}

}
}
导出为shp数据
本部分分为整个shp图层数据导出,和可视范围内的数据导出两部分

主窗体的单机事件:

private void exportshpToolStripMenuItem_Click(object sender, EventArgs e)
{
if (layerCurrent != null)
{
FormExportVector fev = new FormExportVector(axMapControl, layerCurrent);
fev.Show();
}
else
{
MessageBox.Show("请选择一个图层!","提示!");
}

}

FormExportVector窗体的主要代码:


public partial class FormExportVector : Form
{
private ESRI.ArcGIS.Controls.AxMapControl axMapControl;
SaveFileDialog dlg = new SaveFileDialog();
ILayer layerCurrent = null;
public FormExportVector(ESRI.ArcGIS.Controls.AxMapControl axMapControl,ILayer layer)
{
// TODO: Complete member initialization
this.axMapControl = axMapControl;
this.layerCurrent = layer;
InitializeComponent();
}

private void FormExportVector_Load(object sender, EventArgs e)
{
cbExtent.SelectedIndex = 0;
}

private void btnOK_Click(object sender, EventArgs e)
{
//导出所有要素


if (cbExtent.Text == "所有要素")
{

if (layerCurrent != null)
{

try
{

if (layerCurrent != null)
{
IFeatureLayer pFeatureLayer = layerCurrent as IFeatureLayer;

if (pFeatureLayer.Visible)
{
ExportFeature(pFeatureLayer.FeatureClass, dlg.FileName);
}
MessageBox.Show("导出成功");
this.Close();
}
}

catch
{
MessageBox.Show("导出失败!");
this.Close();
}

}

}
//导出窗体范围内的要素
else if (cbExtent.Text == "窗口范围")
{
try
{
if (layerCurrent != null)
{
IEnvelope pEnvelope = axMapControl.Extent;
IFeatureLayer pFeatureLayer = layerCurrent as IFeatureLayer;
ISpatialFilter pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.Geometry = pEnvelope as IGeometry;
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;

//IFeatureCursor pFeatureCursor = pFeatureLayer.Search(pSpatialFilter as IQueryFilter, false);
//IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
//IFeature pFeature = pFeatureCursor.NextFeature();
//while (pFeature != null)
//{
// //pFeatures.Add(pFeature);
// pFeature = pFeatureCursor.NextFeature();
//}
//System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);

if (pFeatureLayer.Visible)
{
ExportFeatureByFilter(pFeatureLayer.FeatureClass, dlg.FileName, pSpatialFilter as IQueryFilter);
}
MessageBox.Show("导出成功");
this.Close();
}
}

catch
{
MessageBox.Show("导出失败!");
this.Close();
}

}
else
{
MessageBox.Show("请选择一个矢量图层");

}
}
public void ExportFeature(IFeatureClass pInFeatureClass, string pPath)
{
// 创建工作空间
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
string parentPath = pPath.Substring(0, pPath.LastIndexOf('\'));
string fileName = pPath.Substring(pPath.LastIndexOf('\') + 1, pPath.Length - pPath.LastIndexOf('\') - 1);
IWorkspaceName pWorkspaceName = pWorkspaceFactory.Create(parentPath, fileName, null, 0);
// Cast for IName
IName name = (IName)pWorkspaceName;
//Open a reference to the access workspace through the name object
IWorkspace pOutWorkspace = (IWorkspace)name.Open();

IDataset pInDataset = pInFeatureClass as IDataset;
IFeatureClassName pInFCName = pInDataset.FullName as IFeatureClassName;
IWorkspace pInWorkspace = pInDataset.Workspace;
IDataset pOutDataset = pOutWorkspace as IDataset;
IWorkspaceName pOutWorkspaceName = pOutDataset.FullName as IWorkspaceName;
IFeatureClassName pOutFCName = new FeatureClassNameClass();
IDatasetName pDatasetName = pOutFCName as IDatasetName;
pDatasetName.WorkspaceName = pOutWorkspaceName;
pDatasetName.Name = pInFeatureClass.AliasName;
IFieldChecker pFieldChecker = new FieldCheckerClass();
pFieldChecker.InputWorkspace = pInWorkspace;
pFieldChecker.ValidateWorkspace = pOutWorkspace;
IFields pFields = pInFeatureClass.Fields;
IFields pOutFields;
IEnumFieldError pEnumFieldError;
pFieldChecker.Validate(pFields, out pEnumFieldError, out pOutFields);
IFeatureDataConverter pFeatureDataConverter = new FeatureDataConverterClass();
pFeatureDataConverter.ConvertFeatureClass(pInFCName, null, null, pOutFCName, null, pOutFields, "", 100, 0);
}
public void ExportFeatureByFilter(IFeatureClass pInFeatureClass, string pPath, IQueryFilter pQueryFilter)
{
// 创建工作空间
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
string parentPath = pPath.Substring(0, pPath.LastIndexOf('\'));
string fileName = pPath.Substring(pPath.LastIndexOf('\') + 1, pPath.Length - pPath.LastIndexOf('\') - 1);
IWorkspaceName pWorkspaceName = pWorkspaceFactory.Create(parentPath, fileName, null, 0);
// Cast for IName
IName name = (IName)pWorkspaceName;
//Open a reference to the access workspace through the name object
IWorkspace pOutWorkspace = (IWorkspace)name.Open();

IDataset pInDataset = pInFeatureClass as IDataset;
IFeatureClassName pInFCName = pInDataset.FullName as IFeatureClassName;
IWorkspace pInWorkspace = pInDataset.Workspace;
IDataset pOutDataset = pOutWorkspace as IDataset;
IWorkspaceName pOutWorkspaceName = pOutDataset.FullName as IWorkspaceName;
IFeatureClassName pOutFCName = new FeatureClassNameClass();
IDatasetName pDatasetName = pOutFCName as IDatasetName;
pDatasetName.WorkspaceName = pOutWorkspaceName;
pDatasetName.Name = pInFeatureClass.AliasName;
IFieldChecker pFieldChecker = new FieldCheckerClass();
pFieldChecker.InputWorkspace = pInWorkspace;
pFieldChecker.ValidateWorkspace = pOutWorkspace;
IFields pFields = pInFeatureClass.Fields;
IFields pOutFields;
IEnumFieldError pEnumFieldError;
pFieldChecker.Validate(pFields, out pEnumFieldError, out pOutFields);
IFeatureDataConverter pFeatureDataConverter = new FeatureDataConverterClass();
pFeatureDataConverter.ConvertFeatureClass(pInFCName, pQueryFilter, null, pOutFCName, null, pOutFields, "", 100, 0);
}
private void btnBrowser_Click(object sender, EventArgs e)
{

if (DialogResult.OK == dlg.ShowDialog())
{
string file = dlg.FileName.Substring(0, dlg.FileName.LastIndexOf('\'));
txtPath.Text = file;
if (!System.IO.Directory.Exists(file))
{
System.IO.Directory.CreateDirectory(file);
}
}
}

private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
}

右键菜单
本部分涉及了右键菜单可以实现添加shp、lyr数据到TOC,删除图层,移除所有图层,点击查看属性等。
使用到的字段
private IActiveView pActiveView;
private IMap pMap;
private IElement pElement;
private IGraphicsContainer pGraContainer;
private IMapControl4 g_MapControl;//地图控件对象
private int j = 0;
double x=0, y=0;
private int m = 0, n = 0;
private IToolbarMenu mapMenu = null;
private ITOCControl mTOCControl;//更改图层的图例样式,changeLegend为4时更改,为0时不能
private static int deleteLayer = 0;//删除选中图层,deleteLayer为4时可删除图层,为0时不能
private static int changeLegend = 0;
//点击地图要素,显示相关属性,viewFeature为4时可以查看要素属性,为0时不能
private static int viewFeature = 0;
核心代码在TOC的mousedown事件中
private void axTOCControl1_OnMouseDown_1(object sender, ITOCControlEvents_OnMouseDownEvent e)
{
m = e.x;
n = e.y;

esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;
IBasicMap map = null;
ILayer layer = null;
object other = null;
object index = null;
int pLayerIndex = 0;
//返回单击在TOCControl中位置
axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);

if (layer != null)
{
layerCurrent = layer;
}

//单击鼠标左键
if (e.button == 1)
{

IMap pMap = axTOCControl1.ActiveView.FocusMap;

//更改图层图例
if (changeLegend == 4)
{
//判断是否单击图层或图例
if (item == esriTOCControlItem.esriTOCControlItemLegendClass || item == esriTOCControlItem.esriTOCControlItemLayer)
{
ILayer pTempLayer;
for (int i = 0; i < pMap.LayerCount; i++)
{
pTempLayer = pMap.get_Layer(i);
if (pTempLayer == layer)
{
pLayerIndex = i;
break;
}
}
//声明要更改图例的图层位置
ISymbolSelector pSymbolSelector;
pSymbolSelector = new SymbolSelectorClass();
IGeoFeatureLayer pGeoFeatureLayer;
pGeoFeatureLayer = this.axMapControl.get_Layer(pLayerIndex) as IGeoFeatureLayer;

//要更改图层图例的图例类型的类的定义
IFeatureLayer pFeatureLayer;
pFeatureLayer = this.axMapControl.get_Layer(pLayerIndex) as IFeatureLayer;
esriGeometryType pType;
try
{

IFeatureClass pFeatureClass;
pFeatureClass = pFeatureLayer.FeatureClass;
pType = pFeatureClass.ShapeType;
switch (pType)
{
//定义点的简单符号样式对话框
case esriGeometryType.esriGeometryPoint:
//MessageBox.Show("point");
ISimpleMarkerSymbol pSimpleMarkerSymbol;
pSimpleMarkerSymbol = new SimpleMarkerSymbolClass();
pSymbolSelector.AddSymbol(pSimpleMarkerSymbol as ISymbol);
break;
//定义线的简单符号样式对话框
case esriGeometryType.esriGeometryPolyline:
//MessageBox.Show("line");
ISimpleLineSymbol pSimpleLineSymbol;
pSimpleLineSymbol = new SimpleLineSymbolClass();
pSymbolSelector.AddSymbol(pSimpleLineSymbol as ISymbol);
break;
//定义面得简单符号样式对话框
case esriGeometryType.esriGeometryPolygon:
//MessageBox.Show("polygon");
ISimpleFillSymbol pSimpleFillSymbol;
pSimpleFillSymbol = new SimpleFillSymbolClass();
pSymbolSelector.AddSymbol(pSimpleFillSymbol as ISymbol);
break;
default:
MessageBox.Show("未知的图例类型!", "错误");
return;
}
}
catch
{
MessageBox.Show("不是带图例的图层!", "提示");
}


//判断图例的类型:点,线,面


//当选择对话框的图例对象时进入,再更改所在图例样式
if (pSymbolSelector.SelectSymbol(0))
{
ISymbol pSymbol;
ISimpleRenderer pRenderer;
pSymbol = pSymbolSelector.GetSymbolAt(0);
pRenderer = new SimpleRendererClass();
pRenderer.Symbol = pSymbol;

pGeoFeatureLayer.Renderer = pRenderer as IFeatureRenderer;
this.axMapControl.Refresh();
this.axTOCControl1.Update();
pGeoFeatureLayer.GetType();
}
changeLegend = 0;
}
}

//删除单个图层
else if (deleteLayer == 4)
{

//确保有项目被选择
if (item == esriTOCControlItem.esriTOCControlItemMap)
{
//ILayer l = null;
if (MessageBox.Show("确实要删除地图 " + map.Name + " 吗?", "删除地图", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
pMap.ClearLayers();
axMapControl.ActiveView.Refresh();
mTOCControl.Update();
}
}
else if (item == esriTOCControlItem.esriTOCControlItemLayer)
{
if (MessageBox.Show("确实要删除图层 " + layer.Name + " 吗?", "删除图层", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
pMap.DeleteLayer(layer);
axMapControl.ActiveView.Refresh();
//mTOCControl.Update();//mTOCControl为null异常
}
}
else
MessageBox.Show("未选择任何内容!", "错误");
deleteLayer = 0;
}
j++;
}
else if (e.button == 2)//右键弹出菜单
{
contextMenuStrip1.Show(axTOCControl1, e.x, e.y);
}
}

Mapcontrol的mousedown事件实现查询Identify


private void axMapControl_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
if (e.button == 1)
{
if (viewFeature == 4)
{
//myMapControl1.MousePointer = esriControlsMousePointer.esriPointerArrow;


IActiveView activeview = axMapControl.ActiveView;
IEnumLayer pEnumLayer;
IIdentifyDialogProps pIdentifyDialogProps;
IIdentifyDialog pIdentifyDialog = new IdentifyDialogClass();
pIdentifyDialog.Map = axMapControl.Map;
pIdentifyDialog.Display = activeview.ScreenDisplay;
pIdentifyDialog.ClearLayers();
pIdentifyDialogProps = pIdentifyDialog as IIdentifyDialogProps;
pEnumLayer = pIdentifyDialogProps.Layers;
pEnumLayer.Reset();
ILayer pLayer = pEnumLayer.Next();
while (pLayer != null)
{
pIdentifyDialog.AddLayerIdentifyPoint(pLayer, e.x, e.y);
pLayer = pEnumLayer.Next();
}

pIdentifyDialog.Show();

}
}
else if (e.button == 2)
{
}
}
移除所有图层
private void removeToolStripMenuItem_Click(object sender, EventArgs e)
{
IMap myMap = axMapControl.Map;
myMap.ClearLayers();
axTOCControl1.Update();
axMapControl.ActiveView.Refresh();
}
更改图例
private void changestyleToolStripMenuItem_Click(object sender, EventArgs e)
{
changeLegend = 4;
MessageBox.Show("请选择要更改样式的图层!", "样式更改");
}
结合TOC的mousedown事件实现。
删除图层
deleteLayer = 4;
MessageBox.Show("请选择要删除的图层!", "删除");
添加shp图层

IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
openFileDialog1.Filter = "(*.shp)|*.shp";
openFileDialog1.InitialDirectory = @"C:";
openFileDialog1.Multiselect = false;
DialogResult pDialogResult = openFileDialog1.ShowDialog();
if (pDialogResult != DialogResult.OK)
return;

string pPath = openFileDialog1.FileName;
string pFilePath = System.IO.Path.GetDirectoryName(pPath);
string pFileName = System.IO.Path.GetFileName(pPath);

IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(pFilePath, 0);
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass pFC = pFeatureWorkspace.OpenFeatureClass(pFileName);
IFeatureLayer pFlayer = new FeatureLayerClass();
pFlayer.FeatureClass = pFC;
pFlayer.Name = pFC.AliasName;
ILayer pLayer = pFlayer as ILayer;
IMap pMap = axMapControl.Map;
pMap.AddLayer(pLayer);

axMapControl.ActiveView.Refresh();
添加lyr图层
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
openFileDialog1.Filter = "(*.lyr)|*.lyr";
openFileDialog1.InitialDirectory = @"D:";
openFileDialog1.Multiselect = false;
DialogResult pDialogResult = openFileDialog1.ShowDialog();
if (pDialogResult != DialogResult.OK)
return;
string pFileName = openFileDialog1.FileName;
axMapControl.AddLayerFromFile(pFileName);
axMapControl.ActiveView.Refresh();

原文地址:https://www.cnblogs.com/duoduo0605/p/3238283.html