ArcGIS Engine 开发 (一)GIS应用基本界面的搭建和控件的关联,处理TOCC控件关联失败问题,布局视图(axPageLayout)和地图(axMapcontrol)关联

关于ArcGIS Eegine + C# 的开发环境的搭建

我的为:vs2010+ArcGIS Eegine 10.2

搭建环境的教程网上很多,我这里只给出资源:
vs2010:
迅雷创建下载链接:
ed2k://|file|cn_visual_studio_2010_ultimate_x86_dvd_532347.iso|2685982720|4AE6228933DDE49D9BFA4C3467C831C2|/

也可以通过:
MSDN开发人员工具:https://msdn.itellyou.cn/ 选择
这里写图片描述

ArcGIS Eegine 10.2 iso文件:
百度网盘:
https://pan.baidu.com/s/1mhIhYYG

安装教程:
https://jingyan.baidu.com/article/fc07f98911b66912ffe5199b.html


GIS应用基本界面的搭建

这个界面的搭建比较简单,具体参考下面的文章:
https://malagis.com/arcgis-engine-10-develop-handbook-3-1.html

需要注意的2点:

1.必须拖入AxLicenseControl 许可控件,必须添加否则其他控件将无法使用;
2.并且通过代码的方式绑定许可。

ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine);

代码放在program.cs文件的Main函数中,注意必须放Application.Run(new Form1());之前。
这里写图片描述

控件的关联的方法

控件关联的方法有两种:

(一)通过属性进行关联:

例如我们通过axToolbarControl的属性添加了常规工具条后,里面有打开地图功能,必须指定显示的axMapControl

右键axToolbarControl—>属性—->Items 添加Generic Category
这里写图片描述
将Buddy设置为指定axMapControl
这里写图片描述
这样就是通过属性关联axToolbarControlaxMapControl控件。


(二)通过代码手动关联:

如果在界面里添加了splitcontainer 之后TOCControlmapcontrol控件的通过设置的关联无效,
这个时候就得手动设置Buddy
在From1的load事件中添加

axTOCControl1.SetBuddyControl(axMapControl1);

布局视图(axPageLayout)和地图(axMapcontrol)关联

        private void copyToPageLayout()
        {

            //IObjectCopy接口提供Copy方法用于地图的复制
            IObjectCopy objectCopy = new ObjectCopyClass();
            object copyFromMap = axMapControl1.Map;
            object copyMap = objectCopy.Copy(copyFromMap);
            object copyToMap = axPageLayoutControl1.ActiveView.FocusMap;
            //Overwrite方法用于地图写入PageLayoutControl控件的视图中
            objectCopy.Overwrite(copyMap, ref copyToMap);
        }

        private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e)
        {
            copyToPageLayout();
        }

        private void axMapControl1_OnAfterScreenDraw(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnAfterScreenDrawEvent e)
        {
            IActiveView activeView = (IActiveView)axPageLayoutControl1.ActiveView.FocusMap;
            IDisplayTransformation displayTransformation = activeView.ScreenDisplay.DisplayTransformation;
            //根据MapControl的视图范围,确定PageLayoutControl的视图范围
            displayTransformation.VisibleBounds = axMapControl1.Extent;
            axPageLayoutControl1.ActiveView.Refresh();
            copyToPageLayout();
        }

代码需要添加引用
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Carto;

其中有个地方容易出无法嵌入互操作类型错误:
IObjectCopy objectCopy = new ObjectCopyClass();

这里写图片描述
当报无法嵌入互操作类型错误的时候,其实程序是可以正常执行的,解决方法
将其对应的dll组件的属性中嵌入互操作类型由True改为false。
这里写图片描述
这里对应的组件为ESRI.ArcGIS.System

还可以通过通过实例ObjectCopy接口对IObjectCopy赋值,就可以不用调dll的属性

IObjectCopy objectCopy = new ObjectCopy();


可以实例接口吗?

下篇博客对出现这个问题的原因和一些衍生的问题进行发析,敬请关注!

猜你喜欢

转载自blog.csdn.net/define_LIN/article/details/82715338