AE中Add-In插件开发实例

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

            }
            

        }
    }
}


猜你喜欢

转载自blog.csdn.net/YHxiaohao/article/details/80372841