功能说明:
针对基础部分和三维数据库建设部分实习内容,进行校园二、三维地理信息系统设计,完成校园地理信息系统二、三维数据库设计和实现,并完成简单的查询、浏览和分析功能。本次实习开发语言为C#,开发平台为vs2010。
界面设计:
在本次实习中,新建的程序项目为窗体型,在窗体中拖入控件MenuStrip、ToolbarControl、StatusStrip、SplitContainer、TabControl、MapControl、PageLayoutControl 等控件,并设置其相关的Dock 属性、Name 和Text属性等,然后进行页面绑定,并添加相应的ArcGISD的工具,本次开发整体页面布局如下:

1.菜单的添加及其实现
添加菜单,并在其属性面板中设置 Name 属性,然后实现相关菜单,双击事件按钮打到“ Load ”事件并双击,添加此事件,其中新建文件、打开文件、加载数据、关闭文件等部分代码如下:
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
{ //文件路径名称,包含文件名称和路径名称
string strName = null;
//定义OpenFileDialog,获取并打开地图文档
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = “打开MXD”;
openFileDialog.Filter = “MXD文件(.mxd)|.mxd”;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{ strName = openFileDialog.FileName;
if (strName != “”)
{ this.axMapControl1.LoadMxFile(strName); } }
this.axMapControl1.Extent = this.axMapControl1.FullExtent;
}
private void AddData_Click(object sender, EventArgs e)
{ //添加数据
int currentLayerCount = this.axMapControl1.LayerCount;
ICommand pCommand = new ControlsAddDataCommandClass();
pCommand.OnCreate(this.axMapControl1.Object);
pCommand.OnClick(); }
private void Save_Click(object sender, EventArgs e)
{ if (null != m_pageLayoutControl.DocumentFilename&& m_mapControl.CheckMxFile(m_page
LayoutControl.DocumentFilename))
{ // 创建一个新的地图文档实例
IMapDocument mapDoc = new MapDocumentClass();
// 打开当前地图文档
mapDoc.Open(m_pageLayoutControl.DocumentFilename, string.Empty);
// 用 PageLayout 中的文档替换当前文档中的 PageLayout 部分
mapDoc.ReplaceContents((IMxdContents)m_pageLayoutControl.PageLayout);
// 保存地图文档
mapDoc.Save(mapDoc.UsesRelativePaths, false);
mapDoc.Close(); } }
private void SaveAs_Click(object sender, EventArgs e)
{ // 调用另存为命令
ICommand command = new ControlsSaveAsDocCommandClass();
command.OnCreate(m_controlsSynchronizer.ActiveControl);
command.OnClick(); }
添加完成后运行时的界面如下图所示:

2、MapControl 与PageLayoutControl 同步
为了能够很方面地进行MapView 和Layout View 两种视图的切换,以及二者之间的数据是同步显示,比较简单的方法莫过于二者共享一份地图了,这也是最常用的方法。首先要新建同步类ControlsSynchronizer,新建Maps 类、新建打开文档类OpenNewMapDocument,并在OnClick 函数中添加相应代码,进而实现两种视图的同步。
3、状态栏信息的添加与实现
应用程序的状态栏一般用来显示程序的当前状态,当前所使用的工具。GIS 应用程序一般也在状态栏显示当前光标的坐标、比例尺等信息。为了实现此功能,首先我们要添加状态栏项目、然后显示当前所用工具信息、显示当前比例尺、显示当前坐标,。运行界面截图如下图所示:

4、按照属性查询
按照属性查询时,要对待查询图选择相应的字段、图层,然后设置属性进行查询,查询是设计界面如下:

