基于AE的GIS二次开发作业文档

来源:互联网 发布:八一电视软件 编辑:程序博客网 时间:2024/05/22 01:44

一、系统概述

1、系统简介

系统是在VS2008中利用ArcGIS Engine10.1进行的二次开发。系统主要有菜单栏、内容列表、鹰眼视图、操作面板、地图视图、布局视图等六大功能模块区。

2、功能简介

系统主要功能包括:

基础操作:新建文档、打开文档、保存文档、另存为、添加XY数据、影像导入、退出系统;

地图制图输出:添加文字、添加图例、添加数字比例尺、添加文字比例尺、添加指北针、输出JPG、输出BMP、输出PNG、输出PDF;

系统设置:皮肤选择、内容显示;

帮助:帮助文档、关于、在线支持、联系我们;

地图操作:选择、放大、缩小、平移、全幅显示;

布局操作:选择、、放大、缩小、平移、全幅显示、固定比例尺放大、固定比例尺缩小、前一视图、后一视图、1:1显示。

3、系统界面介绍

系统使用DevExpress第三方控件进行系统界面搭建。DevExpress开发的控件有很强的实力,不仅功能丰富,应用简便,而且界面华丽,更可方便定制。对于编程人员来说是个不错的选择。它的菜单栏控件更具代表,完全可以替代开发环境提供的基本控件,而让您编写的程序或软件更显专业化。它还提供完善的帮助系统,资料详尽,可以快速入手。有些高级控件更是零代码的,非常易于使用。


图1:系统主界面


图2:系统皮肤选择

二、系统环境及功能亮点

1、系统环境

开发平台

ArcGIS Engine10.1

开发工具

VS2008、IDL、DevExpress

开发语言

C#、IDL8.0

运行环境

Windows 7

数据库

其他(可扩充)

2、功能亮点

1)、 系统基础功能较为完善。基础文档操作、地图布局设置功能丰富、地图输出格式多样;

2)、 实现图层添加、移除以及属性表查看等功能;

3)、  通过调用GP工具实现“添加XY数据”功能;

4)、 通过调用IDL程序实现遥感影像波段合成功能;


图3:图层属性查看

图4:属性查看代码实现

        //属性查看        private void FormAttribute_Load(object sender, EventArgs e)        {            try            {                //pLayer:存储当前查询图层名称                pFeatureLayer = pLayer as IFeatureLayer;                pFeatureClass = pFeatureLayer.FeatureClass;                pLayerFields = pFeatureLayer as ILayerFields;                DataSet ds = new DataSet("dsTest");                DataTable dt = new DataTable(pFeatureLayer.Name);                DataColumn dc = null;                for (int i = 0; i < pLayerFields.FieldCount; i++)                {                    dc = new DataColumn(pLayerFields.get_Field(i).Name);                    dt.Columns.Add(dc);                    dc = null;                }                IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);                IFeature pFeature = pFeatureCursor.NextFeature();                while (pFeature != null)                {                    DataRow dr = dt.NewRow();                    for (int j = 0; j < pLayerFields.FieldCount; j++)                    {                        if (pLayerFields.FindField(pFeatureClass.ShapeFieldName) == j)                        {                            dr[j] = pFeatureClass.ShapeType.ToString();                        }                        else                        {                            dr[j] = pFeature.get_Value(j);                        }                    }                    dt.Rows.Add(dr);                    pFeature = pFeatureCursor.NextFeature();                }                gridControl1.DataSource = dt;                this.Text = pLayer.Name + "属性表";            }            catch (Exception ex)            {                MessageBox.Show("属性表读取失败:" + ex.Message.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);                this.Dispose();//释放资源            }        }

图5:添加XY数据


