LXX
读完需要
速读仅需 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