AE——AE模板

ArcGIS中已有Application模板,我们就是模仿这个模板,自己制作一个漂亮的模板

目录

一、创建Windows Application(Engine)

二、添加控件

三、添加代码

提高部分

右击菜单

状态栏

数据视图与布局视图


一、创建Windows Application(Engine)

二、添加控件

加MenuStrip(菜单)和StatusStrip(状态栏)控件,并且两者的Dock属性分别设置为Top,Bottom

添加ToolStripContainer控件

作用:ToolStripContainer的大小随着窗体的大小发生变化


添加ToolbarControl(工具条)控件

先添加一个SplitContainer控件

再添加一个SplitContainer控件,原来panel1和panel1时竖立着,要设置Orientation属性

SplitContainer控件分好的一个个面板中,添加TOCControl和MapControl控件,并设置Dock属性

三、添加代码

在menuStrip中添加【加载shp】并双击,添加如下代码:

private void 加载shpToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog OpenFDLG = new OpenFileDialog();
            OpenFDLG.Title = "选择需要加载的地理数据文件";
            OpenFDLG.Filter = "Shapefile文件(*.shp)|*.shp";
            OpenFDLG.ShowDialog();
            string strFileName = OpenFDLG.FileName;

            //如果用户没有进行文件选择,则返回
            if (strFileName == string.Empty)
                return;

            //如果用户选择了Shapefile文件
            string pathName = System.IO.Path.GetDirectoryName(strFileName);
            string fileName = System.IO.Path.GetFileNameWithoutExtension(strFileName);

            //将Shapefile文件加载到axMapControl1中,即主窗体
            axMapControl1.AddShapeFile(pathName, fileName);

            //首先清空axMapControl2(即鸟瞰窗体)中的数据,并加载相同的Shapefile数据
            axMapControl2.ClearLayers();
            axMapControl2.AddShapeFile(pathName, fileName);

            //设置axMapControl2(即鸟瞰窗体)的显示范围为全图
            axMapControl2.Extent = axMapControl2.FullExtent;

        }

在menuStrip中添加【保存为mxd】并双击,添加如下代码:

 private void 保存mxdToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                string sMxdFileName = axMapControl1.DocumentFilename;
                IMapDocument pMapDocument = new MapDocument();
                if (sMxdFileName != null && axMapControl1.CheckMxFile(sMxdFileName))
                {
                    if (pMapDocument.get_IsReadOnly(sMxdFileName))
                    {
                        MessageBox.Show("本地图文档是只读的,不能保存!");
                        pMapDocument.Close();
                        return;
                    }
                }
                else
                {
                    SaveFileDialog pSaveFileDialog = new SaveFileDialog();
                    pSaveFileDialog.Title = "请选择保存路径";
                    pSaveFileDialog.OverwritePrompt = true;
                    pSaveFileDialog.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
                    pSaveFileDialog.RestoreDirectory = true;
                    if (pSaveFileDialog.ShowDialog() == DialogResult.OK)
                    {
                        sMxdFileName = pSaveFileDialog.FileName;
                    }
                    else
                    {
                        return;
                    }
                }

                pMapDocument.New(sMxdFileName);
                pMapDocument.ReplaceContents(axMapControl1.Map as IMxdContents);
                pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
                pMapDocument.Close();
                MessageBox.Show("保存地图文档成功!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

TOCControl建立与MapControl1的关联:

1、可以在TOCControl属性中设置

2、也可以在窗口加载事件中添加代码,如下

 private void Form1_Load(object sender, EventArgs e)
        {
            axTOCControl1.SetBuddyControl(axMapControl1);
        }

提高部分

右击菜单

对于TOCControl控件的学习比较重要的就是右键菜单了,例如右键菜单来实现显示属性表等功能。此次通过“显示图层名称”这样一个小功能来说一下右键菜单的实现,更多功能以后再完善。

private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
        {
            ILayer pGlobeLayer = null;
            if (axMapControl1.LayerCount > 0)
            {
                esriTOCControlItem pItem = new esriTOCControlItem();
                //pGlobeLayer为全局变量
                //pGlobeLayer = new FeatureLayer();
                IBasicMap pBasicMap = new Map() as IBasicMap;
                object pOther = new object();
                object pIndex = new object();
                //获取点击的位置
                axTOCControl1.HitTest(e.x, e.y, ref pItem, ref pBasicMap, ref pGlobeLayer, ref pOther, ref pIndex);
                //点击的是Layer的话,则弹出上下文菜单
                if (e.button == 2 && pItem == esriTOCControlItem.esriTOCControlItemLayer)
                {
                    contextMenuStrip1.Show(axTOCControl1, e.x, e.y);
                }
            }
        }

        private void 啦啦啦ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("你想干嘛!!!");
        }

数据视图与布局视图

在ArcGIS中,在数据视图中进行地图数据的编辑,在布局视图中制图。

AE模板中,MapControl起到数据视图的作用,PageLayoutControl则为布局视图

但是要添加PageLayoutControl控件,首先添加一个TabControl控件,然后更改TabPages属性信息,tabPage1改为“数据视图”,tabPage2改为“布局视图”,然后在数据视图栏添加MapControl控件,在布局视图栏添加PageLayoutControl控件。

tabControl控件属性中Alignment可以设置选项卡显示在哪里。

添加一下代码,实现两个视图之间的关联。

 public void copyToPageLayout()
        {
            IObjectCopy objectCopy = new ObjectCopy();//对象拷贝接口
            object copyFromMap = axMapControl1.Map;//地图对象
            object copyMap = objectCopy.Copy(copyFromMap);//将axMapControl1的地图对象拷贝
            object copyToMap = axPageLayoutControl1.ActiveView.FocusMap;//axPageLayoutControl1活动视图中的地图
            objectCopy.Overwrite(copyMap, ref copyToMap);//将axMapControl1地图对象覆盖axPageLayout1当前地图
        }
        private void axMapControl1_OnMapReplaced_1(object sender, IMapControlEvents2_OnMapReplacedEvent e)
        {

            copyToPageLayout();


        }
        private void axMapControl1_OnAfterScreenDraw(object sender, IMapControlEvents2_OnAfterScreenDrawEvent e)
        {
            
                IActiveView activeView = (IActiveView)axPageLayoutControl1.ActiveView.FocusMap;//axPageLayoutControl1的活动视图的地图
                IDisplayTransformation displayTransformation = activeView.ScreenDisplay.DisplayTransformation;//活动视图的屏幕显示的显示信息
                displayTransformation.VisibleBounds = axMapControl1.Extent;//将axMapControl1的范围赋值给axPageLayoutControl1的范围
                axPageLayoutControl1.ActiveView.Refresh();//刷新axPageLayoutControl1的活动视图
                copyToPageLayout();//将axMapControl1的地图拷贝到axPageLayoutControl1中
        }

转载:https://blog.csdn.net/qq_39972875/article/details/85306706

状态栏

其实状态栏和菜单栏是基本上一致的。

以当前坐标威力:

设置其属性,Name=CoordinateLabel, text=当前坐标

添加一下代码:

public string sMapUnits; 
private void axMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
        {
          
            CoordinateLabel.Text = "当前坐标 X=" + e.mapX.ToString() + " Y = " + e.mapY.ToString() + " " + sMapUnits;
        }

        private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
        {
            copyToPageLayout();
            ESRI.ArcGIS.esriSystem.esriUnits mapUnits = axMapControl1.MapUnits;

            switch (mapUnits)
            {

                case ESRI.ArcGIS.esriSystem.esriUnits.esriCentimeters:

                    sMapUnits = "Centimeters";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriDecimalDegrees:

                    sMapUnits = "Decimal Degrees";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriDecimeters:

                    sMapUnits = "Decimeters";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriFeet:

                    sMapUnits = "Feet";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriInches:

                    sMapUnits = "Inches";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriKilometers:

                    sMapUnits = "Kilometers";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriMeters:

                    sMapUnits = "Meters";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriMiles:

                    sMapUnits = "Miles";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriMillimeters:

                    sMapUnits = "Millimeters";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriNauticalMiles:

                    sMapUnits = "NauticalMiles";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriPoints:

                    sMapUnits = "Points";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriUnknownUnits:

                    sMapUnits = "Unknown";

                    break;

                case ESRI.ArcGIS.esriSystem.esriUnits.esriYards:

                    sMapUnits = "Yards";

                    break;
            }
        }

猜你喜欢

转载自blog.csdn.net/qq_41664159/article/details/100995104
AE