700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C# 基于AE的GIS二次开发 要素查询操作 属性表查询操作及其属性表修改操作

C# 基于AE的GIS二次开发 要素查询操作 属性表查询操作及其属性表修改操作

时间:2023-04-21 02:51:36

相关推荐

C#  基于AE的GIS二次开发   要素查询操作 属性表查询操作及其属性表修改操作

直接上代码:

要素查询 并高亮显示

模糊查询我的根据自己的表设计的,自己用基本语句是

属性表字段 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 '**' 省份 provincetry{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);//对要素高亮显示elseShowByFilter(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();//建立一个tablestring 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();//建立一个tableint 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();//建立一个tableint 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;elsepFeature.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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。