按照属性查询时代码如下:
private void 属性ToolStripMenuItem_Click(object sender, EventArgs e)
{ //初始化属性查询窗体
AttributeQueryForm attributeQueryForm = new AttributeQueryForm(this.axMapControl1);
attributeQueryForm.Show(); }
private DataTable LoadQueryResult(AxMapControl mapControl, IFeatureLayer featureLayer, IGeometry geometry)
{IFeatureClass pFeatureClass = featureLayer.FeatureClass;//根据图层属性字段初始化DataTable
IFields pFields = pFeatureClass.Fields;
DataTable pDataTable = new DataTable();
for (int i = 0; i < pFields.FieldCount; i++)
{ string strFldName;
strFldName = pFields.get_Field(i).AliasName;
pDataTable.Columns.Add(strFldName); }
ISpatialFilter pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.Geometry = geometry;
//根据图层类型选择缓冲方式
switch (pFeatureClass.ShapeType)
{ case esriGeometryType.esriGeometryPoint:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains; break;
case esriGeometryType.esriGeometryPolyline:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses; break;
case esriGeometryType.esriGeometryPolygon:
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; break; }
//定义空间过滤器的空间字段
pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;
IQueryFilter pQueryFilter;
IFeatureCursor pFeatureCursor;
IFeature pFeature;
//利用要素过滤器查询要素
pQueryFilter = pSpatialFilter as IQueryFilter;
pFeatureCursor = featureLayer.Search(pQueryFilter, true);
pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{ string strFldValue = null;
DataRow dr = pDataTable.NewRow();//遍历图层属性表字段值,并加入pDataTable
for (int j = 0; j < pFields.FieldCount; j++)
{ string strFldName1 = pFields.get_Field(j).Name;
if (strFldName1 == “Shape”)
{ strFldValue = Convert.ToString(pFeature.Shape.GeometryType); }
else strFldValue = Convert.ToString(pFeature.get_Value(j));
dr[j] = strFldValue; }
pDataTable.Rows.Add(dr);//高亮选择要素
mapControl.Map.SelectFeature((ILayer)featureLayer, pFeature);
mapControl.ActiveView.Refresh();
pFeature = pFeatureCursor.NextFeature(); }
return pDataTable; }
程序运行时截图如下:



5、按照空间位置查询
按照空间位置进行查询时,首先要选择图层,然后选择查询方式,查询方式包括点、线、圆、矩形4种方式,按照位置查询代码如下:
private void 位置ToolStripMenuItem_Click(object sender, EventArgs e)
{ SpatialQueryForm spatialQueryForm = new SpatialQueryForm(this.axMapControl1);
if (spatialQueryForm.ShowDialog() == DialogResult.OK)
{ //标记为“空间查询”,获取查询方式和图层
this.mTool = “SpaceQuery”;
this.mQueryMode = spatialQueryForm.mQueryMode;
this.mLayerIndex = spatialQueryForm.mLayerIndex;
this.axMapControl1.MousePointer=ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerCrosshair; }
}
Private void axMapControl1 _OnMouseDown (objectsender, IMapControl Events2_OnMouseDownEvent e)
{ //清空上次选择的结果
this.axMapControl1.Map.ClearSelection();
switch (mTool)
{ case “SpaceQuery”: //获取当前视图
ESRI.ArcGIS.Carto.IActiveView pActiveView = this.axMapControl1.ActiveView;//获取鼠标点
ESRI.ArcGIS.Geometry.IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
ESRI.ArcGIS.Geometry.IGeometry pGeometry = null;
switch (this.mQueryMode)
{case 0: //矩形查询
pGeometry = this.axMapControl1.TrackRectangle(); break;
case 1: //线查询
pGeometry = this.axMapControl1.TrackLine(); break;
case 2: //点查询
ESRI.ArcGIS.Geometry.ITopologicalOperator pTopo;
ESRI.ArcGIS.Geometry.IGeometry pBuffer;
pGeometry = pPoint;
pTopo = pGeometry as ESRI.ArcGIS.Geometry.ITopologicalOperator;
//根据点位创建缓冲区,缓冲半径设为0.1,可自行修改
pBuffer = pTopo.Buffer(0.1);
pGeometry = pBuffer.Envelope; break;
case 3: //圆查询
pGeometry = this.axMapControl1.TrackCircle();
break; }
ESRI.ArcGIS.Carto.IFeatureLayer pFeatureLayer = this.axMapControl1.Map.get_Layer(this.mLayerIndex) as ESRI.ArcGIS.Carto.IFeatureLayer;
DataTable pDataTable = this.LoadQueryResult(axMapControl1, pFeatureLayer, pGeometry);
this.dataGridView1.DataSource = pDataTable.DefaultView;
this.dataGridView1.Refresh(); break; default: break; } }
程序运行时,选择好图层与查询方式后如下图所示,然后在图上用矩形框选一定区域,如下图所示,查询结果亦见下图。

