直接上代碼:
要素查詢 並高亮顯示
模糊查詢我的根據自己的表設計的,自己用基本語句是
屬性表字段 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