作为一个小白,在做Add-In开发时,网上资源比较少,最好的学习Add-In开发方法就是多看实例,在此分享我自己查找资料拼凑而成的一个实例,话不多说,精品如下:
该插件实现的功能是计算省会城市的空间可达性,计算公式为:
具体参数的意义如下:
Ai为节点i的可达性水平,Ai的值越小,节点的可达性越好,反之越差。
Tij节点i通过某种交通方式到达节点j 的最短旅行时间;
Mj为节点城市的某种社会经济要素流的流量,表示该经济中心对周围地区的辐射和吸引力的高低,可采用人口规模、GDP总量等指标,文中采用各节点区域的GDP总量;
n为交通网络中除i点以外的节点总数。
窗口设计为:
具体实现代码(只分享核心部分):
using System; using System.IO; 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.esriSystem; using ESRI.ArcGIS.Editor; using ESRI.ArcGIS.ArcMapUI; using ESRI.ArcGIS.Desktop; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Catalog; using ESRI.ArcGIS.DataManagementTools; using ESRI.ArcGIS.DataSourcesFile; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Search; using ESRI.ArcGIS.Maplex; using ESRI.ArcGIS.Carto; namespace space_accessiblity { public partial class Form1 : Form { private IApplication m_application; public Form1() { InitializeComponent(); } //打开form2对话框,显示关于按钮的内容 private void button4_Click(object sender, EventArgs e) { Form2 fm = new Form2(); fm.ShowDialog(); } //帮助按钮 private void button3_Click(object sender, EventArgs e) { System.Diagnostics.Process.Start(@"G:\kaifa\space_accessiblity\space_accessiblity\使用说明.docx"); //System.Diagnostics.Process.Start("text1.txt", path1); /*string path1 = Application.StartupPath + "\\text1.txt"; string content; using (FileStream stream = File.OpenRead(path1)) { using (StreamReader reader = new StreamReader(stream)) { content = reader.ReadToEnd(); } } MessageBox.Show(content);*/ } //实现单个城市空间可达性计算 private void button1_Click(object sender, EventArgs e) { double sum = 0; double t = 0; double m = 0; double tm = 0; double access = 0; try { //设置地图对象 m_application = ArcMap.Application; IDocument document = m_application.Document; IMxDocument mapDocument = document as IMxDocument; IMap map = mapDocument.FocusMap; //选择图层 IFeatureLayer pFeatureLayer = map.get_Layer(1) as IFeatureLayer; IFeatureClass FeatureClass = pFeatureLayer.FeatureClass; //获取表中要素个数 //要素层转为要素选择 IFeatureSelection pFeatureSelection = (IFeatureSelection)pFeatureLayer; //新建查询过滤器 IQueryFilter pQueryFilter = new QueryFilterClass(); //设置查询条件 pQueryFilter.WhereClause = "start='" + comboBox1.Text + "'"; pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false); //获取查询结果 ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet; //MessageBox.Show("一共查询到"+pSelectionSet.Count.ToString()+"个要素"); ICursor pCursor; pSelectionSet.Search(null, false, out pCursor); IFeatureCursor pFeatureCursor = (IFeatureCursor)pCursor; IFeature ft = pFeatureCursor.NextFeature(); sum = Double.Parse(ft.get_Value(ft.Fields.FindField("GDP")).ToString()); t = Double.Parse(ft.get_Value(ft.Fields.FindField("time")).ToString()); m = Double.Parse(ft.get_Value(ft.Fields.FindField("GDP")).ToString()); tm = t * m; //MessageBox.Show(ft.get_Value(ft.Fields.FindField("GDP")).ToString()); while (ft != null) { t = 0; m = 0; IFeature ft1 = pFeatureCursor.NextFeature(); sum = sum + Double.Parse(ft1.get_Value(ft1.Fields.FindField("GDP")).ToString()); t = Double.Parse(ft1.get_Value(ft1.Fields.FindField("time")).ToString()); m = Double.Parse(ft1.get_Value(ft1.Fields.FindField("GDP")).ToString()); tm = tm + t * m; } } catch { access = tm / sum; textBox1.Text = comboBox1.Text+"的交通可达性为"+Convert.ToString(access); return; } } private void button2_Click(object sender, EventArgs e) { double sum2 = 0; double t2 = 0; double m2 = 0; double tm2 = 0; double access2 = 0; double sum3 = 0; double t3 = 0; double m3 = 0; double tm3 = 0; double access3 = 0; m_application = ArcMap.Application; IDocument document = m_application.Document; IMxDocument mapDocument = document as IMxDocument; IMap map = mapDocument.FocusMap; //选择图层 IFeatureLayer pFeatureLayer = map.get_Layer(1) as IFeatureLayer; IFeatureClass FeatureClass = pFeatureLayer.FeatureClass; //comboBox2空间可达性 try { //要素层转为要素选择 IFeatureSelection pFeatureSelection = (IFeatureSelection)pFeatureLayer; //新建查询过滤器 IQueryFilter pQueryFilter = new QueryFilterClass(); //设置查询条件 pQueryFilter.WhereClause = "start='" + comboBox2.Text + "'"; pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false); //获取查询结果 ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet; ICursor pCursor; pSelectionSet.Search(null, false, out pCursor); IFeatureCursor pFeatureCursor = (IFeatureCursor)pCursor; IFeature ft = pFeatureCursor.NextFeature(); sum2 = Double.Parse(ft.get_Value(ft.Fields.FindField("GDP")).ToString()); t2 = Double.Parse(ft.get_Value(ft.Fields.FindField("time")).ToString()); m2 = Double.Parse(ft.get_Value(ft.Fields.FindField("GDP")).ToString()); tm2 = t2 * m2; while (ft != null ) { IFeature ft1 = pFeatureCursor.NextFeature(); sum2 = sum2 + Double.Parse(ft1.get_Value(ft1.Fields.FindField("GDP")).ToString()); t2 = Double.Parse(ft1.get_Value(ft1.Fields.FindField("time")).ToString()); m2 = Double.Parse(ft1.get_Value(ft1.Fields.FindField("GDP")).ToString()); tm2 = tm2 + t2 * m2; } } catch { access2 = tm2 / sum2; return; } finally { try { IFeatureSelection pFeatureSelection3 = (IFeatureSelection)pFeatureLayer; IQueryFilter pQueryFilter3 = new QueryFilterClass(); //设置查询条件 pQueryFilter3.WhereClause = "start='" + comboBox3.Text + "'"; pFeatureSelection3.SelectFeatures(pQueryFilter3, esriSelectionResultEnum.esriSelectionResultNew, false); //获取查询结果 ISelectionSet pSelectionSet3 = pFeatureSelection3.SelectionSet; //MessageBox.Show("一共查询到"+pSelectionSet.Count.ToString()+"个要素"); ICursor pCursor3; pSelectionSet3.Search(null, false, out pCursor3); IFeatureCursor pFeatureCursor3 = (IFeatureCursor)pCursor3; IFeature ft3 = pFeatureCursor3.NextFeature(); sum3 = Double.Parse(ft3.get_Value(ft3.Fields.FindField("GDP")).ToString()); // MessageBox.Show(sum3.ToString()); t3 = Double.Parse(ft3.get_Value(ft3.Fields.FindField("time")).ToString()); m3 = Double.Parse(ft3.get_Value(ft3.Fields.FindField("GDP")).ToString()); tm3 = t3 * m3; while (ft3 != null) { t3 = 0; m3 = 0; IFeature ft4 = pFeatureCursor3.NextFeature(); sum3 = sum3 + Double.Parse(ft4.get_Value(ft4.Fields.FindField("GDP")).ToString()); t3 = Double.Parse(ft4.get_Value(ft4.Fields.FindField("time")).ToString()); m3 = Double.Parse(ft4.get_Value(ft4.Fields.FindField("GDP")).ToString()); tm3 = tm3 + t3 * m3; } } catch { access3 = tm3 / sum3; if (access2 > access3) { textBox1.Text = comboBox2.Text + "的交通可达性为" + Convert.ToString(access2) + "\r\n\n" + comboBox3.Text + "的交通可达性为" + Convert.ToString(access3) + "\r\n" + comboBox3.Text + "的交通可达性比" + comboBox2.Text + "大"; } else { textBox1.Text = comboBox2.Text + "的交通可达性为" + Convert.ToString(access2) + "\r\n\n" + comboBox3.Text + "的交通可达性为" + Convert.ToString(access3) + "\r\n" + comboBox3.Text + "的交通可达性比" + comboBox2.Text + "小"; } } } } } }