第五届全国大学生GIS应用技能大赛开发题答案(非官方)
生活随笔
收集整理的這篇文章主要介紹了
第五届全国大学生GIS应用技能大赛开发题答案(非官方)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第五屆全國大學生GIS應用技能大賽開發題答案(非官方)
題目:
根據你的解決方案,開發一個應用型GIS系統,該系統需要具備以下功能:
a. 打開地圖文檔功能(地圖文檔位于AirQuality文件夾下)。(3分)
b. 退出程序并保存地圖文檔功能。(3分)
c. 在地圖上點擊,選擇一個監測站點,并顯示該監測站點的屬性信息。(3分)
d. 在監測站點列表中選擇一個監測站點后,在地圖上高亮顯示,縮放至該監測站點,并顯示該監測站點的屬性信息。(3分)
e. 在地圖上選擇一個多邊形,統計該多邊形內部的監測站點內數量,并高亮顯示。(3分)
f. 將Excel中的數據匹配到監測站點。(3分)
g. 在地圖上顯示北京各個區縣的名稱。(3分)
h. 為北京各個區縣匹配一個符號。(3分)
i. 導出北京區縣圖層為一個新的數據。(3分)
j. 在監測站點圖層添加一個新站點。(5分)
答案:
主窗體界面:
界面詳情請查看:https://blog.csdn.net/H48662654/article/details/102980068
主窗體代碼:
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.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.DataSourcesFile; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.DataSourcesOleDB; using ESRI.ArcGIS.DataSourcesRaster; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Output; using ESRI.ArcGIS.SystemUI; using System.Data.OleDb;namespace Ex1 {public partial class Form1 : Form{public Form1(){ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);InitializeComponent();axTOCControl1.SetBuddyControl(axMapControl1);}#region 輸入輸出模塊//文件路徑 string path = null;private void 打開文檔ToolStripMenuItem_Click(object sender, EventArgs e){openFileDialog1.Title = "打開文件";openFileDialog1.Filter = "ArcMap Document(*.mxd)|*.mxd";openFileDialog1.Multiselect = false;if (openFileDialog1.ShowDialog() == DialogResult.OK){path = openFileDialog1.FileName;axMapControl1.LoadMxFile(path);}}private void 保存文檔ToolStripMenuItem_Click(object sender, EventArgs e){IMxdContents content = axMapControl1.Map as IMxdContents;IMapDocument mapDocumnet = new MapDocumentClass();mapDocumnet.Open(path);mapDocumnet.ReplaceContents(content);mapDocumnet.Save();MessageBox.Show("文檔已保存");}private void Form1_FormClosing(object sender, FormClosingEventArgs e){//窗體關閉自動保存保存文檔ToolStripMenuItem_Click(sender, e);}private void 導出圖層ToolStripMenuItem_Click(object sender, EventArgs e){//導出北京區縣圖層為Shapefile文件saveFileDialog1.Title = "導出圖層";saveFileDialog1.Filter = "LayerFile(*.lyr)|*.lyr";if (saveFileDialog1.ShowDialog() == DialogResult.OK){ILayerFile layerFile = new LayerFileClass();layerFile.New(saveFileDialog1.FileName);ILayer layer = axMapControl1.get_Layer(1);layerFile.ReplaceContents(layer);layerFile.Save();MessageBox.Show("保存成功");}}#endregion#region 屬性查詢模塊//點擊站點顯示屬性表private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e){axMapControl1.Map.ClearSelection();//在地圖上點擊 點作緩沖分析,即對該點進行擴大 方便接下來的空間查詢IPoint pt = new PointClass();pt = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);ITopologicalOperator topo = pt as ITopologicalOperator;IGeometry buffer = topo.Buffer(0.01) as IGeometry;//在檢測站點圖層上進行空間查詢IFeatureLayer layer = axMapControl1.get_Layer(0) as IFeatureLayer;IFeatureSelection featureSelection = layer as IFeatureSelection;ISpatialFilter filter = new SpatialFilterClass();//查詢集合體設為緩沖點filter.Geometry = buffer;filter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;//高亮顯示featureSelection.SelectFeatures(filter, esriSelectionResultEnum.esriSelectionResultNew, true);axMapControl1.Refresh();ISelectionSet set = featureSelection.SelectionSet;//將查詢屬性的ID值作為屬性表的構造函數IEnumIDs ids = set.IDs;//顯示屬性表屬性表 table = new 屬性表(ids,layer);table.Show();}private void 開啟狀態ToolStripMenuItem_Click(object sender, EventArgs e){axMapControl1.OnMouseDown += axMapControl1_OnMouseDown;}private void 關閉狀態ToolStripMenuItem_Click(object sender, EventArgs e){axMapControl1.OnMouseDown -= axMapControl1_OnMouseDown;}//在屬性表中選擇站點縮放到對應站點private void 打開監測站列表ToolStripMenuItem_Click(object sender, EventArgs e){ //根據情況調用不同的構造函數IFeatureLayer layer = axMapControl1.get_Layer(0) as IFeatureLayer;屬性表 table = new 屬性表(layer,axMapControl1.ActiveView);table.Show();}//在地圖上畫多邊形統計數量private void draw(object sender, IMapControlEvents2_OnMouseDownEvent e){axMapControl1.Map.ClearSelection();IFeatureLayer layer = axMapControl1.get_Layer(0) as IFeatureLayer;IFeatureSelection featureSelection = layer as IFeatureSelection;ISpatialFilter spatialFilter = new SpatialFilterClass();//設置空間查詢條件為相交spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;//查詢幾何體為從地圖上獲取的多邊形spatialFilter.Geometry = axMapControl1.TrackPolygon();//高亮選擇featureSelection.SelectFeatures(spatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false);ISelectionSet set = featureSelection.SelectionSet;axMapControl1.Refresh();IEnumIDs ids = set.IDs;int id = ids.Next();int n = 0;//通過ID統計個數while(id !=-1){n++;id = ids.Next();}MessageBox.Show("該區域共有" + n + "個檢測站");}private void 開啟狀態ToolStripMenuItem1_Click(object sender, EventArgs e){axMapControl1.OnMouseDown += draw;}private void 關閉狀態ToolStripMenuItem1_Click(object sender, EventArgs e){axMapControl1.OnMouseDown -= draw;}//Excel數據匹配到站點private void excel數據匹配站點ToolStripMenuItem_Click(object sender, EventArgs e){openFileDialog1.Title = "打開Excel表";openFileDialog1.Filter = "Excel2003(*.xls)|*.xls";if (openFileDialog1.ShowDialog() == DialogResult.OK){//Excel路徑string path = openFileDialog1.FileName;//數據庫連接字符串string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + path + ";" + "Extended Properties='Excel 4.0;HDR=NO;IMEX=1';";//表名string sheetName = "Sheet1";//選擇語句string select = "Select * from [" + sheetName + "$]";//創建連接OleDbConnection conn = new OleDbConnection(strConn);//開啟連接conn.Open();//創建適配器OleDbDataAdapter adapter = new OleDbDataAdapter(select, strConn);DataTable dt = new DataTable();//填充數據adapter.Fill(dt);//關閉連接conn.Close();//顯示屬性表屬性表 table = new 屬性表(dt, axMapControl1.get_Layer(0) as IFeatureLayer);table.Show();}}#endregion#region 畫圖//顯示區縣名稱private void 區縣名稱ToolStripMenuItem_Click(object sender, EventArgs e){IFeatureLayer layer = axMapControl1.get_Layer(1) as IFeatureLayer;IFeatureCursor cursor = layer.FeatureClass.Search(null, true);IFeature feature = cursor.NextFeature();while(feature != null){IPoint pt = new PointClass();IGeometry geo = feature.Shape;IGeometry5 geo5 = geo as IGeometry5;//以要素中心的位置作為名稱文本顯示的位置pt.X = geo5.CentroidEx.X;pt.Y = geo5.CentroidEx.Y;ITextElement ele = new TextElementClass();ele.Symbol = new TextSymbol();//獲取值ele.Text = feature.get_Value(feature.Fields.FindField("Name")).ToString();IElement elem = ele as IElement;elem.Geometry = pt;IGraphicsContainer gra = axMapControl1.ActiveView.FocusMap as IGraphicsContainer;gra.AddElement(elem,0);feature = cursor.NextFeature();}axMapControl1.Refresh();}//為每個區縣匹配唯一的符號//創建隨機顏色 參數為隨機數種子 確保唯一private IColor CreateRandomColor(int i){Random ran = new Random(i);IRgbColor color = new RgbColorClass();color.Red = ran.Next(256);color.Green = ran.Next(256);color.Blue = ran.Next(256);return color;}private void 匹配符號ToolStripMenuItem_Click(object sender, EventArgs e){//唯一值渲染器IUniqueValueRenderer renderer = new UniqueValueRendererClass();//設置用與渲染的字段數目 最多3個 renderer.FieldCount = 1;//設置字段renderer.set_Field(0, "FID");IFeatureLayer layer = axMapControl1.get_Layer(1) as IFeatureLayer;IFeatureCursor cursor = layer.FeatureClass.Search(null, true);IFeature feature =cursor.NextFeature();while (feature != null){//獲取要素的FID 充當隨機數種子int i = Convert.ToInt16(feature.get_Value(0).ToString());//獲取FID值 充當渲染值string value = feature.get_Value(feature.Fields.FindField("FID")).ToString();ISimpleFillSymbol symbol = new SimpleFillSymbolClass();symbol.Color = CreateRandomColor(i);symbol.Style = esriSimpleFillStyle.esriSFSSolid;//添加值renderer.AddValue(value, "FID", symbol as ISymbol);feature = cursor.NextFeature();}IGeoFeatureLayer geoLayer = layer as IGeoFeatureLayer;geoLayer.Renderer = renderer as IFeatureRenderer;axMapControl1.Refresh();}//添加點private void add(object sender, IMapControlEvents2_OnMouseDownEvent e){IFeatureLayer layer = axMapControl1.get_Layer(0) as IFeatureLayer;IPoint pt = new PointClass();pt = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);IFeature feature = layer.FeatureClass.CreateFeature();feature.Shape = pt;feature.Store();axMapControl1.Refresh();}private void 開啟狀態ToolStripMenuItem2_Click(object sender, EventArgs e){axMapControl1.OnMouseDown += add;}private void 關閉狀態ToolStripMenuItem2_Click(object sender, EventArgs e){axMapControl1.OnMouseDown -= add;}#endregion } }屬性表窗體界面:
屬性表窗體代碼:
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.Geodatabase; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geometry;namespace Ex1 {public partial class 屬性表 : Form{IEnumIDs ids = null;IFeatureLayer layer = null;IActiveView act = null;DataTable dataTable = null;//不同的構造函數對應不同要求public 屬性表(IEnumIDs ids,IFeatureLayer layer){InitializeComponent();this.ids = ids;this.layer = layer;}public 屬性表(IFeatureLayer layer,IActiveView act){InitializeComponent();this.layer = layer;this.act = act;}public 屬性表(DataTable dt, IFeatureLayer layer){InitializeComponent();this.dataTable = dt;this.layer = layer;}private void 屬性表_Load(object sender, EventArgs e){if (ids != null){IFeatureClass featureClass = layer.FeatureClass;int id = ids.Next();DataTable dt = new DataTable();DataColumn dc;//每個字段一列for (int i = 0; i < featureClass.Fields.FieldCount; i++){dc = new DataColumn(featureClass.Fields.get_Field(i).Name);dt.Columns.Add(dc);}DataRow dr = dt.NewRow();//循環添加數據行while (id != -1){IFeature feature = featureClass.GetFeature(id);for (int i = 0; i < featureClass.Fields.FieldCount; i++){//Shapez字段單獨賦值if (feature.Fields.get_Field(i).Name.Equals("Shape")){switch (feature.Shape.GeometryType){case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint:dr[i] = "Point";break;case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:dr[i] = "Polygon";break;case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:dr[i] = "Polyline";break;default:dr[i] = "Other";break;}continue;}dr[i] = feature.get_Value(i).ToString();}dt.Rows.Add(dr);dataGridView1.DataSource = dt;}}else if (dataTable != null)//匹配Excel數據到檢測站點{IFeatureClass featureClass = layer.FeatureClass;//添加Excel中字段,防止重復添加if (featureClass.Fields.FieldCount < 6){//PM2.5字段IFieldEdit edit = new FieldClass();edit.AliasName_2 = "PM2.5";edit.Name_2 = "PM2.5";edit.Type_2 = esriFieldType.esriFieldTypeString;edit.Length_2 = 100;featureClass.AddField(edit);//SO2字段IFieldEdit edit2 = new FieldClass();edit2.Type_2 = esriFieldType.esriFieldTypeInteger;edit2.AliasName_2 = "SO2";edit2.Name_2 = "SO2";featureClass.AddField(edit2);//NO2字段IFieldEdit edit3 = new FieldClass();edit3.AliasName_2 = "NO2";edit3.Name_2 = "NO2";edit3.Type_2 = esriFieldType.esriFieldTypeInteger;featureClass.AddField(edit3);}//創建屬性表類似上一步 這里有代碼冗余的缺點 是為了方便理解IFeatureCursor cursor = featureClass.Search(null, true);IFeature feature = cursor.NextFeature();DataTable dt = new DataTable();DataColumn dc;for (int i = 0; i < featureClass.Fields.FieldCount; i++){dc = new DataColumn(featureClass.Fields.get_Field(i).Name);dt.Columns.Add(dc);}int j = 1;while (feature != null){DataRow dr = dt.NewRow();for (int i = 0; i < featureClass.Fields.FieldCount; i++){if (i < featureClass.Fields.FieldCount - 3){if (feature.Fields.get_Field(i).Name.Equals("Shape")){switch (feature.Shape.GeometryType){case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint:dr[i] = "Point";break;case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:dr[i] = "Polygon";break;case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:dr[i] = "Polyline";break;default:dr[i] = "Other";break;}continue;}dr[i] = feature.get_Value(i).ToString();}else{dr[i] = dataTable.Rows[j].ItemArray[i - 1];}}dt.Rows.Add(dr);feature = cursor.NextFeature();j++;}dataGridView1.DataSource = dt;}else{//類似IFeatureCursor cursor = layer.FeatureClass.Search(null, true);IFeature feature = cursor.NextFeature();DataTable dt = new DataTable();DataColumn dc;for (int i = 0; i < layer.FeatureClass.Fields.FieldCount; i++){dc = new DataColumn(layer.FeatureClass.Fields.get_Field(i).Name);dt.Columns.Add(dc);}while (feature != null){DataRow dr = dt.NewRow();for (int i = 0; i < layer.FeatureClass.Fields.FieldCount; i++){if (feature.Fields.get_Field(i).Name.Equals("Shape")){switch (feature.Shape.GeometryType){case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint:dr[i] = "Point";break;case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:dr[i] = "Polygon";break;case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:dr[i] = "Polyline";break;default:dr[i] = "Other";break;}continue;}dr[i] = feature.get_Value(i).ToString();}dt.Rows.Add(dr);feature = cursor.NextFeature();}dataGridView1.DataSource = dt;}}//雙擊要素屬性表行號放縮至該要素區域private void dataGridView1_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e){act.FocusMap.ClearSelection();//獲取行號int i = e.RowIndex;//根據行號獲取要素IFeature feature = layer.FeatureClass.GetFeature(i);IPoint pt = new PointClass();IGeometry geo = feature.Shape;IGeometry5 geo5 = geo as IGeometry5;//獲取該要素的中心點坐標pt.X = geo5.CentroidEx.X;pt.Y = geo5.CentroidEx.Y;IEnvelope env = new EnvelopeClass();//以該坐標為基礎創建包絡線env.XMax = pt.X + 0.01;env.XMin = pt.X - 0.01;env.YMax = pt.Y + 0.01;env.YMin = pt.Y - 0.01;env.CenterAt(pt);env.Expand(0.01, 0.01, false);//將地圖的顯示區域設置為創建的包絡線 即放縮至該要素act.Extent = env;//同時高亮act.FocusMap.SelectByShape(pt as IGeometry, null, true);act.Refresh();}} }//雙擊要素屬性表行號放縮至該要素區域private void dataGridView1_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e){act.FocusMap.ClearSelection();//獲取行號int i = e.RowIndex;//根據行號獲取要素IFeature feature = layer.FeatureClass.GetFeature(i);IPoint pt = new PointClass();IGeometry geo = feature.Shape;IGeometry5 geo5 = geo as IGeometry5;//獲取該要素的中心點坐標pt.X = geo5.CentroidEx.X;pt.Y = geo5.CentroidEx.Y;IEnvelope env = new EnvelopeClass();//以該坐標為基礎創建包絡線env.XMax = pt.X + 0.01;env.XMin = pt.X - 0.01;env.YMax = pt.Y + 0.01;env.YMin = pt.Y - 0.01;env.CenterAt(pt);env.Expand(0.01, 0.01, false);//將地圖的顯示區域設置為創建的包絡線 即放縮至該要素act.Extent = env;//同時高亮act.FocusMap.SelectByShape(pt as IGeometry, null, true);act.Refresh();}} }歷屆GIS應用技能大賽開發題答案點這里,尚在不定期更新中
總結
以上是生活随笔為你收集整理的第五届全国大学生GIS应用技能大赛开发题答案(非官方)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [php] in_array 判断问题(
- 下一篇: 《雪吁》