基于C#的ArcEngine实现点击地图要素展示个性化介绍窗口

一、简介

这篇博文实现的功能是,在地图上选择一个要素,然后弹出它对应的信息窗口。比如我的实习主题是武汉大学内的历史建筑,我可以选择宋卿体育馆,像这样。
基于C#的ArcEngine实现点击地图要素展示个性化介绍窗口
然后点击“建筑介绍”,接着软件就会弹出像下面这样的窗口。
基于C#的ArcEngine实现点击地图要素展示个性化介绍窗口

二、实现介绍

2.1 要素的选择

        private void 要素选择ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.axMapControl1.CurrentTool = null;
            //Tool的定义和初始化
            ControlsSelectFeaturesToolClass pTool = new ESRI.ArcGIS.Controls.ControlsSelectFeaturesToolClass();
            //Tool通过ICommand与MapControl的关联
            pTool.OnCreate(this.axMapControl1.Object);
            //MapControl的当前工具设定为tool 
            this.axMapControl1.CurrentTool = pTool as ITool; 
        }

但是实现上面这个方法之后,你会惊讶地发现自己就仅仅是在地图上勾了一个要素而已,就是高亮了个好看!做到这里你可以给房地产开发商高亮标记告诉他们你要投资这里,这里是哪里不知道,总之一定要投。

2.2 已选要素的获取

你现在有了一块地,可是不知道它叫什么名字,没有控制权,除了钱和拿下它的决心你一无所有,OK,下面我来介绍怎么获取它的信息。

//获得已选要素的feature对象(注意,是可以多选的,已选要素全部会存在pEnumFeature里面,可以一直Next()直到没有下一位)

  IMap map = axMapControl1.Map;
            ISelection selection = map.FeatureSelection;
            IEnumFeatureSetup iEnumFeatureSetup = (IEnumFeatureSetup)selection;
            iEnumFeatureSetup.AllFields = true;
            IEnumFeature pEnumFeature = (IEnumFeature)iEnumFeatureSetup;
            pEnumFeature.Reset();
            IFeature pFeature = pEnumFeature.Next();
            
            //如果你拿到的第一个要素很奇怪,也许会需要下面这条
            //pFeature = pEnumFeature.Next(); 

现在拿到了这个pFeature对象,你就拿到了房产证,可以查看feature的属性了。

2.3 要素和相应介绍信息的绑定

动态加载介绍窗口的关键是需要一个ID(标识符)把你预先存储的介绍信息(包括图片)和选择的地图要素绑定起来,我用的建筑的名字。

//获取你需要的字段的值,2是索引号,请根据自己的数据修改
String name = pFeature.get_Value(2).ToString();

然后你需要拿着feature和name去实例化一个介绍窗口。

2.4 介绍窗口类

新建一个Windows窗体类FormIntro;
自己根据显示需求画好Form的模板。
我的是这样:
基于C#的ArcEngine实现点击地图要素展示个性化介绍窗口

添加两个成员变量和一个字典变量(把name作为键,介绍的文本作为值,实现文本调取)

//窗体类的变量
public IFeature pfeature;
public string bname;
Dictionary<string, string> dict = new Dictionary<string, string>();

下面是调取相关信息显示到窗口上的方法:

        public void showDetails(string bname)
        {
            string intro = getInfo(bname);
            string pic = @"自己的路径"+bname+".jpg";
            //设置文本信息
            label1.Text= bname;
            label2.Text = arrlist[1].ToString();
            //设置图片适应pictureBox的大小
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            //设置图片
            pictureBox1.Image = Image.FromFile(pic);

        }
        
        //这个函数很简单也可以不写。但是当你需要调取的字段有很多的话,就需要考虑看上去比较聪明的写法^^
	    public string getInfo(String bname)
        {
            string intro=dict[bname];
            return intro;
        }

最后,只需要在点击查询按钮之后的响应代码里调用这个showDetails方法来设置窗口信息,并且让窗口Show()就好了;

		    FormIntro intro = new FormIntro();
            while(pFeature != null)
            {                             
                string name = null;
                try
                {
                    name = pFeature.get_Value(2).ToString();
                }
                catch (NullReferenceException)
                {
                    MessageBox.Show("didn't get buildingname");   
                }
                finally
                {
                }
                pFeature = pEnumFeature.Next(); 
                intro.showDetails(name);
                intro.Show();                              
            }
        }

至此,你就可以给网友们在线展示一下你的校园了。(雾)
基于C#的ArcEngine实现点击地图要素展示个性化介绍窗口
基于C#的ArcEngine实现点击地图要素展示个性化介绍窗口

三、参考资料和slogan

这个功能的实现也获得了不少互联网的帮助,你也许需要一些扩展知识:

[1] RTFM (*F=friendly)
[2] 模仿ArcEngine的 Identify功能展示要素的属性信息
[3] AE要素选择(点选和拉框选择)
[4]珞珈史迹知多少:武大“国保”名单内外的历史建筑

基于C#的ArcEngine实现点击地图要素展示个性化介绍窗口

上一篇:CF915E Physical Education Lessons 珂朵莉树


下一篇:Node js Intro