第四届全国大学生GIS应用技能大赛开发题答案(非官方)
生活随笔
收集整理的這篇文章主要介紹了
第四届全国大学生GIS应用技能大赛开发题答案(非官方)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第四屆全國大學生GIS應用技能大賽開發題答案(非官方)
題目:
根據你的解決方案,開發一個應用型GIS系統,該系統需要具備加載數據、瀏覽數據、查詢數據等基本功能,其它功能不需編寫代碼,但應在程序界面上體現。注:需提交GIS應用系統的源碼文件和可執行應用程序。
答案:
此程序共涉及三個窗體:
主界面設計如下:
主界面設計詳情請看: 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.Display; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Output; using ESRI.ArcGIS.SystemUI; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.DataSourcesFile; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.DataSourcesRaster;namespace Ex2 {public partial class Form1 : Form{public Form1(){//獲取權限ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);InitializeComponent();//控件綁定axTOCControl1.SetBuddyControl(axMapControl1);}#region 文件//打開文件部分詳情查看: https://blog.csdn.net/H48662654/article/details/102980563//定義路徑為全局變量,方便后面使用string path = null;private void 打開文檔ToolStripMenuItem_Click(object sender, EventArgs e){openFileDialog1.Title = "打開文檔";openFileDialog1.Filter = "AceMap Document(*.mxd)|*.mxd";openFileDialog1.Multiselect = false;if (openFileDialog1.ShowDialog() == DialogResult.OK){path = openFileDialog1.FileName;axMapControl1.LoadMxFile(path);}axMapControl1.Extent = axMapControl1.FullExtent;axMapControl1.Refresh();}//添加各種數據private void 添加數據ToolStripMenuItem_Click(object sender, EventArgs e){openFileDialog1.Title = "添加數據";openFileDialog1.Filter = "ShapeFiles(*.shp)|*.shp|RasterFiles(*.tif;*.img)|*.tif;*.img|Personal GeoDatabase(*.mdb)|*.mdb|LayerFile(*.lyr)|*.lyr";openFileDialog1.Multiselect = false;if (openFileDialog1.ShowDialog() == DialogResult.OK){string filePath = openFileDialog1.FileName;string extension = System.IO.Path.GetExtension(filePath).Replace(".", "").ToLower();string fileName = System.IO.Path.GetFileName(filePath);string directory = System.IO.Path.GetDirectoryName(filePath);switch(extension){case "shp":OpenShapeFile(fileName, directory);break;case "mdb":OpenPersoanalGDB(filePath);break;case "lyr":OpenLayerFile(filePath);break;case "img":case "tif":OpenRasterFile(filePath);break;default:MessageBox.Show("Error");return;}}}private void OpenShapeFile(string fileName, string directory){//打開工作空間IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactory();IFeatureWorkspace featureWorkspace = workspaceFactory.OpenFromFile(directory,0) as IFeatureWorkspace;IFeatureClass featureClass = featureWorkspace.OpenFeatureClass(fileName);IFeatureLayer layer = new FeatureLayerClass();//添加圖層layer.FeatureClass = featureClass;layer.Name = featureClass.AliasName;axMapControl1.AddLayer(layer);axMapControl1.Refresh();axTOCControl1.Update();//最近找到一種更簡單的方法, 如下//axMapControl1.AddShapeFile(directory, fileName);}private void OpenPersoanalGDB(string path){IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactoryClass();IWorkspace workspace = workspaceFactory.OpenFromFile(path,0);//獲取數據集,注意種類IEnumDataset enumFeatureClass = workspace.get_Datasets(esriDatasetType.esriDTFeatureClass);//循環添加圖層IFeatureClass featureClass = enumFeatureClass.Next() as IFeatureClass;while (featureClass != null){IFeatureLayer layer = new FeatureLayerClass();layer.FeatureClass = featureClass;layer.Name = featureClass.AliasName;axMapControl1.AddLayer(layer);featureClass = enumFeatureClass.Next() as IFeatureClass; ;}axMapControl1.Refresh();axTOCControl1.Update();}private void OpenLayerFile(string path){axMapControl1.AddLayerFromFile(path);axMapControl1.Refresh();axTOCControl1.Update();}private void OpenRasterFile(string path){IRasterLayer layer = new RasterLayerClass();layer.CreateFromFilePath(path);axMapControl1.AddLayer(layer);axMapControl1.Refresh();axTOCControl1.Update();}//保存文件部分查看: https://blog.csdn.net/H48662654/article/details/102981909private void 保存文檔ToolStripMenuItem_Click(object sender, EventArgs e){if (path != null){IMxdContents contexts = axMapControl1.Map as IMxdContents;IMapDocument mapDocument = new MapDocumentClass();mapDocument.Open(path);mapDocument.ReplaceContents(contexts);mapDocument.Save();MessageBox.Show("保存成功");}else{SaveAs();}}private void SaveAs(){openFileDialog1.Title = "保存文檔";openFileDialog1.Filter = "ArcMap Document(*.mxd)|*.mxd";if (openFileDialog1.ShowDialog() == DialogResult.OK){IMxdContents contexts = axMapControl1.Map as IMxdContents;IMapDocument mapDocument = new MapDocumentClass();mapDocument.New(openFileDialog1.FileName);mapDocument.ReplaceContents(contexts);mapDocument.Save();MessageBox.Show("保存成功");}}private void 導出圖片ToolStripMenuItem_Click(object sender, EventArgs e){//建議查看參考文檔saveFileDialog1.Title = "導出圖片";saveFileDialog1.Filter = "JPEG(*.jpg)|*.jpg|PDF(*.pdf)|*.pdf|PNG(*.png)|*.png|BMP(*.bmp)|*.bmp";if (saveFileDialog1.ShowDialog() == DialogResult.OK){string filePath = saveFileDialog1.FileName;string extension = System.IO.Path.GetExtension(filePath).Replace(".", "").ToLower();IExport export = new ExportAIClass();switch (extension){case "jpg":export = new ExportJPEGClass();break;case "pdf":export = new ExportPDFClass();break;case "png":export = new ExportPNGClass();break;case "bmp":export = new ExportBMPClass();break;default:MessageBox.Show("Error");return;}if(ExportImage(export,filePath)){MessageBox.Show("導出成功");}else{MessageBox.Show("導出失敗");}}}private bool ExportImage(IExport export, string pathFileName){export.ExportFileName = pathFileName;IActiveView activeView = axMapControl1.ActiveView;// Microsoft Windows default DPI resolutionexport.Resolution = 96;tagRECT exportRECT = activeView.ExportFrame;ESRI.ArcGIS.Geometry.IEnvelope envelope = new ESRI.ArcGIS.Geometry.EnvelopeClass();envelope.PutCoords(exportRECT.left, exportRECT.top, exportRECT.right, exportRECT.bottom);export.PixelBounds = envelope;System.Int32 hDC = export.StartExporting();activeView.Output(hDC, (System.Int16)export.Resolution, ref exportRECT, null, null);// Finish writing the export file and cleanup any intermediate filesexport.FinishExporting();export.Cleanup();return true;}#endregion#region 地圖瀏覽//地圖瀏覽和鷹眼部分查看:https://blog.csdn.net/H48662654/article/details/102980829private void 放大ToolStripMenuItem_Click(object sender, EventArgs e){if (axMapControl1.CurrentTool == null){ICommand icc;ITool tool = new ControlsMapZoomInToolClass();axMapControl1.CurrentTool = tool;icc = tool as ICommand;icc.OnCreate(axMapControl1.Object);icc.OnClick();}else{axMapControl1.CurrentTool = null;}}private void 縮小ToolStripMenuItem_Click(object sender, EventArgs e){if (axMapControl1.CurrentTool == null){ICommand icc;ITool tool = new ControlsMapZoomOutToolClass();axMapControl1.CurrentTool = tool;icc = tool as ICommand;icc.OnCreate(axMapControl1.Object);icc.OnClick();}else{axMapControl1.CurrentTool = null;}}private void 漫游ToolStripMenuItem_Click(object sender, EventArgs e){if (axMapControl1.CurrentTool == null){ICommand icc;ITool tool = new ControlsMapPanToolClass();axMapControl1.CurrentTool = tool;icc = tool as ICommand;icc.OnCreate(axMapControl1.Object);icc.OnClick();}else{axMapControl1.CurrentTool = null;}}private void 全局ToolStripMenuItem_Click(object sender, EventArgs e){ICommand icc = new ControlsMapFullExtentCommandClass();icc.OnCreate(axMapControl1.Object);icc.OnClick();}private void 指針ToolStripMenuItem_Click(object sender, EventArgs e){axMapControl1.CurrentTool = null;}//鷹眼private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e){axMapControl2.ClearLayers();if (axMapControl1.Map.LayerCount != 0){for (int i = axMapControl1.Map.LayerCount - 1; i >= 0; i--){ILayer layer = axMapControl1.get_Layer(i);IObjectCopy copy = new ObjectCopyClass();ILayer layerCopy = copy.Copy(layer) as ILayer;axMapControl2.AddLayer(layerCopy);}axMapControl2.SpatialReference = axMapControl1.SpatialReference;axMapControl2.Extent = axMapControl1.FullExtent;axMapControl2.Refresh();}}private void axMapControl1_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e){IEnvelope env = axMapControl1.Extent;IElement element = new RectangleElementClass();element.Geometry = env;ISimpleLineSymbol lineSymbol = new SimpleLineSymbolClass();IRgbColor color1 = new RgbColorClass();color1.Red = 255;color1.Green = 0;color1.Blue = 0;color1.Transparency = 255;lineSymbol.Color = color1;lineSymbol.Width = 2;ISimpleFillSymbol fillSymbol = new SimpleFillSymbolClass();IRgbColor color2 = new RgbColorClass();color2.Red = 255;color2.Green = 0;color2.Blue = 0;color2.Transparency = 0;fillSymbol.Color = color2;fillSymbol.Outline = lineSymbol;IFillShapeElement ele = element as IFillShapeElement;ele.Symbol = fillSymbol;IGraphicsContainer gra = axMapControl2.ActiveView.FocusMap as IGraphicsContainer;gra.DeleteAllElements();gra.AddElement(ele as IElement, 0);axMapControl2.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);}private void axMapControl2_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e){if (e.button == 1){IPoint pt = new PointClass();pt.PutCoords(e.mapX, e.mapY);axMapControl1.CenterAt(pt);axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);}else{IEnvelope env = axMapControl2.TrackRectangle();axMapControl1.Extent = env;axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);}}private void axMapControl2_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e){if (e.button == 1){IPoint pt = new PointClass();pt.PutCoords(e.mapX, e.mapY);axMapControl1.CenterAt(pt);axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);}}#endregion#region 屬性查詢//通過圖層名獲取地圖上的對應圖層private IFeatureLayer GetLayerByName(string name){ILayer layer;for (int i = 0; i < axMapControl1.LayerCount; i++){layer = axMapControl1.get_Layer(i);if (layer.Name.Equals(name)){return layer as IFeatureLayer;}}return null;}private void 查詢對話框ToolStripMenuItem_Click(object sender, EventArgs e){查詢對話框 search = new 查詢對話框(axMapControl1);//當在查詢對話框中點擊 “查詢” 按鈕if (search.ShowDialog() == DialogResult.OK){//清除選擇axMapControl1.Map.ClearSelection();//獲取用戶輸入的查詢條件(圖層,字段,值)string[] value = search.Value;//根據條件獲取圖層和字段IFeatureLayer layer = GetLayerByName(value[0]);IField field = layer.FeatureClass.Fields.get_Field(layer.FeatureClass.Fields.FindField(value[1]));IQueryFilter filter = new QueryFilterClass();string whereClause = "";//根據查詢的字段類型確定查詢語句switch (field.Type){//文本類型支持模糊查詢case esriFieldType.esriFieldTypeString:whereClause += field.Name + " LIKE " + "'" + value[2] + "'";break;//數值類型支持精確查詢case esriFieldType.esriFieldTypeSingle:case esriFieldType.esriFieldTypeSmallInteger:case esriFieldType.esriFieldTypeInteger:case esriFieldType.esriFieldTypeDouble:whereClause += field.Name + " = " + value[2];break;default:MessageBox.Show("Error");return;}filter.WhereClause = whereClause;//高亮選擇IFeatureSelection featureSelection = layer as IFeatureSelection;featureSelection.SelectFeatures(filter, esriSelectionResultEnum.esriSelectionResultNew, false);axMapControl1.Refresh();ISelectionSet set = featureSelection.SelectionSet;IEnumIDs ids = set.IDs;//將選中的要素ID傳給屬性表的構造函數,顯示屬性屬性表 attribute = new 屬性表(ids,layer,axMapControl1.ActiveView);attribute.Show();}}private void 清除選擇ToolStripMenuItem_Click(object sender, EventArgs e){axMapControl1.Map.ClearSelection();}#endregion#region 右擊圖層顯示屬性ILayer layer3 = null;private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e){if (e.button == 2)//右鍵{//查看幫助文檔有關HitTest方法的用法IBasicMap map = new MapClass();object unk = null;object data = null;esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemLayer;axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer3, ref unk, ref data);if (item == esriTOCControlItem.esriTOCControlItemLayer){contextMenuStrip1.Show(axTOCControl1, e.x, e.y);}}}#endregionprivate void 打開屬性表ToolStripMenuItem_Click(object sender, EventArgs e){//獲取ID方便調用同一個構造函數IFeatureLayer layer4 = layer3 as IFeatureLayer;IFeatureSelection selection = layer4 as IFeatureSelection;selection.SelectFeatures(null, esriSelectionResultEnum.esriSelectionResultNew,false);ISelectionSet set = selection.SelectionSet;IEnumIDs ids = set.IDs;屬性表 att = new 屬性表(ids, layer4, axMapControl1.ActiveView);att.Show();selection.Clear();}} }屬性表界面:
屬性表窗體代碼:
查詢對話框界面:
查詢對話框窗體代碼:
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;namespace Ex2 {public partial class 查詢對話框 : Form{AxMapControl map;//用來存儲查詢條件private string[] value;public string[] Value{get{return value;}}public 查詢對話框(AxMapControl map){InitializeComponent();this.map = map;value = new string[3];}private void 查詢對話框_Load(object sender, EventArgs e){//將地圖中所有矢量圖層添加進ComboBox1for (int i = 0; i < map.LayerCount; i++){ILayer layer = map.get_Layer(i);if(layer is IFeatureLayer)//判斷是否為矢量圖層{comboBox1.Items.Add(layer.Name.ToString());}}comboBox1.SelectedIndex = 0;}private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){//將選中圖層所有文本型和數值型字段添加到ComboBox2comboBox2.Items.Clear();IFeatureLayer layer1 = map.get_Layer(comboBox1.SelectedIndex) as IFeatureLayer;IFeatureClass featureClass = layer1.FeatureClass;for (int i = 0; i < featureClass.Fields.FieldCount; i++){IField field = featureClass.Fields.get_Field(i);//判斷類型if (field.Type == esriFieldType.esriFieldTypeDouble || field.Type == esriFieldType.esriFieldTypeInteger || field.Type == esriFieldType.esriFieldTypeString||field.Type== esriFieldType.esriFieldTypeSmallInteger||field.Type == esriFieldType.esriFieldTypeSingle){comboBox2.Items.Add(field.Name.ToString());}}comboBox2.SelectedIndex = 0;}private void button1_Click(object sender, EventArgs e){//點擊查詢 賦值查詢條件value[0] = comboBox1.SelectedItem.ToString();value[1] = comboBox2.SelectedItem.ToString();value[2] = textBox1.Text;this.DialogResult = DialogResult.OK;}} }歷屆GIS應用技能大賽開發題答案點這里,尚在不定期更新中
總結
以上是生活随笔為你收集整理的第四届全国大学生GIS应用技能大赛开发题答案(非官方)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 46-单元测试(1)
- 下一篇: 数字后端——ECO