对ArcGIS按属性选择工具的二次开发

ArcGIS有个非常常用的功能叫做“按属性选择”。该功能非常的常用,可以通过SQL语句进行一些筛选。

但也有一定的局限性,如:无法批量进行多语句的筛选的(或者语句比较长和复杂),无法逐个跳转等(可以通过定义查询和属性表来实现)。

本二次开发实现的目的是重新制作可停靠窗口。实现按属性查找的功能以及批量查找的功能。同时列出结果项,并可以点击调转等附加功能。

可以很好的用于ArcGIS在数据编辑、检查工作中。

完成的窗口界面如下:

主要思路和核心代码如下:

1、按属性选择:

private void Leon_zdysc(int layer_index)
        {
            IMap m_map = ArcMap.Document.FocusMap;
            IFeatureLayer featureLayer;
            if (m_map.get_Layer(layer_index) is IFeatureSelection)
            {

                ILayer pLayer = m_map.get_Layer(layer_index);
                if (pLayer is FeatureLayer)
                {
                    featureLayer = pLayer as FeatureLayer;
                    OID_FieldName = featureLayer.FeatureClass.OIDFieldName;
                }
                dt = GetDataTable(pLayer, pLayer.Name, textEdit_whereclause.Text);
                for (int i = dt.Columns.Count-1; i >=0; i--)
                {
                    if (dt.Columns[i].ColumnName != OID_FieldName)
                    {
                        dt.Columns.RemoveAt(i);
                    }
                }
                DataColumn dc = new DataColumn();
                dc.ColumnName = "STATE";
                dt.Columns.Add(dc);
                dt.Columns[OID_FieldName].ColumnName = "OID";
                this.gridControl1.DataSource = dt;
                this.gridView1.PopulateColumns(); //显示gridControl 数据
                groupControl3.Text = dt.TableName;
                ArcMap.Document.ActiveView.Refresh();
            }
            else
            {
                MessageBox.Show("请检查检查图层顺序!");
            }
        }
public DataTable GetDataTable(ILayer pLayer, string tableName,string sql)
        {
            if (pLayer is IFeatureLayer)
            {
                DataTable iTableStructure = GetITableStructure(pLayer, tableName);
                string layerType = GetLayerType(pLayer);
                DataRow dataRow = null;
                ESRI.ArcGIS.Geodatabase.ITable val = pLayer as ESRI.ArcGIS.Geodatabase.ITable;
                IQueryFilter pQueryFilter = new QueryFilterClass();  

                
                // Set the filter to return only restaurants.  
                pQueryFilter.WhereClause = sql;

                ICursor val2 = val.Search(pQueryFilter, false);
                IRow val3 = val2.NextRow();
                int num = 0;
                while (val3 != null)
                {
                    dataRow = iTableStructure.NewRow();
                    for (int i = 0; i < val3.Fields.FieldCount; i++)
                    {
                        if ((int)val3.Fields.get_Field(i).Type == 7)
                        {
                            dataRow[i] = layerType;
                        }
                        else if ((int)val3.Fields.get_Field(i).Type == 8)
                        {
                            dataRow[i] = "Element";
                        }
                        else
                        {
                            dataRow[i] = val3.get_Value(i);
                        }
                    }
                    iTableStructure.Rows.Add(dataRow);
                    dataRow = null;
                    num++;
                    val3 = val2.NextRow();
                }
                return iTableStructure;
            }
            if (pLayer is IRasterLayer)
            {
                IRasterLayer val4 = pLayer as IRasterLayer;
                IRaster raster = val4.Raster;
                IRasterProps val5 = raster as IRasterProps;
                //val5.set_PixelType(8);
                val5.PixelType = rstPixelType.PT_LONG;
                if ((int)val5.PixelType == 8)
                {
                    IRasterBandCollection val6 = raster as IRasterBandCollection;
                    IRasterBand val7 = val6.Item(0);
                    ESRI.ArcGIS.Geodatabase.ITable attributeTable = val7.AttributeTable;
                    DataTable dataTable = new DataTable();
                    for (int j = 0; j < attributeTable.Fields.FieldCount; j++)
                    {
                        dataTable.Columns.Add(attributeTable.Fields.get_Field(j).Name);
                    }
                    ICursor val8 = attributeTable.Search(null, false);
                    for (IRow val9 = val8.NextRow(); val9 != null; val9 = val8.NextRow())
                    {
                        DataRow dataRow2 = dataTable.NewRow();
                        for (int k = 0; k < val9.Fields.FieldCount; k++)
                        {
                            dataRow2[k] = val9.get_Value(k).ToString();
                        }
                        dataTable.Rows.Add(dataRow2);
                    }
                    return dataTable;
                }
            }
            return null;
        }

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值