C#二次开发ArcGIS查询功能 联系客服

发布时间 : 星期日 文章C#二次开发ArcGIS查询功能更新完毕开始阅读20adc4bcd0f34693daef5ef7ba0d4a7302766c08

[地理信息系统课程设计报告]

\ + (30 - ts.TotalMinutes).ToString(\) + \分钟\,\错误提示\,MessageBoxButtons.OK,MessageBoxIcon.Error); return;

} else

{

//输错三次后30分钟后更新ErorrTimes=0

SqlHelper.NonQuery(@\,

newSqlParameter(\, id));

}

}

3、若密码输错次数小于3次,则从最后一次输错时刻算起,五分钟之后用户登录错误次数归零即Update T_User set ErorrTimes=1 where Id=@id

TimeSpan ts = DateTime.Now - Convert.ToDateTime(date); if (ts.TotalMinutes > 5) {

SqlHelper.NonQuery(@\, newSqlParameter(\, id)); }

2、属性查询程序解析说明

重点代码解析:

(1)进入属性查询界面的代码:

通过AttributeQueryForm类的构造函数来存储地图的数据和绑定DataGridView的数据源

AttributeQueryForm attributequery =

newAttributeQueryForm(this.axMapControl1,this.dataGridView1);attributequery.ShowDialog();

(2)从主程序axMapControl传值过来的地图数据存储在privateAxMapControl

mMapControl;并且在属性查询窗体的ComboBox组合控件cboLayer中添加各个图层名 //图层名称加入cboLayer

this.cboLayer.Items.Add(strLayerName);

通过get_Layer(cboLayer.SelectedIndex)获取选中图层,并将每个图层的字段名显示在名为cboField的ComboBox控件。

strFldName = pFeatureClass.Fields.get_Field(i).Name; //图层名称加入cboField

this.cboField.Items.Add(strFldName);

(3)属性查询中需要认识学习接口的相关知识,接口是一种规范、功能。在属性查询中我们需要用到IQueryFilter接口,该接口通过WhereClause属性来获取查询数据,类似于SQL中的where语句。然后再通过图层的Search方法基于查询条件返回要素游

[地理信息系统课程设计报告]9 / 38

[地理信息系统课程设计报告]

标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)) asIFeatureLayer;

//如果图层名称不是cboLayer.Text,程序退出 if (pFeatureLayer.Name != cboLayer.Text) return;

//清除上次查询结果

this.mMapControl.Map.ClearSelection();

activeview = this.mMapControl.Map asIActiveView; //pQueryFilter的实例化

pQueryFilter = newQueryFilterClass(); //设置查询过滤条件

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();

[地理信息系统课程设计报告]10 / 38

[地理信息系统课程设计报告]

3、自定义控件命令解析

以下讲述ArcEngine自定义开发的一些控件命令,如居中放大,居中缩小,拉框放大,拉框缩小,漫游,显示全图等。

基于BaseCommand的功能实现与Button的功能类似,是当鼠标点击按钮的时候,MapControl控件会对其中的命令做出相应响应而无需额外的操作,如ArcMap中的居中放大FixedZoomIn,居中缩小FixedZoomOut,全图FullExtent等。

对于BaseTool来说,点击该功能之后,只是开启一个交互的过程,需要用户再用鼠标、键盘等对地图做进一步交互式的操作,MapControl控件才会予以相应,如ArcMap中的拉框放大ZoomIn、拉框缩小ZoomOut、漫游Pan等。

以FixedZoomIn为例,双击解决方案资源管理器中的FixedZoomIn.cs项,进入该类的代码编写界面。加入引用“ESRI.ArcGIS.Geometry”,并在该类的最上方添加如下代码:

publicoverridevoid 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,以确定选择的是哪个控件命令命令

privatestring mTool;

privatevoid menuFixedZoomIn_Click(object sender, EventArgs e) {

//声明与初始化

FixedZoomIn fixedZoomin = newFixedZoomIn(); //与MapControl关联

fixedZoomin.OnCreate(this.axMapControl1.Object); fixedZoomin.OnClick(); }

4、三角网及泰森多边形构建解析

首先在Form窗体上加一个PictureBox控件,在PictureBox的MouseDown事件下通过每次点击获取点的坐标e.X,e.Y

privatevoid picMap_MouseDown(object sender, MouseEventArgs e)

{

Graphics g =((PictureBox)sender).CreateGraphics();

[地理信息系统课程设计报告]11 / 38

[地理信息系统课程设计报告]

g.FillEllipse(Brushes.Black, e.X, e.Y, 5, 5); Point pt = newPoint(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 = myPoints[i];

List> edjest = newList>(); int j = 0;

while (triangle.Count != 0 && triangle.Count - 1 >= j) { bool flag = true;

List mycircle = Circle(triangle, j); Point center = (Point)mycircle[0]; double radius = (double)mycircle[1]; if (pt.X > (center.X + radius)) { flag=true;

} elseif (Inside(pt, mycircle)) {

//edjest = Addnew(traingle, j);

List> ed = Addnew(triangle, j); edjest.Add(ed[0]); edjest.Add(ed[1]); edjest.Add(ed[2]); triangle.RemoveAt(j);

[地理信息系统课程设计报告]12 / 38