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 '**' 省份  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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DXnima

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值