[地理信息系统课程设计报告]
\ + (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
} 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
相关推荐: