zoukankan      html  css  js  c++  java
  • C#+AE 实现点击查询属性功能

    实现效果如下:

    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.esriSystem;
    using ESRI.ArcGIS.Carto;
    using ESRI.ArcGIS.Controls;
    using ESRI.ArcGIS.ADF;
    using ESRI.ArcGIS.SystemUI;
    using ESRI.ArcGIS.Geometry;
    using ESRI.ArcGIS.Geodatabase;
    using ESRI.ArcGIS.Display;

    namespace _0920tryTreeList
    {
        public partial class Form1 : Form
        {
            //需要创建一个公共变量表格
            // public
           // public DataTable dt2 = new DataTable();
          //  DataRow dr2;
            public Form1()
            {
                InitializeComponent();
              


                //第二张表格
                //dt2.Columns.Add("Name");
                //dt2.Columns.Add("Value");
                //this.dataGridView2.DataSource = pDataTable;
                //this.dataGridView2.DataSource = dt2;
            }

            private void button1_Click(object sender, EventArgs e)
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "*.mxd|*.mxd";
                ofd.ShowDialog();

                string fp = ofd.FileName;
                axMapControl1.LoadMxFile(fp,0,Type.Missing);
            }

            bool bu = false;
            private void button2_Click(object sender, EventArgs e)
            {
                bu = true;

            }

            //定义子节点的单击事件也用到的公共变量
          // public  IFeature pFeature = null;


           
            private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
            {

                try
                {
                    if (bu)
                    {
                        DataTable pDataTable = new DataTable();
                        DataRow pDataRow = null;
                        pDataTable.Columns.Add("ID");
                        pDataTable.Columns.Add("Name");
                        pDataTable.Columns.Add("ParentID");
                        pDataTable.Columns.Add("Value");

                        for (int i = 0; i < axMapControl1.Map.LayerCount;i++ )
                        {
                            pDataRow=pDataTable.NewRow();
                            string lyrName = axMapControl1.Map.get_Layer(i).Name;
                            pDataRow["ID"] = lyrName;
                            pDataRow["Name"] = lyrName;
                            pDataRow["ParentID"] = -1;
                          
                            pDataTable.Rows.Add(pDataRow);

                           
                            //开始点选查询
                            IMap pMap;
                            pMap = axMapControl1.Map as IMap;

                            //获取点图层
                            IFeatureLayer pFeatureLayer;
                            pFeatureLayer = pMap.get_Layer(i) as IFeatureLayer;
                            IFeatureClass pFeatureClass;
                            pFeatureClass = pFeatureLayer.FeatureClass;

                            //获取鼠标点击点
                            IPoint pPoint;
                            pPoint = new PointClass();
                            pPoint.PutCoords(e.mapX, e.mapY);

                            IGeometry pGeometry;

                            //定义缓冲区
                            double db = 2;
                            ITopologicalOperator pTop;
                            pTop = pPoint as ITopologicalOperator;
                            pGeometry = pTop.Buffer(db);

                            //选取
                            pMap.SelectByShape(pGeometry, null, false);
                            pMap.ClearSelection();

                            //空间过滤运算
                            ISpatialFilter pSpatialFilter = new SpatialFilterClass();
                            pSpatialFilter.Geometry = pGeometry;


                            //设置为不同的要素类型的图层
                  
                       
                            switch (pFeatureClass.ShapeType)
                            {
                                case esriGeometryType.esriGeometryPoint:
                                    pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
                                    break;
                                case esriGeometryType.esriGeometryPolyline:
                                    pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
                                    break;
                                case esriGeometryType.esriGeometryPolygon:
                                    pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                                    break;

                            }
                            pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;

                            //指针
                            IFeatureCursor pFeatureCursor;
                            pFeatureCursor = pFeatureClass.Search(pSpatialFilter, false);
                            IFeature pFeature;
                            pFeature = pFeatureCursor.NextFeature();

                            //开始遍历
                            while (pFeature != null)
                            {

                                //获取要素的字段名和字段值
                                int n = pFeature.Fields.FieldCount;
                                string sName;
                                string sValue;


                                //这句话的对象需要随着地图的改变而改变。可以是ID,FID 等带有唯一标识身份的 东西。
                                int index = pFeature.Fields.FindField("ObjectID");
                                if (index == -1)
                                    return;
                                IField pField = pFeature.Fields.get_Field(index);
                                sName = pField.Name;

                                sValue = pFeature.get_Value(index).ToString();


                                pDataRow = pDataTable.NewRow();

                                //之所以这样赋值是为了保证ID的唯一性;
                                pDataRow["ID"] = lyrName + sValue;
                                pDataRow["Name"] = sValue;
                                pDataRow["ParentID"] = lyrName;
                                pDataTable.Rows.Add(pDataRow);

                                pFeature = pFeatureCursor.NextFeature();

                            }
                            //这个是师兄交的,指针等占内存的东西在用完之后一定要释放;!!!
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
                        }
                     
                        treeList1.DataSource = pDataTable;
                        treeList1.ParentFieldName="ParentID";
                    

                     
                    }

                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

            private void Form1_Load(object sender, EventArgs e)
            {

            }

            //换地图清除数据源
            private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
            {
                treeList1.DataSource = null;
               // dataGridView1.DataSource = null;
            }

       
            //************//出现的问题是:值不在预期范围内
            private void treeList1_FocusedNodeChanged_1(object sender, DevExpress.XtraTreeList.FocusedNodeChangedEventArgs e)
            {
               
                try
                {
                    int layerIndex;
                    if (e.Node.HasChildren)
                    {
                        return;
                    }
                    if (e.Node.ParentNode != null) //***********//这个存在bug,若节点超过两级则出错
                    {
                        //创建一个新的表作为属性表
                        DataTable dt = new DataTable();
                        DataRow dr = null;
                        dt.Columns.Add("Name");
                        dt.Columns.Add("Value");


                        //循环图层
                        for (int i = 0; i < this.axMapControl1.LayerCount; i++)
                        {

                            //如果父节点名称和图层名相同,获取索引
                            if (e.Node.ParentNode.GetValue(0).ToString() == this.axMapControl1.get_Layer(i).Name)
                            {
                                layerIndex = i;
                                IFeature pFeature;                             
     
                               pFeature = (this.axMapControl1.get_Layer(layerIndex) as IFeatureLayer).FeatureClass.GetFeature(int.Parse(this.treeList1.FocusedNode.GetValue(0).ToString())); ;

                              if (pFeature != null)
                                {                            
                                   //循环字段集,赋值给表dt
                                    int n = pFeature.Fields.FieldCount;
                                 
                                    for (int k = 0; k < n-1; k++)
                                    {
                                       
                                        IField pField = pFeature.Fields.get_Field(k);
                                        string fieldName = pField.Name;
                                        var  a=  pFeature.get_Value(k);
                                        string fieldValue = pFeature.get_Value(k).ToString();

                                        //赋值给表
                                        dr = dt.NewRow();
                                        dr["Name"]=fieldName;
                                         dr["Value"]=fieldValue;
                                         dt.Rows.Add(dr);
                                    }  
                             
                                    gridControl1.DataSource = dt;
                                   
                                }
                                else
                                    return;                  
                               
                            }
                        }

                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

           
        }
    }
     

  • 相关阅读:
    linux之awk命令
    HDU 2097 Sky数 进制转换
    HDU 2077 汉诺塔IV
    HDU 2094 产生冠军 dfs加map容器
    HDU 2073 叠框
    HDU 2083 简易版之最短距离
    HDU 2063 过山车 二分匹配
    天梯 1014 装箱问题
    天梯 1214 线段覆盖
    天梯 1098 均分纸牌
  • 原文地址:https://www.cnblogs.com/yanhan/p/2701520.html
Copyright © 2011-2022 走看看