图6:代码实现

        //确定,创建点图层        private void btOk_Click(object sender, EventArgs e)        {            if (textEditExcel.Text == "" || ComboBoxEditX.Text == "" || ComboBoxEditY.Text == "" || textEditName.Text == "" || txyPath == null)            {                MessageBox.Show("输入有误,请重新填写!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);            }            else            {                try                {                    this.progressBar.EditValue = 5;                    //bgWorker.RunWorkerAsync();                    Geoprocessor GP = new Geoprocessor();                    //添加XY事件                    MakeXYEventLayer MxyLayer = new MakeXYEventLayer();                    //直接获取Excel表格中第一个表名                    MxyLayer.table = textEditExcel.Text +"\\"+ ReadExcel.GetExcelFirstTableName(textEditExcel.Text);                    this.progressBar.EditValue = 15;                    //获取经度字段                    MxyLayer.in_x_field = ComboBoxEditX.Text;                    //获取纬度字段                    MxyLayer.in_y_field = ComboBoxEditY.Text;                    this.progressBar.EditValue = 25;                    MxyLayer.out_layer = "result";                    GP.Execute(MxyLayer, null);                    this.progressBar.EditValue = 35;                    //复制要素                    ESRI.ArcGIS.DataManagementTools.CopyFeatures cf = new ESRI.ArcGIS.DataManagementTools.CopyFeatures();                    cf.in_features = "result";                    this.progressBar.EditValue = 45;                    cf.out_feature_class = txyPath;                    GP.Execute(cf, null);                    this.progressBar.EditValue = 55;                                        //添加要素图层到Map                    IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass();                    IFeatureWorkspace pws = workspaceFactory.OpenFromFile(gdbPath, 0) as IFeatureWorkspace;                    this.progressBar.EditValue = 65;                    IFeatureLayer pFeatureLater = new FeatureLayerClass();                    pFeatureLater.FeatureClass = pws.OpenFeatureClass("XY点图层_" + textEditName.Text);                    pFeatureLater.Name = "XY点图层_" + textEditName.Text;                    this.progressBar.EditValue = 75;                    axMapControlxy.Map.AddLayer(pFeatureLater as ILayer);                    axMapControlxy.Extent = axMapControlxy.FullExtent;                    this.progressBar.EditValue = 85;                    MessageBox.Show("图层创建成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);                    this.Dispose();                    this.Close();                }                catch(Exception ex)                {                    MessageBox.Show("图层创建失败!"+ex.Message.ToString(),"提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);                }            }        }
图7:XY示例数据

图8:点图层创建结果


图9:波段合成


图10:结果显示

//波段合成        private void btOk_Click(object sender, EventArgs e)        {            if (lvFiles.Items.Count < 2 || textImageName.Text == "" || ImgsavePath == null)            {                if (lvFiles.Items.Count < 2)                {                    MessageBox.Show("波段选择有误,请重新选择!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);                    lvFiles.Items.Clear();                }                else                {                    MessageBox.Show("输入有误,请重新填写!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);                }            }            else            {                try                {                    //调用LayerStacking方法实现波段合成                    this.LayerStacking(ImgsavePath);                    //调用RasterToGDB方法将合成影像导入地理数据库中                    RasterToGDB(ImgsavePath);                    //调用DeleteFile方法实现删除合成影像                    DeleteFile("波段合成_" + textImageName.Text.Trim() + ".img");                    DeleteFile("波段合成_" + textImageName.Text.Trim() + ".hdr");                }                catch (Exception ex)                 {                    MessageBox.Show(ex.Message.ToString());                }                DialogResult re = MessageBox.Show("操作成功!是否添加显示?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);                if (re == DialogResult.OK)                {                    //调用添加显示功能                    AddLayerToMap("波段合成_" + textImageName.Text, gdbPath, axMapControlimg);                    this.Close();                    this.Dispose();                }                else                {                    this.Close();                    this.Dispose();                }            }        }

注:一下为C#封装的方法,主要实现影栅格数据入库、Temp数据删除、栅格数据添加显示等功能操作!


/// <summary>        /// 调用GP工具将栅格数据导入地理数据库中        /// </summary>        /// <param name="imagepath">生成的栅格数据路径</param>        public static void RasterToGDB(string imagepath)         {            Geoprocessor GP = new Geoprocessor();            ESRI.ArcGIS.ConversionTools.RasterToGeodatabase rasterTogeodatabase = new ESRI.ArcGIS.ConversionTools.RasterToGeodatabase();            rasterTogeodatabase.Input_Rasters = imagepath;            rasterTogeodatabase.Output_Geodatabase = FormMain.GDB;            GP.Execute(rasterTogeodatabase, null);        }        /// <summary>        /// 删除文件        /// </summary>        /// <param name="filename">文件名</param>        public static void DeleteFile(string filename)         {            //判断文件是否存在            if (File.Exists(FormMain.ImagePath +"\\"+ filename))             {                //如果存在则删除                File.Delete(FormMain.ImagePath +"\\"+ filename);            }        }        /// <summary>        /// 将产生的栅格数据添加到map中显示        /// </summary>        /// <param name="filename">栅格数据名称</param>        ///<param name="gdbpath">数据存放路径</param>        /// <param name="axmapcontrol">Axmapcontrol</param>        public static void AddLayerToMap(string filename,string gdbpath, AxMapControl axmapcontrol)         {            IWorkspaceFactory workspacefactory = new FileGDBWorkspaceFactoryClass();            IRasterWorkspaceEx rasterworkspace = workspacefactory.OpenFromFile(gdbpath, 0) as IRasterWorkspaceEx;            IRasterDataset rasterdataset = rasterworkspace.OpenRasterDataset(filename);            IRasterLayer rasterlayer = new RasterLayerClass();            rasterlayer.CreateFromDataset(rasterdataset);            axmapcontrol.Map.AddLayer(rasterlayer as ILayer);            axmapcontrol.Extent = axmapcontrol.FullExtent;        }


图11:波段合成IDL代码实现

