直接上代码:
要素查询 并高亮显示
模糊查询我的根据自己的表设计的,自己用基本语句是
属性表字段 LIKE '*内容*'
*号为 SQL like语句里的% like '%%',在ArcGIS里是*开始用%不出来,其他查询语句都遵循SQL语法
/// <summary>
/// 清除选择
/// </summary>
/// <param name="mapControl"></param>
public static void ClearSelection(IMapControlDefault mapControl)
{
try
{
IActiveView activeView = (IActiveView)mapControl.Map;
//清除数据集前必须先刷新
for (int i = 0; i < mapControl.LayerCount; i++)
{
activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, mapControl.get_Layer(i), null);
mapControl.Map.ClearSelection();
activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, mapControl.get_Layer(i), null);
}
}
catch (System.Exception ex)
{
MessageBoxEX.Show("清除选择失败!" + ex);
}
}
/// <summary>
/// 名称查询
/// </summary>
/// <param name="mapControl"></param>
/// <param name="index">图层</param>
/// <param name="field">字段</param>
/// <param name="value">查询值</param>
public static void SelectByName(IMapControlDefault mapControl,string layerName, string field, string value)
{
try
{
ClearSelection(mapControl);//清除选择
string selectName = value.Trim();
ILayer layer = getFeatureLayer(mapControl, layerName);//获取对应图层
IFeatureLayer featureLayer = layer as IFeatureLayer;
IFeatureClass featureClass = featureLayer.FeatureClass;
IQueryFilter queryFilter = new QueryFilterClass();//查询对象实例化
IFeatureCursor featureCursor;
IFeature feature = null;
string str = field + " = '" + selectName+"'" ;//创建查询语句
queryFilter.WhereClause = str;
featureCursor = featureClass.Search(queryFilter, true);//进行查询操作
feature = featureCursor.NextFeature();//下一个得到查询要素
if (null != feature)
{
mapControl.Map.SelectFeature(layer, feature);//地图高亮显示
mapControl.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);//刷新
}
}
catch (System.Exception ex)
{
MessageBoxEX.Show("依据名称查询选中要素失败!"+ex);
}
}
/// <summary>
/// 全局模糊查询
/// </summary>
/// <param name="mapControl">map控件</param>
/// <param name="layerName">图层名称</param>
/// <param name="value">查询内容</param>
public static void SelectByLike(IMapControlDefault mapControl,string layerName , string value)
{
//查询语句
//[tf_number] LIKE '**' or [tf_name] LIKE '**' or [tf_time] LIKE '**' 查询台风语句 tfPoint
//[name] LIKE '**' 查询城市 city
//[tf_name] LIKE '**' or [tf_time] LIKE '**' or [tf_text] LIKE '**' 登陆点 tfLoaclPoint
//[tf_name] LIKE '**' 台风路径 tfRoad
//[china_name] LIKE '**' 省份 province
try
{
ClearSelection(mapControl);//清除选择
string selectName = value.Trim();
string strSQL ="";
switch (layerName.Trim())
{
case "城市"://图层名
strSQL = "[name] LIKE '*" + selectName + "*'";break;
case "登陆点"://图层名
strSQL = "[tf_name] LIKE '*" + selectName + "*' or [tf_time] LIKE '*" + selectName + "*' or [tf_text] LIKE '*" + selectName + "*'";break;
case "台风地理数据"://图层名
strSQL = "[tf_number] LIKE '*" + selectName + "*' or [tf_name] LIKE '*" + selectName + "*' or [tf_time] LIKE '*" + selectName + "*'"; break;
case "台风路径"://图层名
strSQL = "[tf_name] LIKE '*" + selectName + "*'"; break;
case "省份"://图层名
strSQL = "[china_name] LIKE '*" + selectName + "*'"; break;
}
ILayer layer = getFeatureLayer(mapControl, layerName);
IFeatureLayer featureLayer = layer as IFeatureLayer;
IFeatureClass featureClass = featureLayer.FeatureClass;
IQueryFilter queryFilter = new QueryFilterClass();
IFeatureCursor featureCursor;
IFeature feature = null;
queryFilter.WhereClause = strSQL;
featureCursor = featureClass.Search(queryFilter, true);
feature = featureCursor.NextFeature();
while (null != feature)
{
if(layerName.Trim()== "城市" || layerName.Trim() == "省份")
mapControl.Map.SelectFeature(featureLayer, feature);//对要素高亮显示
else
ShowByFilter(mapControl, featureLayer, strSQL);//只显示满足条件的要素
mapControl.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);//刷新
feature = featureCursor.NextFeature();//移动至下一个要素
}
}
catch
{
MessageBoxEX.Show("查询失败!");
}
}
/// <summary>
/// 名称查询显示所有
/// </summary>
/// <param name="mapControl"></param>
/// <param name="index">图层</param>
/// <param name="field">字段</param>
/// <param name="value">查询值</param>
public static void SelectByNameAll(IMapControlDefault mapControl, string layerName, string field, string value)
{
try
{
string selectName = value.Trim();
ILayer layer = getFeatureLayer(mapControl, layerName);
IFeatureLayer featureLayer = layer as IFeatureLayer;
IFeatureClass featureClass = featureLayer.FeatureClass;
IQueryFilter queryFilter = new QueryFilterClass();
IFeatureCursor featureCursor;
IFeature feature = null;
string str = field + " = '" + selectName + "'";
queryFilter.WhereClause = str;
featureCursor = featureClass.Search(queryFilter, true);
feature = featureCursor.NextFeature();
if (null != feature)
{
mapControl.Map.SelectFeature(layer, feature);
mapControl.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
}
}
catch (System.Exception ex)
{
MessageBoxEX.Show("依据名称查询选中要素失败!" + ex);
}
}
属性表查询及编辑:
/// <summary>
/// 查询指定条件下的属性表信息显示,默认字段去除
/// </summary>
/// <param name="mapControl">map控件</param>
/// <param name="index">图层</param>
/// <param name="field">属性值</param>
/// <param name="value">条件值</param>
/// <returns>DataTable</returns>
public static DataTable FeatureTableByName(IMapControlDefault mapControl, string lyerName, string field, string value)
{
DataTable pTable = new DataTable();//建立一个table
string selectName = value.Trim();//查询条件
try
{
IFeatureLayer featureLayer = getFeatureLayer(mapControl, lyerName);//获取图层
IFields pFields = featureLayer.FeatureClass.Fields;//获取要素类字段
int log = -1;
for (int i = 0; i < pFields.FieldCount; i++) //FieldCount字段集合中的字段数
{
pTable.Columns.Add(pFields.get_Field(i).AliasName);//datatable添加字段
if (pFields.get_Field(i).AliasName.ToString() == "SHAPE")
{ log = i; }//记录“Shape”行。
}
//创建一个新的查询过滤器
IFeatureClass featureClass = featureLayer.FeatureClass;
IQueryFilter queryFilter = new QueryFilterClass();//查询
IFeatureCursor featureCursor;
IFeature feature = default(IFeature);
string str = field + " = '" + selectName + "'";//查询语句
queryFilter.WhereClause = str;
featureCursor = featureClass.Search(queryFilter, true);//查询执行
feature = featureCursor.NextFeature();//获取查询第一个要素
while (feature != null)
{
DataRow newRow = pTable.NewRow();
string featapye = feature.Shape.GeometryType.ToString();//获取要素类类型名
for (int i = 0; i < pFields.FieldCount; i++)
{
if (log != i)
{
newRow[i] = feature.get_Value(i).ToString();//每行要素赋值给datatable
}
else
{
newRow[i] = featapye;//要素类型赋值
}
}
pTable.Rows.Add(newRow);
feature = featureCursor.NextFeature();//下一个要素
}
ShowByFilter(mapControl, featureLayer, str);//只显示满足条件的要素
//删除默认字段
pTable.Columns.Remove("OBJECTID");//删除objectID列
for (int i=0; i < pTable.Columns.Count; i++)
{
string name = pTable.Columns[i].ColumnName;
if (name.Contains("SHAPE"))//判断字段是否包含SHAP默认字段
pTable.Columns.Remove(name);
}
}
catch (System.Exception ex)
{
MessageBoxEX.Show("查询指定条件下的属性表信息失败!" + ex.Message);
}
return pTable;
}
/// <summary>
/// 属性表信息全部查询
/// </summary>
/// <param name="mapControl">mapControl控件</param>
/// <param name="index">图层</param>
/// <returns>DataTable</returns>
public static DataTable FeatureTable(IMapControlDefault mapControl, string lyerName)
{
DataTable pTable = new DataTable();//建立一个table
int log = -1;
try
{
IFeatureLayer featureLayer = getFeatureLayer(mapControl, lyerName);
IFields pFields = featureLayer.FeatureClass.Fields;
for (int i = 0; i < pFields.FieldCount; i++) //FieldCount字段集合中的字段数
{
pTable.Columns.Add(pFields.get_Field(i).AliasName);
if (pFields.get_Field(i).AliasName.ToString() == "SHAPE")
{
log = i; }//记录“Shape”行。
}
//创建一个新的查询过滤器
IFeatureClass featureClass = featureLayer.FeatureClass;
IQueryFilter queryFilter = new QueryFilterClass();
IFeatureCursor featureCursor;
IFeature feature = default(IFeature);
featureCursor = featureClass.Search(null, false);//全部查询
feature = featureCursor.NextFeature();
while (feature != null)
{
DataRow newRow = pTable.NewRow();
string featapye = feature.Shape.GeometryType.ToString();
for (int i = 0; i < pFields.FieldCount; i++)
{
if (log != i)
{
string str = feature.get_Value(i).ToString();
newRow[i] = feature.get_Value(i).ToString();
}
else
{
newRow[i] = featapye;
}
}
pTable.Rows.Add(newRow);
feature = featureCursor.NextFeature();
}
}
catch (System.Exception ex)
{
MessageBoxEX.Show("属性表信息全部查询失败!" + ex.Message);
}
return pTable;
}
/// <summary>
/// 面要素返回带面积的表
/// </summary>
/// <param name="mapControl"></param>
/// <param name="lyerName"></param>
/// <returns></returns>
public static DataTable FeatureArea()
{
DataTable pTable = new DataTable();//建立一个table
int log = -1;
double area = 0;
try
{
string appPath = Environment.CurrentDirectory + "\\shp\\Intersect.shp";
IFeatureLayer featureLayer = WSpaceAnalysis.GetLayerFromPathShp(appPath);
IFields pFields = featureLayer.FeatureClass.Fields;
for (int i = 0; i < pFields.FieldCount; i++) //FieldCount字段集合中的字段数
{
pTable.Columns.Add(pFields.get_Field(i).AliasName);
if (pFields.get_Field(i).AliasName.ToString() == "SHAPE")
{
log = i;
}//记录“Shape”行。
}
//创建一个新的查询过滤器
IFeatureClass featureClass = featureLayer.FeatureClass;
IQueryFilter queryFilter = new QueryFilterClass();
IFeatureCursor featureCursor;
IFeature feature = default(IFeature);
featureCursor = featureClass.Search(null, false);//全部查询
feature = featureCursor.NextFeature();
if (feature.Shape.GeometryType == esriGeometryType.esriGeometryPolygon)
pTable.Columns.Add("AreaAll");//如果是面要素加一个面积字段
while (feature != null)
{
DataRow newRow = pTable.NewRow();
string featapye = feature.Shape.GeometryType.ToString();
for (int i = 0; i < pFields.FieldCount; i++)
{
if (log != i)
{
string str = feature.get_Value(i).ToString();
newRow[i] = feature.get_Value(i).ToString();
if (feature.Shape.GeometryType == esriGeometryType.esriGeometryPolygon)
{
//计算面积
IArea pArea = feature.Shape as IArea;
newRow[i + 1] = pArea.Area * 10000;//得到的面积单位是平方米并存入
}
}
else
{
newRow[i] = featapye;
}
}
pTable.Rows.Add(newRow);
feature = featureCursor.NextFeature();
}
}
catch (System.Exception ex)
{
MessageBoxEX.Show("属性表信息全部查询失败!" + ex.Message);
}
return pTable;
}
/// <summary>
/// 属性表编辑
/// </summary>
/// <param name="mapControl"></param>
/// <param name="layerName"></param>
/// <param name="dataTable"></param>
public static void EditFeature(IMapControlDefault mapControl,string layerName, DataTable dataTable)
{
int row =0;//记录第几行
IFeatureLayer featureLayer = getFeatureLayer(mapControl, layerName);
IFields pFields = featureLayer.FeatureClass.Fields;
IFeatureClass pFeatureClass = featureLayer.FeatureClass;
IQueryFilter pQueryFilter = new QueryFilterClass();
IFeatureCursor pFeatureCursor;
IFeature pFeature = default(IFeature);
//首先获取Featureclass,利用Featureclass获取IWorkspace和IWorkspaceEdit:
IWorkspace workspace = ((IDataset)pFeatureClass).Workspace;
IWorkspaceEdit workspaceEdit = workspace as IWorkspaceEdit;
//然后开启编辑状态:
bool startEdit = workspaceEdit.IsBeingEdited();
if (!startEdit)
{
workspaceEdit.StartEditing(false);
}
workspaceEdit.StartEditOperation();
//然后获取IFeatureCursor和IFeature:
pFeatureCursor = pFeatureClass.Search(null, false);
pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
//然后用IFeature.set_Value()方法对Feature进行属性表值的修改:
for (int i = 0; i < pFields.FieldCount; i++)
{
string name = dataTable.Columns[i].ColumnName;//获取字段的名称
if (name.Contains("SHAPE") || name.Contains("OBJECTID")) //除了默认的字段外才能修改
continue;
else
pFeature.set_Value(i, dataTable.Rows[row][i]);
}
//修改完成,要用IFeature.store()方法保存:
pFeature.Store();
//然后最好将Feature释放掉,再进行接下来的修改:
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeature);
pFeature = null;
pFeature = pFeatureCursor.NextFeature();
row++;
}
//接下来用IFeatureCursor.Flush():
pFeatureCursor.Flush();
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
//最后停止编辑状态:
workspaceEdit.StopEditOperation();
startEdit = workspaceEdit.IsBeingEdited();
if (!startEdit)
{
workspaceEdit.StopEditing(true);
}
}
#region 辅助私有方法
/// <summary>
/// 显示符合条件的要素
/// </summary>
/// <param name="sMapCtr"></param>
/// <param name="sFlyr"></param>
/// <param name="sFilter"></param>
private static void ShowByFilter(IMapControlDefault sMapCtr, IFeatureLayer sFlyr, string sFilter)
{
IFeatureLayerDefinition pDef = sFlyr as IFeatureLayerDefinition;
pDef.DefinitionExpression = sFilter;
sMapCtr.ActiveView.Refresh();
}
/// <summary>
/// 获取指定名称的矢量图层对象
/// </summary>
/// <param name="layerName">图层名称</param>
/// <returns></returns>
private static IFeatureLayer getFeatureLayer(IMapControlDefault mapControl, string layerName)
{
ILayer layer;
IGeoFeatureLayer featureLayer;
for (int i = 0; i < mapControl.LayerCount; i++)
{
layer = mapControl.get_Layer(i);
if (layer != null && layer.Name == layerName)
{
featureLayer = layer as IGeoFeatureLayer;
return featureLayer;
}
}
return null;
}
#endregion