C#二次开发ArcGIS查询功能.doc_第1页
C#二次开发ArcGIS查询功能.doc_第2页
C#二次开发ArcGIS查询功能.doc_第3页
C#二次开发ArcGIS查询功能.doc_第4页
C#二次开发ArcGIS查询功能.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

地理信息系统课程设计报告目录一、ArcGIS简介1二、ArcGIS开发方法介绍1三、数据库设计11、数据库的建立12、数据表的设计2四、地理数据入库(地图扫描矢量化方法介绍)2五、功能设计(流程图)4六、程序运行界面介绍51、用户登录界面52、主程序界面53、属性查询界面64、三角网及泰森多边形6七、程序解析说明71、用户登录界面程序解析说明72、属性查询程序解析说明83、自定义控件命令解析104、三角网及泰森多边形构建解析10八、源代码附录131、用户登录源码132、属性查询源码163、DisplayToDataGridDAL类源码204、FixedZoomIn类源码215、FixedZoomOut类源码236、FullExtent类源码257、Pan类源码278、ZoomIn类源码309、ZoomOut类源码33一、ArcGIS简介ArcGIS是美国ESRI(Environmental Systems Research Institute, Inc. 美国环境系统研究所公司)推出的一条为不同需求层次用户提供的全面的、可伸缩的GIS产品线和解决方案。ESRI是GIS领域的拓荒者和领导者,而ArcGIS也代表了当前GIS行业最高的技术水平。ArcGIS是一个可伸缩的GIS平台,可以运行在桌面端、服务器端和移动设备上。它包含了一套建设完整GIS系统的应用软件,这些软件可以互相独立或集成配合使用,为不同需求的用户提供完善的解决之道。ArcGIS是基于一套共享的GIS组件开发实现的,这套组件被命名为ArcObjects,它包含了大量可编程组件,实现了ArcGIS的全部功能。因此,ArcObjects可以被认为是ArcGIS产品的核心,熟悉ArcObjects的过程同时也是熟悉ArcGIS Engine的过程。二、ArcGIS开发方法介绍Gis的开发方法有三种,即独立开发,宿主型二次开发,基于gis组件的二次开发,其中独立开发为底层开发,不依赖于任何gis工具软件,开发难度太大,后两者是基于一种软件的二次开发,这样的二次开发则相对较简单,他的好处也是显而易见的。Esri公司推出的ArcGIS产品不仅仅包含基础平台软件,也包含供用户二次开发的组件,那么这些组件也包含C/S、B/S、移动端的。C/S架构主要是应用于局域网方面,一般是安装开发软件,一般情况下机器都不连互联网,主要处理数据编辑、数据入库、地图整饰等对机器性能要求比较高。B/S架构主要应用于局域网或者互联网,一般情况下使用浏览器,主要是进行数据查询、分析等。ArcGISEngine开发工具包是一个基于组件的软件开发产品,用于建立和部署自定义GIS和制图应用程序。ArcGISEngine开发工具包不是一个终端用户产品,而是一个应用程序开发人员的工具包。可以用ArcGISEngine开发工具包建立基本的地图浏览器或综合、动态的GIS编辑工具。使用ArcGISEngine开发工具包,开发人员在建立定制的地图接口方面具有前所未有的灵活性。开发人员可以使用几个API中的任何一个来建立独一无二的应用程序,或者将ArcGISEngine组件与其他软件组件组合起来实现地图与用户管理信息之间的协同关系。三、数据库设计1、数据库的建立通过ArcCatalog创建个人地理数据库要素集要素类编辑属性2、数据表的设计(1)房屋字段名称字段解释类型长度备注IDID号LongName名称Char20Owner所有者Char20Layers层数Integer20Material材质Char20Add地址Char40BuildArea建筑面积FloatRemark备注Char40(2)道路字段名称字段解释类型长度备注IDID号LongName名称Char20Material 铺设材料Char20Width 道路宽度FloatRemark备注Char40等等四、地理数据入库(地图扫描矢量化方法介绍)1、打开ArcMap,添加“影像配准”工具栏。把需要进行配准的影像“校内平面图测绘14级.dwg”添加到ArcMap中,会发现“影像配准”工具栏中的工具被激活。2、在“影像配准”工具栏上,点击“添加控制点(addcontrolpoint)”按钮。使用该工具在扫描图上精确到找一个控制点点击,然后鼠标右击输入该点实际的坐标位置。用相同的方法,在影像上增加多个控制点(大于3个),输入它们的实际坐标。点击“影像配准”工具栏上的“查看链接表(viewlinktable)”按钮。对于误差较大的控制点,可以删除然后重新采集。3、打开ArcCatalog.在指定目录下,鼠标右击,在“新建”中,选择“个人Geodatabase”。并修改该Geodatabase数据库的名称。右击新建要素集并为要素集设置投影坐标系。右击新建要素类,选择要素类型,并为要素命名,添加要素属性字段“Name”等。这样便建好了一个点,线或面要素4、在ArcMap中编辑工作条上点击开始编辑,这时会弹出来一个窗口选择要素,然后在已经配准后的图像上选择相应的要素类型一一绘制,右击图层控件上的某个要素图层打开属性表可以编辑属性。5、将矢量化好后的图层导出为(*.mxd)文件。五、功能设计(流程图)六、程序运行界面介绍1、用户登录界面2、主程序界面3、属性查询界面4、三角网及泰森多边形七、程序解析说明1、用户登录界面程序解析说明用户登录设计思路:(1)用户输入用户名和密码,用户名不能为空,密码不能为空。(2)密码在五分钟之内连续输错三次,用户名被锁定,30分钟后才能再次登录。(3)若密码输错次数小于3次,则从最后一次输错时刻算起,五分钟之后用户登录错误次数归零。(4)用户注册,数据库中检索此用户,若用户存在则提示用户名已存在,反之注册成功,需重新登录。重点代码解析:使用参数化查询避免注入漏洞攻击,用户信息存储在SQL Server数据库的T_User表中/只用来执行查询结果较少的sql public static DataSet ExecuteDataSet(string sql, params SqlParameter parameters) using (SqlConnection conn = new SqlConnection(ConStr) conn.Open(); using (SqlCommand cmd = conn.CreateCommand() cmd.CommandText = sql; cmd.Parameters.AddRange(parameters); /SqlDataAdapter如同一个适配器,过渡桥梁的作用 SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataSet dataset = new DataSet(); adapter.Fill(dataset); return dataset; 当用户输错三次以上并且时间少于30分钟时不允许登陆,TimeSpan ts = DateTime.Now - date;用于存储间隔时间if (errortimes = 3) DateTime date = (DateTime)rowLock; TimeSpan ts = DateTime.Now - date; if (ts.TotalMinutes 5) SqlHelper.NonQuery(Update T_User set ErorrTimes=1 where Id=id, new SqlParameter(id, id); 2、属性查询程序解析说明重点代码解析:(1)进入属性查询界面的代码:通过AttributeQueryForm类的构造函数来存储地图的数据和绑定DataGridView的数据源AttributeQueryForm attributequery = new AttributeQueryForm(this.axMapControl1,this.dataGridView1);attributequery.ShowDialog();(2)从主程序axMapControl传值过来的地图数据存储在private AxMapControl mMapControl;并且在属性查询窗体的ComboBox组合控件cboLayer中添加各个图层名/图层名称加入cboLayerthis.cboLayer.Items.Add(strLayerName);通过get_Layer(cboLayer.SelectedIndex)获取选中图层,并将每个图层的字段名显示在名为cboField的ComboBox控件。strFldName = pFeatureClass.Fields.get_Field(i).Name;/图层名称加入cboFieldthis.cboField.Items.Add(strFldName);(3)属性查询中需要认识学习接口的相关知识,接口是一种规范、功能。在属性查询中我们需要用到IQueryFilter接口,该接口通过WhereClause属性来获取查询数据,类似于SQL中的where语句。然后再通过图层的Search方法基于查询条件返回要素游标pFeatureCursor。如下图,pFeatureCursor指针一开始指向第0层,每调用一下NextFeature()方法,指针就往下移动一格直到指向null代码示例:/定义图层,要素游标,查询过滤器,要素 IFeatureLayer pFeatureLayer; IFeatureCursor pFeatureCursor; IQueryFilter pQueryFilter; IFeatureSelection pFeatureSelection; IActiveView activeview; IFeature pFeature; /获取图层 pFeatureLayer = this.mMapControl.Map.get_Layer(GetLayerindexbyName(cboLayer.Text) as IFeatureLayer; /如果图层名称不是cboLayer.Text,程序退出 if (pFeatureLayer.Name != cboLayer.Text) return; /清除上次查询结果 this.mMapControl.Map.ClearSelection(); activeview = this.mMapControl.Map as IActiveView; /pQueryFilter的实例化 pQueryFilter = new QueryFilterClass(); /设置查询过滤条件 pQueryFilter.WhereClause = + cboField.Text + = + txtValue.Text + ; /基于查询条件创建指针并回收 pFeatureCursor = pFeatureLayer.Search(pQueryFilter, true); /获取查询到的要素然后再调用DisplayToDataGridDAL类中的方法,将查询出来的要素字段值显示在DataGridView中,DisplayToDataGridDAL类是自己写的一个类(代码见附录)代码示例:DisplayToDataGridDAL.Dataview(pFeatureCursor, dataGrid,pFeatureLayer);高亮并居中显示选中的要素:activeview.Extent =pFeature.Shape.Envelope;activeview.Refresh();3、自定义控件命令解析以下讲述ArcEngine自定义开发的一些控件命令,如居中放大,居中缩小,拉框放大,拉框缩小,漫游,显示全图等。基于BaseCommand的功能实现与Button的功能类似,是当鼠标点击按钮的时候,MapControl控件会对其中的命令做出相应响应而无需额外的操作,如ArcMap中的居中放大FixedZoomIn,居中缩小FixedZoomOut,全图FullExtent等。对于BaseTool来说,点击该功能之后,只是开启一个交互的过程,需要用户再用鼠标、键盘等对地图做进一步交互式的操作,MapControl控件才会予以相应,如ArcMap中的拉框放大ZoomIn、拉框缩小ZoomOut、漫游Pan等。以FixedZoomIn为例,双击解决方案资源管理器中的FixedZoomIn.cs项,进入该类的代码编写界面。加入引用“ESRI.ArcGIS.Geometry”,并在该类的最上方添加如下代码:public override void OnClick() / TODO: Add FixedZoomIn.OnClick implementation /获取当前视图范围 IActiveView pActiveView = m_hookHelper.ActiveView; IEnvelope pEnvelope = pActiveView.Extent; /扩大视图范围并刷新视图 pEnvelope.Expand(0.5, 0.5, true); pActiveView.Extent = pEnvelope; pActiveView.Refresh(); 在主程序代码中还添加了一个全局变量mTool,以确定选择的是哪个控件命令命令private string mTool;private void menuFixedZoomIn_Click(object sender, EventArgs e) /声明与初始化 FixedZoomIn fixedZoomin = new FixedZoomIn(); /与MapControl关联 fixedZoomin.OnCreate(this.axMapControl1.Object); fixedZoomin.OnClick(); 4、三角网及泰森多边形构建解析首先在Form窗体上加一个PictureBox控件,在PictureBox的MouseDown事件下通过每次点击获取点的坐标e.X,e.Yprivate void picMap_MouseDown(object sender, MouseEventArgs e) Graphics g =(PictureBox)sender).CreateGraphics(); g.FillEllipse(Brushes.Black, e.X, e.Y, 5, 5); Point pt = new Point(e.X, e.Y); myPoints.Add(pt); g.Dispose();三角网的构建采用逐点插入法,首先对在鼠标单击事件下获取的点集进行排序,排序时X坐标从小到大排列,若X坐标相同则Y坐标从小到大排列。构建一个可以包含所有点集的超级三角形,并将超级三角形的三个顶点存入Triangle表中。从点集中取点判断点是否在三角形内,若点在三角形内,则将该三角形三边存入边列表中,若并从三角形列表中删除该三角形,如此循环,遍历点集里所有的点。最后删除与超级三角形有共同顶点的三角形及凹边界处三角形重点代码示例:if (myPoints.Count = 0) return; else /对点集进行排序,先按X坐标从大到小排序 / X坐标相同的按Y坐标从大到小排序 myPoints = SortPoints(myPoints); /获得超级三角形 SuperTriangle(myPoints); int i = 0; while (i myPoints.Count) Point pt = myPointsi; ListList edjest = new ListList(); int j = 0; while (triangle.Count != 0 & triangle.Count - 1 = j) bool flag = true; List mycircle = Circle(triangle, j); Point center = (Point)mycircle0; double radius = (double)mycircle1; if (pt.X (center.X + radius) flag=true; else if (Inside(pt, mycircle) /edjest = Addnew(traingle, j); ListList ed = Addnew(triangle, j); edjest.Add(ed0); edjest.Add(ed1); edjest.Add(ed2); triangle.RemoveAt(j); flag = false; if (flag) j+; /删除重复的边 edjest = Delete(edjest); triangle = NewTriangle(pt, edjest); i+; /删除以超级三角形顶点为顶点的三角形 triangle = SuperDelete(supertriangle); /删除凹边界处三角形 triangle = TraingleDelete(); using (Graphics g = this.picMap.CreateGraphics() for (int j = 0; j triangle.Count; j+) Point myPoint = new Point3; myPoint0 = (Point)trianglej0; myPoint1 = (Point)trianglej1; myPoint2 = (Point)trianglej2; g.DrawPolygon(new Pen(Brushes.Red,3), myPoint); 构建泰森多边形需要构建三角网。找出每个离散点周围的三角形即以该离散点为共同顶点的三角形,按逆时针排列起来以便下一步生成泰森多边形,连接该离散点周围三角形的外接圆的圆心。三角网边界处的泰森多边形可做垂直平分线与图廓相交,与图廓一起形成泰森多边形。(代码见附录)重点代码示例:/使三角形三个点坐标都按逆时针方向存储 triangle= Thiessen.SortTraingle(triangle); /存储三角网所有三角形的边 Thiessen.Edge(triangle); /构成边界的边集合 Thiessen.BorderEdge(Thiessen.allEdge); /寻找以边界点为顶点的三角形集合 Thiessen.BorderTriangle(Thiessen.borderEdge, triangle); /除边界点外其他离散点 Thiessen.CenterPoint(myPoints, Thiessen.borderEdge); /除边界点外其他离散点构成的泰森多边形集合 Thiessen.ThiessenEdge(triangle, Thiessen.centerpoint); /边界离散点构成的泰森多边形集合 Thiessen.MyBorderTheissen(Thiessen.borderEdge, Thiessen.myBorderTriangle); using (Graphics g = this.picMap.CreateGraphics() /绘制除边界点外其他离散点构成的泰森多边形集合 for (int i = 0; i Thiessen.myTheissen.Count; i+) g.DrawPolygon(new Pen(Brushes.Black,3), Thiessen.myTheisseni.ToArray(); /绘制边界离散点构成的泰森多边形集合 for (int i = 0; i Thiessen.myBorderTheissen.Count; i+) g.DrawPolygon(new Pen(Brushes.Black,3), Thiessen.myBorderTheisseni.ToArray(); 八、源代码附录1、用户登录源码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace MyMap public partial class LoginWindow : Form public LoginWindow() InitializeComponent(); private void btnLogin_Click(object sender, EventArgs e) if (txtUserName.Text.Length = 0) MessageBox.Show(请输入用户名); return; if (txtpwdPassword.Text.Length = 0) MessageBox.Show(请输入密码!); return; DataSet ds = SqlHelper.ExecuteDataSet(select * from T_User where UserName=Name, new SqlParameter(Name, txtUserName.Text); if (ds.Tables0.Rows.Count 1) throw new Exception(不好啦!重复了!); DataRow row = ds.Tables0.Rows0; string password = (string)rowPassWord; long id = (long)rowId; int errortimes = (int)rowErorrTimes; /错误次数大于3时 /防御性编程 if (errortimes = 3) DateTime date = (DateTime)rowLock; TimeSpan ts = DateTime.Now - date; if (ts.TotalMinutes 5) SqlHelper.NonQuery(Update T_User set ErorrTimes=1 where Id=id, new SqlParameter(id, id); return; private void btnCancel_Click(object sender, EventArgs e) this.Close(); private void btnRegister_Click(object sender, EventArgs e) DataSet ds = SqlHelper.ExecuteDataSet(select * from T_User where UserName=Name, new SqlParameter(Name, txtUserName.Text); if (ds.Tables0.Rows.Count = 1) /throw new Exception(不好啦!重复了!); MessageBox.Show(用户名已存在,请重新输入用户名注册); return; if (txtUserName.Text.Length = 0) MessageBox.Show(用户名不能为空!); return; if (txtpwdPassword.Text.Length = 0) MessageBox.Show(密码不能为空!); return; SqlHelper.NonQuery(insert into T_User(UserName,PassWord,ErorrTimes) Values( + txtUserName.Text + , + txtpwdPassword.Text + ,0); MessageBox.Show(恭喜 + txtUserName.Text + 注册成功!请重新登录, 注册); txtUserName.Text = ; txtpwdPassword.Text = ; 2、属性查询源码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.Display;namespace MyMap public partial class AttributeQueryForm : Form /存储地图数据 private AxMapControl mMapControl; private DataGridView dataGrid; /存储当前选中图层,IFeatureLayer继承自ILayer private IFeatureLayer mFeatureLayer; /通过构造函数来传值 public AttributeQueryForm(AxMapControl mapcontrol, DataGridView dataGridView) InitializeComponent(); this.mMapControl = mapcontrol; this.dataGrid = dataGridView; public AttributeQueryForm() private int GetLayerindexbyName(string cbolayername) int i; for (i = 0; i mMapControl.LayerCount; i+) if (cbolayername = mMapContr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论