版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
(完整word版)C二次開(kāi)發(fā)ArcGIS查詢(xún)功能(完整word版)C二次開(kāi)發(fā)ArcGIS查詢(xún)功能[地理信息系統(tǒng)課程設(shè)計(jì)報(bào)告]64/64(完整word版)C二次開(kāi)發(fā)ArcGIS查詢(xún)功能目錄TOC\o”1-3"\h\z\uHYPERLINK\l”_Toc482452852"一、ArcGIS簡(jiǎn)介 1HYPERLINK\l”_Toc482452853"二、ArcGIS開(kāi)發(fā)方法介紹 1_Toc482452855”1、數(shù)據(jù)庫(kù)的建立 1HYPERLINK\l”_Toc482452856"2、數(shù)據(jù)表的設(shè)計(jì) 2_Toc482452858”五、功能設(shè)計(jì)(流程圖) 4六、程序運(yùn)行界面介紹 5HYPERLINK\l”_Toc482452860”1、用戶(hù)登錄界面 5HYPERLINK\l”_Toc482452861”2、主程序界面 5HYPERLINK\l”_Toc482452862"3、屬性查詢(xún)界面 6HYPERLINK\l”_Toc482452863”4、三角網(wǎng)及泰森多邊形 6七、程序解析說(shuō)明 7HYPERLINK\l”_Toc482452865”1、用戶(hù)登錄界面程序解析說(shuō)明 7HYPERLINK\l”_Toc482452866”2、屬性查詢(xún)程序解析說(shuō)明 8HYPERLINK\l”_Toc482452867”3、自定義控件命令解析 104、三角網(wǎng)及泰森多邊形構(gòu)建解析 10HYPERLINK\l”_Toc482452869"八、源代碼附錄 131、用戶(hù)登錄源碼 132、屬性查詢(xún)?cè)创a 16_Toc482452873"4、FixedZoomIn類(lèi)源碼 21_Toc482452875"6、FullExtent類(lèi)源碼 25HYPERLINK\l”_Toc482452876"7、Pan類(lèi)源碼 27_Toc482452878”9、ZoomOut類(lèi)源碼 33一、ArcGIS簡(jiǎn)介ArcGIS是美國(guó)ESRI(EnvironmentalSystemsResearchInstitute,Inc。美國(guó)環(huán)境系統(tǒng)研究所公司)推出的一條為不同需求層次用戶(hù)提供的全面的、可伸縮的GIS產(chǎn)品線和解決方案.ESRI是GIS領(lǐng)域的拓荒者和領(lǐng)導(dǎo)者,而ArcGIS也代表了當(dāng)前GIS行業(yè)最高的技術(shù)水平。ArcGIS是一個(gè)可伸縮的GIS平臺(tái),可以運(yùn)行在桌面端、服務(wù)器端和移動(dòng)設(shè)備上。它包含了一套建設(shè)完整GIS系統(tǒng)的應(yīng)用軟件,這些軟件可以互相獨(dú)立或集成配合使用,為不同需求的用戶(hù)提供完善的解決之道。ArcGIS是基于一套共享的GIS組件開(kāi)發(fā)實(shí)現(xiàn)的,這套組件被命名為ArcObjects,它包含了大量可編程組件,實(shí)現(xiàn)了ArcGIS的全部功能。因此,ArcObjects可以被認(rèn)為是ArcGIS產(chǎn)品的核心,熟悉ArcObjects的過(guò)程同時(shí)也是熟悉ArcGISEngine的過(guò)程。二、ArcGIS開(kāi)發(fā)方法介紹Gis的開(kāi)發(fā)方法有三種,即獨(dú)立開(kāi)發(fā),宿主型二次開(kāi)發(fā),基于gis組件的二次開(kāi)發(fā),其中獨(dú)立開(kāi)發(fā)為底層開(kāi)發(fā),不依賴(lài)于任何gis工具軟件,開(kāi)發(fā)難度太大,后兩者是基于一種軟件的二次開(kāi)發(fā),這樣的二次開(kāi)發(fā)則相對(duì)較簡(jiǎn)單,他的好處也是顯而易見(jiàn)的。Esri公司推出的ArcGIS產(chǎn)品不僅僅包含基礎(chǔ)平臺(tái)軟件,也包含供用戶(hù)二次開(kāi)發(fā)的組件,那么這些組件也包含C/S、B/S、移動(dòng)端的.C/SHYPERLINK”/base/architecture"\o”大型網(wǎng)站架構(gòu)知識(shí)庫(kù)"架構(gòu)主要是應(yīng)用于局域網(wǎng)方面,一般是安裝開(kāi)發(fā)軟件,一般情況下機(jī)器都不連互聯(lián)網(wǎng),主要處理數(shù)據(jù)編輯、數(shù)據(jù)入庫(kù)、地圖整飾等對(duì)機(jī)器性能要求比較高。B/S架構(gòu)主要應(yīng)用于局域網(wǎng)或者互聯(lián)網(wǎng),一般情況下使用瀏覽器,主要是進(jìn)行數(shù)據(jù)查詢(xún)、分析等.ArcGIS
Engine開(kāi)發(fā)工具包是一個(gè)基于組件的軟件開(kāi)發(fā)產(chǎn)品,用于建立和部署自定義GIS和制圖應(yīng)用程序。ArcGIS
Engine開(kāi)發(fā)工具包不是一個(gè)終端用戶(hù)產(chǎn)品,而是一個(gè)應(yīng)用程序開(kāi)發(fā)人員的工具包??梢杂肁rcGIS
Engine開(kāi)發(fā)工具包建立基本的地圖瀏覽器或綜合、動(dòng)態(tài)的GIS編輯工具。使用ArcGIS
Engine開(kāi)發(fā)工具包,開(kāi)發(fā)人員在建立定制的地圖接口方面具有前所未有的靈活性.開(kāi)發(fā)人員可以使用幾個(gè)API中的任何一個(gè)來(lái)建立獨(dú)一無(wú)二的應(yīng)用程序,或者將ArcGIS
Engine組件與其他軟件組件組合起來(lái)實(shí)現(xiàn)地圖與用戶(hù)管理信息之間的協(xié)同關(guān)系。三、數(shù)據(jù)庫(kù)設(shè)計(jì)1、數(shù)據(jù)庫(kù)的建立通過(guò)ArcCatalog創(chuàng)建個(gè)人地理數(shù)據(jù)庫(kù)>>要素集>>要素類(lèi)>>編輯屬性2、數(shù)據(jù)表的設(shè)計(jì)(1)房屋字段名稱(chēng)字段解釋類(lèi)型長(zhǎng)度備注IDID號(hào)LongName名稱(chēng)Char20Owner所有者Char20Layers層數(shù)Integer20Material材質(zhì)Char20Add地址Char40BuildArea建筑面積FloatRemark備注Char40(2)道路字段名稱(chēng)字段解釋類(lèi)型長(zhǎng)度備注IDID號(hào)LongName名稱(chēng)Char20Material鋪設(shè)材料Char20Width道路寬度FloatRemark備注Char40等等四、地理數(shù)據(jù)入庫(kù)(地圖掃描矢量化方法介紹)1、打開(kāi)ArcMap,添加“影像配準(zhǔn)”工具欄。把需要進(jìn)行配準(zhǔn)的影像—“校內(nèi)平面圖測(cè)繪14級(jí).dwg”添加到ArcMap中,會(huì)發(fā)現(xiàn)“影像配準(zhǔn)”工具欄中的工具被激活.2、在“影像配準(zhǔn)”工具欄上,點(diǎn)擊“添加控制點(diǎn)(add
control
point)”按鈕。使用該工具在掃描圖上精確到找一個(gè)控制點(diǎn)點(diǎn)擊,然后鼠標(biāo)右擊輸入該點(diǎn)實(shí)際的坐標(biāo)位置。用相同的方法,在影像上增加多個(gè)控制點(diǎn)(大于3個(gè)),輸入它們的實(shí)際坐標(biāo)。點(diǎn)擊“影像配準(zhǔn)”工具欄上的“查看鏈接表(view
link
table)"按鈕。對(duì)于誤差較大的控制點(diǎn),可以刪除然后重新采集。3、打開(kāi)ArcCatalog。在指定目錄下,鼠標(biāo)右擊,在“新建”中,選擇“個(gè)人Geodatabase"。并修改該Geodatabase數(shù)據(jù)庫(kù)的名稱(chēng)。右擊新建要素集并為要素集設(shè)置投影坐標(biāo)系。右擊新建要素類(lèi),選擇要素類(lèi)型,并為要素命名,添加要素屬性字段“Name”等.這樣便建好了一個(gè)點(diǎn),線或面要素4、在ArcMap中編輯工作條上點(diǎn)擊開(kāi)始編輯,這時(shí)會(huì)彈出來(lái)一個(gè)窗口選擇要素,然后在已經(jīng)配準(zhǔn)后的圖像上選擇相應(yīng)的要素類(lèi)型一一繪制,右擊圖層控件上的某個(gè)要素圖層打開(kāi)屬性表可以編輯屬性。5、將矢量化好后的圖層導(dǎo)出為(*。mxd)文件。五、功能設(shè)計(jì)(流程圖)六、程序運(yùn)行界面介紹1、用戶(hù)登錄界面2、主程序界面3、屬性查詢(xún)界面4、三角網(wǎng)及泰森多邊形七、程序解析說(shuō)明1、用戶(hù)登錄界面程序解析說(shuō)明 用戶(hù)登錄設(shè)計(jì)思路:(1)用戶(hù)輸入用戶(hù)名和密碼,用戶(hù)名不能為空,密碼不能為空.(2)密碼在五分鐘之內(nèi)連續(xù)輸錯(cuò)三次,用戶(hù)名被鎖定,30分鐘后才能再次登錄。(3)若密碼輸錯(cuò)次數(shù)小于3次,則從最后一次輸錯(cuò)時(shí)刻算起,五分鐘之后用戶(hù)登錄錯(cuò)誤次數(shù)歸零。(4)用戶(hù)注冊(cè),數(shù)據(jù)庫(kù)中檢索此用戶(hù),若用戶(hù)存在則提示用戶(hù)名已存在,反之注冊(cè)成功,需重新登錄.重點(diǎn)代碼解析:使用參數(shù)化查詢(xún)避免注入漏洞攻擊,用戶(hù)信息存儲(chǔ)在SQLServer數(shù)據(jù)庫(kù)的T_User表中//只用來(lái)執(zhí)行查詢(xún)結(jié)果較少的sqlpublicstaticDataSetExecuteDataSet(stringsql,paramsSqlParameter[]parameters){using(SqlConnectionconn=newSqlConnection(ConStr)){conn。Open();using(SqlCommandcmd=conn。CreateCommand()){cmd.CommandText=sql;cmd。Parameters.AddRange(parameters);//SqlDataAdapter如同一個(gè)適配器,過(guò)渡橋梁的作用SqlDataAdapteradapter=newSqlDataAdapter(cmd);DataSetdataset=newDataSet();adapter。Fill(dataset);returndataset;}}}當(dāng)用戶(hù)輸錯(cuò)三次以上并且時(shí)間少于30分鐘時(shí)不允許登陸,TimeSpants=DateTime。Now-date;用于存儲(chǔ)間隔時(shí)間if(errortimes>=3){DateTimedate=(DateTime)row["Lock”];TimeSpants=DateTime.Now—date;if(ts。TotalMinutes<=30){MessageBox.Show(@"輸入錯(cuò)誤次數(shù)太多,用戶(hù)已被鎖定,請(qǐng)于30分鐘后再登陸,剩余時(shí)間"+(30-ts.TotalMinutes).ToString(”0”)+”分鐘”,"錯(cuò)誤提示”,MessageBoxButtons。OK,MessageBoxIcon。Error);return;}else{//輸錯(cuò)三次后30分鐘后更新ErorrTimes=0SqlHelper.NonQuery(@”UpdateT_UsersetErorrTimes=0whereId=@id",newSqlParameter("@id”,id));}}3、若密碼輸錯(cuò)次數(shù)小于3次,則從最后一次輸錯(cuò)時(shí)刻算起,五分鐘之后用戶(hù)登錄錯(cuò)誤次數(shù)歸零即UpdateT_UsersetErorrTimes=1whereId=@idTimeSpants=DateTime。Now—Convert。ToDateTime(date);if(ts。TotalMinutes〉5){SqlHelper.NonQuery(@"UpdateT_UsersetErorrTimes=1whereId=@id”,newSqlParameter("@id”,id));}2、屬性查詢(xún)程序解析說(shuō)明重點(diǎn)代碼解析:(1)進(jìn)入屬性查詢(xún)界面的代碼:通過(guò)AttributeQueryForm類(lèi)的構(gòu)造函數(shù)來(lái)存儲(chǔ)地圖的數(shù)據(jù)和綁定DataGridView的數(shù)據(jù)源AttributeQueryFormattributequery=newAttributeQueryForm(this。axMapControl1,this.dataGridView1);attributequery。ShowDialog();(2)從主程序axMapControl傳值過(guò)來(lái)的地圖數(shù)據(jù)存儲(chǔ)在privateAxMapControlmMapControl;并且在屬性查詢(xún)窗體的ComboBox組合控件cboLayer中添加各個(gè)圖層名//圖層名稱(chēng)加入cboLayerthis。cboLayer.Items。Add(strLayerName);通過(guò)get_Layer(cboLayer.SelectedIndex)獲取選中圖層,并將每個(gè)圖層的字段名顯示在名為cboField的ComboBox控件。strFldName=pFeatureClass。Fields。get_Field(i)。Name;//圖層名稱(chēng)加入cboFieldthis。cboField。Items.Add(strFldName);(3)屬性查詢(xún)中需要認(rèn)識(shí)學(xué)習(xí)接口的相關(guān)知識(shí),接口是一種規(guī)范、功能。在屬性查詢(xún)中我們需要用到IQueryFilter接口,該接口通過(guò)WhereClause屬性來(lái)獲取查詢(xún)數(shù)據(jù),類(lèi)似于SQL中的where語(yǔ)句。然后再通過(guò)圖層的Search方法基于查詢(xún)條件返回要素游標(biāo)pFeatureCursor。如下圖,pFeatureCursor指針一開(kāi)始指向第0層,每調(diào)用一下NextFeature()方法,指針就往下移動(dòng)一格直到指向null代碼示例://定義圖層,要素游標(biāo),查詢(xún)過(guò)濾器,要素IFeatureLayerpFeatureLayer;IFeatureCursorpFeatureCursor;IQueryFilterpQueryFilter;IFeatureSelectionpFeatureSelection;IActiveViewactiveview;IFeaturepFeature;//獲取圖層pFeatureLayer=this。mMapControl.Map.get_Layer(GetLayerindexbyName(cboLayer.Text))asIFeatureLayer;//如果圖層名稱(chēng)不是cboLayer.Text,程序退出if(pFeatureLayer。Name!=cboLayer.Text)return;//清除上次查詢(xún)結(jié)果this。mMapControl。Map。ClearSelection();activeview=this.mMapControl。MapasIActiveView;//pQueryFilter的實(shí)例化pQueryFilter=newQueryFilterClass();//設(shè)置查詢(xún)過(guò)濾條件pQueryFilter。WhereClause=””+cboField。Text+"=’”+txtValue。Text+”'”;//基于查詢(xún)條件創(chuàng)建指針并回收pFeatureCursor=pFeatureLayer。Search(pQueryFilter,true);//獲取查詢(xún)到的要素然后再調(diào)用DisplayToDataGridDAL類(lèi)中的方法,將查詢(xún)出來(lái)的要素字段值顯示在DataGridView中,DisplayToDataGridDAL類(lèi)是自己寫(xiě)的一個(gè)類(lèi)(代碼見(jiàn)附錄)代碼示例:DisplayToDataGridDAL.Dataview(pFeatureCursor,dataGrid,pFeatureLayer);高亮并居中顯示選中的要素:activeview.Extent=pFeature。Shape.Envelope;activeview。Refresh();3、自定義控件命令解析以下講述ArcEngine自定義開(kāi)發(fā)的一些控件命令,如居中放大,居中縮小,拉框放大,拉框縮小,漫游,顯示全圖等。基于BaseCommand的功能實(shí)現(xiàn)與Button的功能類(lèi)似,是當(dāng)鼠標(biāo)點(diǎn)擊按鈕的時(shí)候,MapControl控件會(huì)對(duì)其中的命令做出相應(yīng)響應(yīng)而無(wú)需額外的操作,如ArcMap中的居中放大FixedZoomIn,居中縮小FixedZoomOut,全圖FullExtent等。對(duì)于BaseTool來(lái)說(shuō),點(diǎn)擊該功能之后,只是開(kāi)啟一個(gè)交互的過(guò)程,需要用戶(hù)再用鼠標(biāo)、鍵盤(pán)等對(duì)地圖做進(jìn)一步交互式的操作,MapControl控件才會(huì)予以相應(yīng),如ArcMap中的拉框放大ZoomIn、拉框縮小ZoomOut、漫游Pan等.以FixedZoomIn為例,雙擊解決方案資源管理器中的FixedZoomIn。cs項(xiàng),進(jìn)入該類(lèi)的代碼編寫(xiě)界面。加入引用“ESRI。ArcGIS。Geometry",并在該類(lèi)的最上方添加如下代碼:publicoverridevoidOnClick(){//TODO:AddFixedZoomIn.OnClickimplementation//獲取當(dāng)前視圖范圍IActiveViewpActiveView=m_hookHelper.ActiveView;IEnvelopepEnvelope=pActiveView.Extent;//擴(kuò)大視圖范圍并刷新視圖pEnvelope.Expand(0.5,0。5,true);pActiveView.Extent=pEnvelope;pActiveView.Refresh();}在主程序代碼中還添加了一個(gè)全局變量mTool,以確定選擇的是哪個(gè)控件命令命令privatestringmTool;privatevoidmenuFixedZoomIn_Click(objectsender,EventArgse){//聲明與初始化FixedZoomInfixedZoomin=newFixedZoomIn();//與MapControl關(guān)聯(lián)fixedZoomin。OnCreate(this.axMapControl1.Object);fixedZoomin。OnClick();}4、三角網(wǎng)及泰森多邊形構(gòu)建解析首先在Form窗體上加一個(gè)PictureBox控件,在PictureBox的MouseDown事件下通過(guò)每次點(diǎn)擊獲取點(diǎn)的坐標(biāo)e。X,e。YprivatevoidpicMap_MouseDown(objectsender,MouseEventArgse){Graphicsg=((PictureBox)sender).CreateGraphics();g.FillEllipse(Brushes。Black,e.X,e.Y,5,5);Pointpt=newPoint(e.X,e.Y);myPoints。Add(pt);g。Dispose();} 三角網(wǎng)的構(gòu)建采用逐點(diǎn)插入法,首先對(duì)在鼠標(biāo)單擊事件下獲取的點(diǎn)集進(jìn)行排序,排序時(shí)X坐標(biāo)從小到大排列,若X坐標(biāo)相同則Y坐標(biāo)從小到大排列。構(gòu)建一個(gè)可以包含所有點(diǎn)集的超級(jí)三角形,并將超級(jí)三角形的三個(gè)頂點(diǎn)存入Triangle表中。從點(diǎn)集中取點(diǎn)判斷點(diǎn)是否在三角形內(nèi),若點(diǎn)在三角形內(nèi),則將該三角形三邊存入邊列表中,若并從三角形列表中刪除該三角形,如此循環(huán),遍歷點(diǎn)集里所有的點(diǎn)。最后刪除與超級(jí)三角形有共同頂點(diǎn)的三角形及凹邊界處三角形重點(diǎn)代碼示例:if(myPoints.Count〈=0)return;else//對(duì)點(diǎn)集進(jìn)行排序,先按X坐標(biāo)從大到小排序//X坐標(biāo)相同的按Y坐標(biāo)從大到小排序myPoints=SortPoints(myPoints);//獲得超級(jí)三角形SuperTriangle(myPoints);inti=0;while(i〈myPoints。Count){Pointpt=myPoints[i];List〈List〈Point>>edjest=newList〈List〈Point〉>();intj=0;while(triangle.Count!=0&&triangle.Count-1>=j){boolflag=true;List〈object〉mycircle=Circle(triangle,j);Pointcenter=(Point)mycircle[0];doubleradius=(double)mycircle[1];if(pt.X〉(center。X+radius)){flag=true;}elseif(Inside(pt,mycircle)){//edjest=Addnew(traingle,j);List<List<Point〉>ed=Addnew(triangle,j);edjest.Add(ed[0]);edjest.Add(ed[1]);edjest.Add(ed[2]);triangle。RemoveAt(j);flag=false;}if(flag)j++;}//刪除重復(fù)的邊edjest=Delete(edjest);triangle=NewTriangle(pt,edjest);i++;}//刪除以超級(jí)三角形頂點(diǎn)為頂點(diǎn)的三角形triangle=SuperDelete(supertriangle);//刪除凹邊界處三角形triangle=TraingleDelete();using(Graphicsg=this.picMap.CreateGraphics()){for(intj=0;j〈triangle。Count;j++){Point[]myPoint=newPoint[3];myPoint[0]=(Point)triangle[j][0];myPoint[1]=(Point)triangle[j][1];myPoint[2]=(Point)triangle[j][2];g。DrawPolygon(newPen(Brushes。Red,3),myPoint);}}構(gòu)建泰森多邊形需要構(gòu)建三角網(wǎng)。找出每個(gè)離散點(diǎn)周?chē)娜切渭匆栽撾x散點(diǎn)為共同頂點(diǎn)的三角形,按逆時(shí)針排列起來(lái)以便下一步生成泰森多邊形,連接該離散點(diǎn)周?chē)切蔚耐饨訄A的圓心。三角網(wǎng)邊界處的泰森多邊形可做垂直平分線與圖廓相交,與圖廓一起形成泰森多邊形.(代碼見(jiàn)附錄)重點(diǎn)代碼示例://使三角形三個(gè)點(diǎn)坐標(biāo)都按逆時(shí)針?lè)较虼鎯?chǔ)triangle=Thiessen。SortTraingle(triangle);//存儲(chǔ)三角網(wǎng)所有三角形的邊Thiessen.Edge(triangle);//構(gòu)成邊界的邊集合Thiessen。BorderEdge(Thiessen.allEdge);//尋找以邊界點(diǎn)為頂點(diǎn)的三角形集合Thiessen.BorderTriangle(Thiessen.borderEdge,triangle);//除邊界點(diǎn)外其他離散點(diǎn)Thiessen。CenterPoint(myPoints,Thiessen.borderEdge);//除邊界點(diǎn)外其他離散點(diǎn)構(gòu)成的泰森多邊形集合Thiessen。ThiessenEdge(triangle,Thiessen。centerpoint);//邊界離散點(diǎn)構(gòu)成的泰森多邊形集合Thiessen.MyBorderTheissen(Thiessen。borderEdge,Thiessen.myBorderTriangle);using(Graphicsg=this.picMap.CreateGraphics()){//繪制除邊界點(diǎn)外其他離散點(diǎn)構(gòu)成的泰森多邊形集合for(inti=0;i〈Thiessen.myTheissen。Count;i++){g.DrawPolygon(newPen(Brushes.Black,3),Thiessen。myTheissen[i].ToArray());}//繪制邊界離散點(diǎn)構(gòu)成的泰森多邊形集合for(inti=0;i<Thiessen。myBorderTheissen.Count;i++){g.DrawPolygon(newPen(Brushes.Black,3),Thiessen。myBorderTheissen[i].ToArray());}}八、源代碼附錄1、用戶(hù)登錄源碼usingSystem;usingSystem.Collections.Generic;usingSystem。ComponentModel;usingSystem。Data;usingSystem.Drawing;usingSystem.Linq;usingSystem。Text;usingSystem.Windows.Forms;usingSystem.Data。SqlClient;namespaceMyMap{publicpartialclassLoginWindow:Form{publicLoginWindow(){InitializeComponent();}privatevoidbtnLogin_Click(objectsender,EventArgse){if(txtUserName.Text.Length<=0){MessageBox.Show("請(qǐng)輸入用戶(hù)名");return;}if(txtpwdPassword。Text。Length<=0){MessageBox.Show("請(qǐng)輸入密碼!");return;}DataSetds=SqlHelper.ExecuteDataSet(@"select*fromT_UserwhereUserName=@Name”,newSqlParameter("@Name",txtUserName.Text));if(ds.Tables[0]。Rows.Count<=0){MessageBox.Show("用戶(hù)不存在!");return;}if(ds.Tables[0].Rows.Count>1){thrownewException(”不好啦!重復(fù)了!”);}DataRowrow=ds.Tables[0]。Rows[0];stringpassword=(string)row["PassWord”];longid=(long)row["Id"];interrortimes=(int)row[”ErorrTimes”];//錯(cuò)誤次數(shù)大于3時(shí)//防御性編程if(errortimes〉=3){DateTimedate=(DateTime)row[”Lock”];TimeSpants=DateTime.Now—date;if(ts.TotalMinutes<=30){MessageBox.Show(@"輸入錯(cuò)誤次數(shù)太多,用戶(hù)已被鎖定,請(qǐng)于30分鐘后再登陸,剩余時(shí)間”+(30—ts。TotalMinutes).ToString("0”)+"分鐘",”錯(cuò)誤提示",MessageBoxButtons。OK,MessageBoxIcon.Error);return;}else{//輸錯(cuò)三次后30分鐘后更新ErorrTimes=0SqlHelper.NonQuery(@”UpdateT_UsersetErorrTimes=0whereId=@id",newSqlParameter("@id”,id));}}if(password==txtpwdPassword.Text){DialogResultresult=MessageBox。Show(”歡迎您登陸!","用戶(hù)登錄",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);this。Hide();if(result==DialogResult.OK){MapWindowmw=newMapWindow();DialogResultmapresult=mw。ShowDialog();if(mapresult==DialogResult.Cancel){Application.Exit();}}else{Application。Exit();}}else{MessageBox.Show(”密碼錯(cuò)誤!”);SqlHelper.NonQuery(@”UpdateT_UsersetErorrTimes=ErorrTimes+1,Lock=GETDATE()whereId=@id",newSqlParameter("@id”,id));objectdate=row["Lock”];if(date==DBNull.Value){date=DateTime。Now;}TimeSpants=DateTime.Now-Convert。ToDateTime(date);if(ts。TotalMinutes>5){SqlHelper。NonQuery(@”UpdateT_UsersetErorrTimes=1whereId=@id",newSqlParameter("@id”,id));}return;}}privatevoidbtnCancel_Click(objectsender,EventArgse){this.Close();}privatevoidbtnRegister_Click(objectsender,EventArgse){DataSetds=SqlHelper.ExecuteDataSet(@"select*fromT_UserwhereUserName=@Name",newSqlParameter("@Name",txtUserName。Text));if(ds。Tables[0]。Rows.Count>=1){//thrownewException(”不好啦!重復(fù)了!”);MessageBox。Show("用戶(hù)名已存在,請(qǐng)重新輸入用戶(hù)名注冊(cè)”);return;}if(txtUserName.Text.Length〈=0){MessageBox。Show("用戶(hù)名不能為空!”);return;}if(txtpwdPassword。Text.Length<=0){MessageBox。Show("密碼不能為空!”);return;}SqlHelper.NonQuery(@"insertintoT_User(UserName,PassWord,ErorrTimes)Values(’"+txtUserName.Text+”’,'”+txtpwdPassword.Text+”’,0)");MessageBox。Show("恭喜”+txtUserName。Text+”注冊(cè)成功!請(qǐng)重新登錄","注冊(cè)”);txtUserName.Text="";txtpwdPassword。Text=”";}}}2、屬性查詢(xún)?cè)创ausingSystem;usingSystem.Collections。Generic;usingSystem。ComponentModel;usingSystem。Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingESRI。ArcGIS。Controls;usingESRI。ArcGIS。Carto;usingESRI。ArcGIS。Geodatabase;usingESRI.ArcGIS。Display;namespaceMyMap{publicpartialclassAttributeQueryForm:Form{//存儲(chǔ)地圖數(shù)據(jù)privateAxMapControlmMapControl;privateDataGridViewdataGrid;//存儲(chǔ)當(dāng)前選中圖層,IFeatureLayer繼承自ILayerprivateIFeatureLayermFeatureLayer;//通過(guò)構(gòu)造函數(shù)來(lái)傳值publicAttributeQueryForm(AxMapControlmapcontrol,DataGridViewdataGridView){InitializeComponent();this。mMapControl=mapcontrol;this。dataGrid=dataGridView;}publicAttributeQueryForm(){}privateintGetLayerindexbyName(stringcbolayername){inti;for(i=0;i<mMapControl.LayerCount;i++){if(cbolayername==mMapControl。get_Layer(i)。Name)break;}returni;}privatevoidbtnOk_Click(objectsender,EventArgse){if(txtValue.Text==”"){MessageBox。Show("請(qǐng)輸入您要查詢(xún)什么");return;}//定義圖層,要素游標(biāo),查詢(xún)過(guò)濾器,要素IFeatureLayerpFeatureLayer;IFeatureCursorpFeatureCursor;IQueryFilterpQueryFilter;IFeatureSelectionpFeatureSelection;IActiveViewactiveview;IFeaturepFeature;//獲取圖層pFeatureLayer=this.mMapControl。Map.get_Layer(GetLayerindexbyName(cboLayer。Text))asIFeatureLayer;//如果圖層名稱(chēng)不是cboLayer.Text,程序退出if(pFeatureLayer。Name!=cboLayer.Text)return;//清除上次查詢(xún)結(jié)果this.mMapControl。Map。ClearSelection();activeview=this。mMapControl.MapasIActiveView;//IFeatureClasspFeatureClass=pFeatureLayer。FeatureClass;//pQueryFilter的實(shí)例化pQueryFilter=newQueryFilterClass();//設(shè)置查詢(xún)過(guò)濾條件pQueryFilter.WhereClause=""+cboField.Text+"=’”+txtValue.Text+”’";//基于查詢(xún)條件創(chuàng)建指針并回收pFeatureCursor=pFeatureLayer。Search(pQueryFilter,true);//獲取查詢(xún)到的要素pFeature=DisplayToDataGridDAL.GetFeature(pFeatureCursor);//獲取查詢(xún)到的要素pFeatureSelection=pFeatureLayerasIFeatureSelection;//根據(jù)查詢(xún)條件選擇要素pFeatureSelection.SelectFeatures(pQueryFilter,esriSelectionResultEnum.esriSelectionResultNew,false);//QI到ISelectionSetISelectionSetpSelectionSet=pFeatureSelection.SelectionSet;//判斷是否獲取到要素if(pFeature!=null){//Theselectionsetthatdefinesthesubsetoffeaturesinaselectionlayer.//ISelectionSetDefinitionSelectionSet{get;}只讀屬性IFeatureLayerDefinitionpFDefinition=pFeatureLayerasIFeatureLayerDefinition;//創(chuàng)建新圖層IFeatureLayerpNewFeatureLayer=pFDefinition。CreateSelectionLayer("newlayerName”,true,null,null);pNewFeatureLayer。Name=”查詢(xún)結(jié)果”;mMapControl。AddLayer(pNewFeatureLayerasILayer);//獲取最小外包矩形并放大到當(dāng)前視圖范圍activeview。Extent=pFeature.Shape.Envelope;activeview。Refresh();}else{//沒(méi)有得到pFeature的提示MessageBox。Show(”沒(méi)有找到"+txtValue。Text,”提示”);return;}//把查詢(xún)到的要素的屬性顯示到DataGridView中DisplayToDataGridDAL。Dataview(pFeatureCursor,dataGrid,pFeatureLayer);this.mMapControl.DeleteLayer(0);this。mMapControl.Refresh();}privatevoidAttributeQueryForm_Load(objectsender,EventArgse){//MapControl中沒(méi)有圖層時(shí)返回if(this。mMapControl.LayerCount〈=0)return;//獲取MapControl中的全部圖層名稱(chēng),并加入ComboBox//圖層ILayerpLayer;//圖層名稱(chēng)stringstrLayerName;for(inti=0;i<this。mMapControl。LayerCount;i++){pLayer=this.mMapControl.get_Layer(i);strLayerName=pLayer。Name;//圖層名稱(chēng)加入cboLayerthis。cboLayer。Items.Add(strLayerName);}//默認(rèn)顯示第一個(gè)選項(xiàng)this.cboLayer.SelectedIndex=0;}privatevoidcboLayer_SelectedIndexChanged(objectsender,EventArgse){this.cboField。Items。Clear();//獲取cboLayer中選中的圖層mFeatureLayer=mMapControl。get_Layer(cboLayer。SelectedIndex)asIFeatureLayer;//要素集合IFeatureClasspFeatureClass=mFeatureLayer.FeatureClass;//字段名稱(chēng)stringstrFldName;for(inti=0;i<pFeatureClass。Fields。FieldCount;i++){strFldName=pFeatureClass。Fields。get_Field(i).Name;//圖層名稱(chēng)加入cboFieldthis.cboField。Items。Add(strFldName);}//默認(rèn)顯示第一個(gè)選項(xiàng)this.cboField。SelectedIndex=0;}privatevoidbtnCancel_Click(objectsender,EventArgse){this.Close();}}}3、DisplayToDataGridDAL類(lèi)源碼classDisplayToDataGridDAL{privatestaticIFeaturepFeature;///<summary>///返回游標(biāo)所指向的第一個(gè)元素///</summary〉///<paramname="pFeatureCursor"></param>///〈returns>〈/returns>publicstaticIFeatureGetFeature(IFeatureCursorpFeatureCursor){returnpFeature=pFeatureCursor。NextFeature();}///〈summary>///獲取圖層類(lèi)型///〈/summary>///<paramname=”pLayer”></param〉///〈returns>〈/returns>publicstaticstringgetShapeType(IFeatureLayerpFeatureLayer){switch(pFeatureLayer.FeatureClass.ShapeType){caseesriGeometryType.esriGeometryPoint:return"Point”;caseesriGeometryType.esriGeometryPolyline:return"Polyline";caseesriGeometryType.esriGeometryPolygon:return"Polygon";default:return"”;}}///〈summary〉///獲取查詢(xún)過(guò)濾后的游標(biāo),將查詢(xún)到的要素的屬性填充到DataGridView///〈/summary>///〈paramname="pFeatureCursor"〉</param>///〈paramname=”datagridview">〈/param〉publicstaticvoidDataview(IFeatureCursorpFeatureCursor,DataGridViewdatagridview,IFeatureLayerpFeatureLayer){DataSetds=newDataSet();DataTabletable=newDataTable(”MyTable");stringshapetype=getShapeType(pFeatureLayer);for(inti=0;i〈pFeatureCursor。Fields。FieldCount;i++){//創(chuàng)建表頭table.Columns.Add(pFeatureCursor.Fields.get_Field(i)。Name);}while(pFeature!=null){DataRowrow=table.NewRow();for(inti=0;i〈pFeature。Fields。FieldCount;i++){//如果字段類(lèi)型是幾何類(lèi)型esriFieldTypeGeometry,則字段值為shapetype//反之為get_Value()if(pFeature。Fields。get_Field(i).Type==esriFieldType。esriFieldTypeGeometry){row[i]=shapetype;}else{row[i]=pFeature.get_Value(i).ToString();}}table。Rows。Add(row);//游標(biāo)向下移動(dòng)一個(gè)要素,指向下一個(gè)要素pFeature=pFeatureCursor。NextFeature();}ds。Tables。Add(table);//datagridview綁定數(shù)據(jù)源datagridview。DataSource=ds.Tables["MyTable”];}}4、FixedZoomIn類(lèi)源碼usingSystem;usingSystem。Drawing;usingSystem.Runtime。InteropServices;usingESRI。ArcGIS。ADF。BaseClasses;usingESRI.ArcGIS。ADF。CATIDs;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geometry;namespaceMyMap。Classes{[Guid("d122d92b-6229-4116—ab3e-a45b1d3d05bc")][ClassInterface(ClassInterfaceType.None)][ProgId(”MyMap。Classes.FixedZoomIn")]publicsealedclassFixedZoomIn:BaseCommand{#regionCOMRegistrationFunction(s)[ComRegisterFunction()][ComVisible(false)]staticvoidRegisterFunction(TyperegisterType){//RequiredforArcGISComponentCategoryRegistrarsupportArcGISCategoryRegistration(registerType);}[ComUnregisterFunction()][ComVisible(false)]staticvoidUnregisterFunction(TyperegisterType){//RequiredforArcGISComponentCategoryRegistrarsupportArcGISCategoryUnregistration(registerType);}#regionArcGISComponentCategoryRegistrargeneratedcodeprivatestaticvoidArcGISCategoryRegistration(TyperegisterType){stringregKey=string。Format(”HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}",registerType.GUID);ControlsCommands.Register(regKe
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版供水用不銹鋼水箱購(gòu)銷(xiāo)合同2篇
- 機(jī)械課程設(shè)計(jì)干啥的啊
- 智能核儀器基礎(chǔ)課程設(shè)計(jì)
- 稅收法制教育課程設(shè)計(jì)
- 編曲音樂(lè)創(chuàng)作課程設(shè)計(jì)
- 羽毛球上課課程設(shè)計(jì)
- 機(jī)械設(shè)計(jì)課程設(shè)計(jì)記錄
- 聯(lián)接軸課程設(shè)計(jì)
- 網(wǎng)站前段課課程設(shè)計(jì)
- 自動(dòng)掃地機(jī)課程設(shè)計(jì)
- 《輔酶q10》教學(xué)講解課件
- SMT工程師工作簡(jiǎn)歷
- 北京市海淀區(qū)2022-2023學(xué)年七年級(jí)上學(xué)期期末語(yǔ)文試題(含答案)
- 心血管內(nèi)科醫(yī)生成長(zhǎng)手冊(cè)
- 國(guó)家開(kāi)放大學(xué)一網(wǎng)一平臺(tái)電大《當(dāng)代中國(guó)政治制度》形考任務(wù)1-4網(wǎng)考題庫(kù)及答案
- 小企業(yè)會(huì)計(jì)準(zhǔn)則財(cái)務(wù)報(bào)表
- 資產(chǎn)損失鑒證報(bào)告(范本)
- 農(nóng)學(xué)技能高考【種植類(lèi)】復(fù)習(xí)題庫(kù)大全-2、《植物生產(chǎn)與環(huán)境》-上(單選多選題)
- 隧道貫通方案貫通計(jì)算
- GB/T 21010-2017土地利用現(xiàn)狀分類(lèi)
- GB/T 15532-2008計(jì)算機(jī)軟件測(cè)試規(guī)范
評(píng)論
0/150
提交評(píng)論