• 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();

  • 相关阅读:
    将时间超过万的数字转换为保留两位小数的阅读
    获取日期的最早和最晚时间
    Mybatis 关联查询分页问题的解决
    使用 java stream 获取两个集合之间的交集.差集
    使用 Stream 流对集合排序,包含对空属性的处理
    SpringBoot 多个子项目中下载 excel 报错解决方法
    单元测试捕获异常的写法
    单元测试用例需要登录信息的写法
    openwaf实战
    70个python练手项目
  • 原文地址:https://www.cnblogs.com/duoduo0605/p/3238283.html
Copyright © 2020-2023  润新知