基于GIS的二次开发相关推荐

  1. 据说这是熟练掌握python的爷们_dongbei 是一门基于 Python 3 二次开发的东北方言编程语言...

    dongbei - 东北方言编程语言 学编程,就整东北浪! 体格咋地 扫码关注原作者微信公众号"老万故事会": 引言 dongbei是啥?它是一门以东北方言词汇为基本关键字的以人为 ...

  2. java二次开发浏览器内核_深入理解基于Selenium的二次开发

    对于做web端自动化测试的人来说,可能接触selenium比QTP还要多,但是我们在做基于selenium的二次开发的时候,经常会说到二次开发是 为了易于维护,很多人可能不懂得维护的价值是什么,和到底 ...

  3. Vue+Vant 基于DatetimePicker进行二次开发,实现yyyyMMdd hh:mm:ss时间选择

    Vue+Vant 基于DatetimePicker进行二次开发,实现yyyyMMdd hh:mm:ss时间选择 1.效果图 2.前提 3.项目结构 4.index.vue 5.timeSelectio ...

  4. 基于Visio的二次开发

    基于Visio的二次开发 前一段时间,由于项目的需要:学习了一些关于Visio二次开发的知识:现在工具基本成形了,也算告一段落了:因此想总结一下关于Visio的二次开发的一些基本知识: 对于基于Vis ...

  5. WordPress主题 Vieu主题V4.5无授权无限制版 基于Dux主题二次开发 完美运行

    模板简介: WordPress主题vieu基于Dux主题二次开发!的一款专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板.适用范围:wordpress主题.WordPres ...

  6. 海康威视多摄像头实时视频预览(基于SDK的二次开发)

    项目背景 很久没有做工程项目了,最近突然接单,要做多摄像头下运动物体入侵检测及拌线检测,本文测试用到的摄像头是海康威视的DS-2CD23**D摄像头. 环境配置: 1.下载SDK 2.vs2010开发 ...

  7. SuperMap GIS 的二次开发

    SuperMap GIS 的二次开发 开发工具与关键技术: SuperMap iDesktop C# 作者:宋永烨 撰写时间:2020年4月20日 二次开发,在原有的基础上再次进行开发,制作自己所需的 ...

  8. office 文件在线协作编辑——解决方案1(基于sharepoint的二次开发)

    概述 office 文件在线协作编辑主要是指word.excel.ppt的多人在线协作编辑,实时同步的功能: 这里主要介绍解决方案之一--基于sharepoint的二次开发(还可以基于wopi实现)的 ...

  9. 【基于蜂鸟地图二次开发工具,方便开发者快速开发业务】

    基于蜂鸟地图二次开发工具 lmfmap v0.0.1 开发 lmfmap v0.0.1 基于蜂鸟地图二次封装的工具,让开发者用最少的代码开发自己的业务,让业务和地图解耦,业务提供数据地图提供接口交互 ...

  10. CANanlystII 基于python的二次开发实践

    前期,我已经编写过一篇<CANanlystII 基于linux的二次开发实践>这篇博客承接上一篇博客,所以背景知识和测试场景,就不再赘述. 背景知识和测试场景,可以查阅如下: CANanl ...

最新文章

  1. 11 Java程序员面试宝典视频课程之网络编程
  2. PyTorch的六个学习率调整
  3. Ribbon的权重负载均衡策略
  4. 视觉SLAM笔记(18) Sophus
  5. cba篮球暂停次数和时间_CBA一场比赛每支球队可以叫多少次暂停
  6. ad如何设置pcb板子形状_板子的造型_ad09在做PCB时如何设计板子的形状啊_彩妆阁...
  7. 微服务网关(一)微服务的选择以及网关的功能
  8. micrium ucprobe使用指南
  9. JS:鼠标事件:实现鼠标移动到div背景颜色变换,移开还原
  10. 安装vue环境,并新建Vue项目
  11. ftok函数的作用:
  12. Qt 设置父控件样式不影响子控件的解决方法
  13. 关于电脑主机名更改,oracle登录不了的问题
  14. 企业网站首页设计常见的6种布局方式
  15. 身份证号要是能修改就好了,不怕被骗子骗了
  16. 一个c语言源程序至少包括哪些内容,一个c源程序中至少应包括一个什么函数_后端开发...
  17. 【渝粤教育】 国家开放大学2020年春季 2585城市轨道交通概论 参考试题
  18. scratch案例——九九乘法
  19. 首批公募REITs“开卖”,行业壁垒与交流障碍亟待解决
  20. 2020数学建模高教社杯建模思路笔记

热门文章

  1. python中sqrt的意思_python中sqrt是什么意思
  2. 2021-11-13 信道划分介质访问控制ALOHA协议CSMA协议
  3. tumblr_使用CSS网格重新设计基于卡片的Tumblr布局
  4. word上怎么把图片拼接到一起_如何用Word把自己插入的两张图片合在一起?
  5. 建筑模式语言(美)c.亚历山大.pdf,建筑模式语言:城镇·建筑·构造(上下)两本 精装32开,有少量画线...
  6. js--京东快递单号查询案例
  7. ie html5缓存,ie缓存文件在哪,教您IE浏览器缓存文件在哪
  8. qq街景输入 dir-item.js
  9. 如何合并多个PDF文件并自动生成目录
  10. TOM邮箱—让邮件更安全 让工作更惬意