GIS番外 | 基于C#的简单GIS二次开发(及文章内容探索)

文摘   2024-07-07 00:01   山西  

LXX

读完需要

2
分钟

速读仅需 1 分钟

前言:

今天偶然翻到了一些之前读书时关于 GIS 二次开发的小作业,就把这个分享一下,技术不好,还望同学们多多指教。

同时,最近工作比较忙,也没办法像之前那样思索最近要发什么内容,做更好的准备,前几期的水深反演也一直迟迟未推进;但时间还是可以挤出来的,在此也向同学们征求一些文章内容意见,大家想看什么内容我就专心准备这一方面,这样就可以省去好多思索的时间啦(文末有投票,期待同学们的意见呀)

1

   

实现内容

实现地图数据的读取、基本操作、地图制图、数据编辑、数据查询、空间分析等功能,形成相对完整的小型 GIS 数据处理功能的小软件。具体如下:

(1)能够读取点、线、面矢量数据和栅格数据,并能以工程文件保存当前的图层设置;

(2)实现地图的放大、缩小、漫游、显示全图等基本地图操作;

(3)实现应用某一属性字段制作专题地图,并能显示图例;

(4)实现点、线、面数据的编辑功能,并能保存结果;

(5)实现地图数据的属性数据查询功能;

(6)实现面状地物的交、并、裁剪等叠加分析功能。


2

   

实现功能及实现方法

主界面设计如下:

主要实现GIS软件的基本功能:打开保存文件,对地图要素进行编辑操作,空间属性查询,缓冲区分析,地图输出等文件项目。

打开文件主要代码如下:(以打开 mxd 文件为例)

try            {                OpenFileDialog pOpenFileDialog = new OpenFileDialog();                pOpenFileDialog.CheckFileExists = true;                pOpenFileDialog.Title = "打开地图文档";                pOpenFileDialog.Filter = "ArcMap文档(*.mxd)|*.mxd;|ArcMap模板(*.mxt)|*.mxt|发布地图文件(*.pmf)|*.pmf|所有地图格式(*.mxd;*.mxt;*.pmf)|*.mxd;*.mxt;*.pmf";                pOpenFileDialog.Multiselect = false;   //不允许多个文件同时选择                pOpenFileDialog.RestoreDirectory = true;   //存储打开的文件路径                if (pOpenFileDialog.ShowDialog() == DialogResult.OK)                {                    string pFileName = pOpenFileDialog.FileName;                    if (pFileName == "")                    {                        return;                    }                    if (axMapControl1.CheckMxFile(pFileName)) //检查地图文档有效性                    {
axMapControl1.LoadMxFile(pFileName); } else { MessageBox.Show(pFileName + "是无效的地图文档!", "信息提示"); return; } } } catch (Exception ex) { MessageBox.Show("打开地图文档失败" + ex.Message);
} }

保存文件主要代码:

 private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)        {            try            {
string sMxdFileName = axMapControl1.DocumentFilename; IMapDocument pMapDocument = new MapDocumentClass(); 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); }

编辑项目:

分为开始编辑,结束编辑和保存编辑;以开始编辑为例,其主要代码如下:

try            {                if (plstLayers == null || plstLayers.Count == 0)                {                    MessageBox.Show("请加载编辑图层!", "提示",                        MessageBoxButtons.OK, MessageBoxIcon.Information);                    return;                }
pMap.ClearSelection(); pActiveView.Refresh(); InitComboBox(plstLayers); ChangeButtonState(true); //如果编辑已经开始,则直接退出 if (pEngineEditor.EditState != esriEngineEditState.esriEngineStateNotEditing) return; if (pCurrentLyr == null) return; //获取当前编辑图层工作空间 IDataset pDataSet = pCurrentLyr.FeatureClass as IDataset; IWorkspace pWs = pDataSet.Workspace; //设置编辑模式,如果是ArcSDE采用版本模式 if (pWs.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { pEngineEditor.EditSessionMode = esriEngineEditSessionMode.esriEngineEditSessionModeVersioned; } else { pEngineEditor.EditSessionMode = esriEngineEditSessionMode.esriEngineEditSessionModeNonVersioned; } //设置编辑任务 pEngineEditTask = pEngineEditor.GetTaskByUniqueName("ControlToolsEditing_CreateNewFeatureTask"); pEngineEditor.CurrentTask = pEngineEditTask;// 设置编辑任务 pEngineEditor.EnableUndoRedo(true); //是否可以进行撤销、恢复操作 pEngineEditor.StartEditing(pWs, pMap); //开始编辑操作 } catch (Exception ex) { }结束编辑: try { ICommand m_stopEditCom = new StopEditCommandClass(); m_stopEditCom.OnCreate(axMapControl1.Object); m_stopEditCom.OnClick(); ChangeButtonState(false); axMapControl1.CurrentTool = null; axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault; } catch (Exception ex) { }保存编辑: try { ICommand m_saveEditCom = new SaveEditCommandClass(); m_saveEditCom.OnCreate(axMapControl1.Object); m_saveEditCom.OnClick(); } catch (Exception ex) { }

书签项目:

分为创建书签和管理书签;以创建书签为例,主要代码如下:

FormBookmark frmBookMark = new FormBookmark();            frmBookMark.ShowDialog();            string pName = string.Empty;            int check = frmBookMark.Check;
if (check == 1) { pName = frmBookMark.Bookmark; } if (string.IsNullOrEmpty(pName)) return;
//书签进行重名判断 IMapBookmarks mapBookmarks = axMapControl1.Map as IMapBookmarks; IEnumSpatialBookmark enumSpatialBookmarks = mapBookmarks.Bookmarks; enumSpatialBookmarks.Reset(); ISpatialBookmark pSpatialBookmark;
while ((pSpatialBookmark = enumSpatialBookmarks.Next()) != null) { if (pName == pSpatialBookmark.Name) { DialogResult dr = MessageBox.Show("此书签名已存在!是否替换?", "提示", MessageBoxButtons.YesNoCancel); if (dr == DialogResult.Yes) { mapBookmarks.RemoveBookmark(pSpatialBookmark); } else if (dr == DialogResult.No) { frmBookMark.ShowDialog(); } else { return; } } }
//获取当前地图的对象 IActiveView pActiveView = axMapControl1.Map as IActiveView; //创建一个新的书签并设置其位置范围为当前视图的范围 IAOIBookmark pBookmark = new AOIBookmarkClass(); pBookmark.Location = pActiveView.Extent; //获得书签名 pBookmark.Name = pName; //通过IMapBookmarks接口访问当前地图书签集,添加书签到地图的书签集中 IMapBookmarks pMapBookmarks = axMapControl1.Map as IMapBookmarks; pMapBookmarks.AddBookmark(pBookmark);

空间查询界面及代码如下:

try            {                //清空目标图层列表                checkedListBoxTargetLayers.Items.Clear();
string layerName; //设置临时变量存储图层名称
//对Map中的每个图层进行判断并添加图层名称 for (int i = 0; i < currentMap.LayerCount; i++) { //如果该图层为图层组类型,则分别对所包含的每个图层进行操作 if (currentMap.get_Layer(i) is GroupLayer) { //使用ICompositeLayer接口进行遍历操作 ICompositeLayer compositeLayer = currentMap.get_Layer(i) as ICompositeLayer; for (int j = 0; j < compositeLayer.Count; j++) { //将图层的名称添加到checkedListBoxTargetLayers控件和comboBoxMethods控件中 layerName = compositeLayer.get_Layer(j).Name; checkedListBoxTargetLayers.Items.Add(layerName); comboBoxSourceLayer.Items.Add(layerName); } } //如果图层不是图层组类型,则直接添加名称 else { layerName = currentMap.get_Layer(i).Name; checkedListBoxTargetLayers.Items.Add(layerName); comboBoxSourceLayer.Items.Add(layerName); } }
//将comboBoxSourceLayer控件的默认选项设置为第一个图层的名称 comboBoxSourceLayer.SelectedIndex = 0; //将comboBoxMethods控件的默认选项设置为第一种空间选择方法 comboBoxMethods.SelectedIndex = 0; } catch { }

属性查询界面及代码如下:

try            {                //使用FeatureClass对象的IDataset接口来获取dataset和workspace的信息                IDataset dataset = (IDataset)currentFeatureLayer.FeatureClass;                //使用IQueryDef接口的对象来定义和查询属性信息。通过IWorkspace接口的CreateQueryDef()方法创建该对象。                IQueryDef queryDef = ((IFeatureWorkspace)dataset.Workspace).CreateQueryDef();                //设置所需查询的表格名称为dataset的名称                queryDef.Tables = dataset.Name;                //设置查询的字段名称。可以联合使用SQL语言的关键字,如查询唯一值可以使用DISTINCT关键字。                queryDef.SubFields = "DISTINCT (" + currentFieldName + ")";                //执行查询并返回ICursor接口的对象来访问整个结果的集合                ICursor cursor = queryDef.Evaluate();                //使用IField接口获取当前所需要使用的字段的信息                IFields fields = currentFeatureLayer.FeatureClass.Fields;                IField field = fields.get_Field(fields.FindField(currentFieldName));
//对整个结果集合进行遍历,从而添加所有的唯一值 //使用IRow接口来操作结果集合。首先定位到第一个查询结果。 IRow row = cursor.NextRow(); //如果查询结果非空,则一直进行添加操作 while (row != null) { //对String类型的字段,唯一值的前后添加'和',以符合SQL语句的要求 if (field.Type == esriFieldType.esriFieldTypeString) { listBoxValues.Items.Add("\'" + row.get_Value(0).ToString() + "\'"); } else { listBoxValues.Items.Add(row.get_Value(0).ToString()); } //继续执行下一个结果的添加 row = cursor.NextRow(); } } catch(Exception ex) { }

后续还有空间分析,地理处理等功能在此就不赘述,完整代码后台发送GIS开发’即可。


3

   

后续内容意见


遥感小屋
分享遥感相关文章、代码,大家一起交流,互帮互助
 最新文章