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;
}