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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章