作为一个小白,在做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 + "小";
}
}
}
}
}
}