pro ENVI_LAYER_STACKING_DOIT_Record,_extra = extraendpro LayerStacking,paths,out_path compile_opt idl2   ;严格编译规则  compile_opt idl2  ;载入envi的sav文件  envi,/restore_base_save_files  ;初始化envi  envi_batch_init,log_file = 'batch.LOG'    fids = lonarr(n_elements(paths))  nbs = lonarr(n_elements(paths))  nses = lonarr(n_elements(paths))  nls = lonarr(n_elements(paths))  dimses = lonarr(5,n_elements(paths))    Sum_nb = 0l    for i = 0,n_elements(paths)-1 do begin    envi_open_file,paths[i],r_fid =r_fid    fids[i] = r_fid     envi_file_query,fids[i],ns=ns, nl=nl, nb=nb,dims = dims      nses[i]=ns    nls[i]=nl    nbs[i]=nb    dimses[*,i]=dims    Sum_nb = Sum_nb + nbs[i]       endfor       pos = lonarr(Sum_nb)     out_proj = envi_get_projection(fid=fids[0],pixel_size=out_ps)  ENVI_DOIT,'ENVI_LAYER_STACKING_DOIT',dims=dimses,FID=fids,pos=pos,OUT_NAME=out_path,$    out_dt=4,interp=2, out_ps=out_ps, $     out_proj=out_proj, r_fid=r_fid         end




图12:指北针选择器


图13:添加文字及检测输入是否规范


图14:系统托盘


图15:系统关于

三、团队分工

本系统所有内容均为本人独立创作(如有雷同,存属意外)。

四、心得体会

此处略去一万字。。。大笑

系统演示视频地址:http://v.youku.com/v_show/id_XNTY4MDIyODY4.html

友情链接(MapGIS文档):http://blog.csdn.net/zxcvbnm32123/article/details/9076053


五、相关书籍推荐

1、IDL程序设计--数据可视化与ENVI二次开发(附光盘) 董彦卿

简介:《IDL程序设计--数据可视化与ENVI二次开发(附光盘)》编著者董彦卿。数据可视化是进行信息提取的有效手段之一。《IDL程序设计:数据可视化与ENVI二次开发》就是一本专门针对交互式数据语言——IDL的可视化应用的编程指南。书中由浅入深地介绍了IDL程序设计的语法基础,着重对比了直接图形法、对象图像法和快速可视化三种数据可视化方法,描述了它们的使用方法和特点,最后介绍了IDL与其他程序语言如C++、C#、Java等混合编程以及ENVI功能扩展与二次开发;同时,列举了丰富的示例代码和注释说明,并对IDL中的各种函数进行了归纳。随书附赠光盘中含有书中所有示例代码和实验数据,方便读者实践。本书内容系统全面,可作为遥感、地理信息系统、计算机、图形图像处理及相关专业本科生和研究生的教学用书和实验教程,也可作为计算机软件开发人员的工具书。

查看详情:点击打开链接


2、基于C#语言的ArcGIS Engine开发基础与技巧


简介:本书将GIS理论知识和实际应用相结合,在Visual Studio 2010.NET开发环境下,以C#作为开发语言,结合大量实例,介绍了利用ArcGIS Engine 10.0进行GIS二次开发的方法、过程和技巧。本书内容主要包括ArcGIS Engine接口的概念,利用ArcGIS Engine构建GIS基本框架的方法,在ArcGIS Engine环境下空间数据访问与查询、空间数据投影转换、矢栅数据结构转换、符号化显示与符号库定制、空间数据编辑、外部属性数据操作与专题图制作、地图整饰与打印输出、空间数据裁剪、地形分析、插值方法、叠加分析、地图配准,以及空间数据图饰符号标注等功能的实现方法。每个章节都对应一个具体的GIS功能,先介绍基本概念,然后讲述ArcGIS Engine 10.0实现这些功能所提供的方法,并给出了具体的实现过程。

查看详情:点击打开链接


3、.NET之美(.NET关键技术深入解析) 张子阳


简介:张子阳等编著的《.NET之美(.NET关键技术深入解析)》是.NET程序员进阶修炼的必读之作,由拥有多年开发经验的资深。NET技术专家对C#和.NET中实用的、关键的和难以理解的知识点进行了深入解析,旨在帮助读者在尽可能短的时间内以尽可能低的学习成本去掌握那些最应该被掌握的知识。书中的每个知识点都辅之以精心设计的案例,易于理解,实践性强。
     《.NET之美(.NET关键技术深入解析)》共17章,分为两个部分:第一部分(1~5章)主要讲解了C#语言中的一些关键知识点,如类型、泛型、委托、事件、对象、LINQ等;第二部分(6~17章)则对.NET中的关键知识点进行了深入剖析,如程序集、流和序列化、加密与解密、网络编程、.NETRemoting、在.NET中操作XML、.NET应用程序配置、基于角色的安全性、反射、多线程、对象生存期与垃圾回收等。

查看详情:点击打开链接

点击打开链接







原创粉丝点击