AE属性查询(c#)

上面写了空间查询的小结,属性查询也少不了,已比较复杂的属性查询为示例总结下。
AE属性查询(c) - 一缕阳光 - 一缕阳光
 涉及的思路根据选择矢量数据的比例尺,列出一定比例尺下数据集中的图层列表(图层名、图层别名)--->根据选择的图层,列出该图层的字段列表(考虑到查询语句的通用性,只筛选出string类型的字段名和字段别名)--->输入关键字,进行查询---->列出满足条件的记录结果。
(1)选择数据集图层
        public List<string>  GetLayerByDatasetName (AxMapControl axMapControl,string datasetName)
        {
            IActiveView pActiveView = null;
            ILayer pLayer = null;
            IFeatureLayer pFeatureLayer = null;
            IFeatureClass pFeatureClass = null;
            ICompositeLayer pCompositeLayer = null;
            List<string> lstLayer = null;
            try
            {
                lstLayer = new List<string>();
                pActiveView = axMapControl.ActiveView;
                int LayerCount = pActiveView.FocusMap.LayerCount;
                for (int i = 0; i < LayerCount; i++)
                {
                    pLayer = pActiveView.FocusMap.get_Layer(i);
                    if (pLayer is IGroupLayer)
                    {
                        if (pLayer.Name == datasetName)
                        {
                            pCompositeLayer = pLayer as ICompositeLayer;
                            for (int j = 0; j < pCompositeLayer.Count; j++)
                            {
                                if (pCompositeLayer.get_Layer(j) is IFeatureLayer)
                                {
                                    pFeatureLayer = pCompositeLayer.get_Layer(j) as IFeatureLayer;
                                    pFeatureClass = pFeatureLayer.FeatureClass;
                                    if (pFeatureLayer.Visible)//&& !pFeatureLayer.Name.Contains("DLG")
                                        lstLayer.Add(pFeatureClass.AliasName);
                                }
                            }
                        }                      
                    }                    
                }
            }
            catch (System.Exception ex)
            {
                lstLayer = new List<string>();
                lstLayer.Add("err:" + ex.Message);
            }
            if (pLayer != null)
                Marshal.ReleaseComObject(pLayer);
            if (pFeatureLayer != null)
                Marshal.ReleaseComObject(pFeatureLayer);
            if (pFeatureClass != null)
                Marshal.ReleaseComObject(pFeatureClass);
            if (pCompositeLayer != null)
                Marshal.ReleaseComObject(pCompositeLayer);
            if (pActiveView != null)
                Marshal.ReleaseComObject(pActiveView);
            return lstLayer;
        }
(2)根据图层别名,先获取IFeatureLayer然后列出字段 
        public IFeatureLayer  GetFeatureLayerByName (AxMapControl axMapControl,string layerAliasName)
        {
            IActiveView pActiveView = null;
            ILayer pLayer=null;
            ICompositeLayer pCompositeLayer = null;
            IFeatureLayer pFeatureLayer=null;
            IFeatureClass pFeatureClass = null;
            IFeatureLayer pFeatureLayer_Return = null;
            try
            {
                pActiveView=axMapControl.ActiveView;
                int LayerCount = pActiveView.FocusMap.LayerCount;
                for (int i = 0; i < LayerCount; i++)
                {
                    pLayer = pActiveView.FocusMap.get_Layer(i);
                    if (pLayer is IGroupLayer)
                    {
                        pCompositeLayer = pLayer as ICompositeLayer;
                        for (int j = 0; j < pCompositeLayer.Count; j++)
                        {
                            if (pCompositeLayer.get_Layer(j) is IFeatureLayer)
                            {
                                pFeatureLayer = pCompositeLayer.get_Layer(j) as IFeatureLayer;
                                pFeatureClass = pFeatureLayer.FeatureClass;
                                if (pFeatureClass.AliasName == layerAliasName)
                                {
                                    pFeatureLayer_Return = pFeatureLayer;
                                    if (pLayer != null)
                                        Marshal.ReleaseComObject(pLayer);
                                    if (pFeatureLayer != null)
                                        Marshal.ReleaseComObject(pFeatureLayer);
                                    if (pFeatureClass != null)
                                        Marshal.ReleaseComObject(pFeatureClass);
                                    if (pCompositeLayer != null)
                                        Marshal.ReleaseComObject(pCompositeLayer);
                                    if (pActiveView != null)
                                        Marshal.ReleaseComObject(pActiveView);
                                    return pFeatureLayer_Return;
                                }
                            }
                        }
                    }
                    else if (pLayer is IFeatureLayer)
                    {
                        pFeatureClass = (pLayer as IFeatureLayer).FeatureClass;
                        if (pFeatureClass.AliasName == layerAliasName)
                        {                           
                            pFeatureLayer_Return= pLayer as IFeatureLayer;
                            break;
                        }
                    }
                }
                return pFeatureLayer_Return;
            }
            catch (System.Exception ex)
            {
                if (pLayer != null)
                    Marshal.ReleaseComObject(pLayer);
                if (pFeatureLayer != null)
                    Marshal.ReleaseComObject(pFeatureLayer);
                if (pFeatureClass != null)
                    Marshal.ReleaseComObject(pFeatureClass);
                if (pCompositeLayer != null)
                    Marshal.ReleaseComObject(pCompositeLayer);
                if (pActiveView != null)
                    Marshal.ReleaseComObject(pActiveView);
                return null;
            }
        }
        public List<ClsComboxItem>  QueryFields (IFeatureLayer pFeatureLayer)
        {
            IFeatureClass pFeatureClass = null;
            IFields pFields = null;
            IField pField = null;
            List<ClsComboxItem> lstFields = null;
            ClsComboxItem comboxItem = null;
            try
            {
                lstFields = new List<ClsComboxItem>();
                pFeatureClass = pFeatureLayer.FeatureClass;
                pFields = pFeatureClass.Fields;
                for (int i = 0; i < pFields.FieldCount; i++)
                {
                    pField = pFields.get_Field(i);
                    if(pField.Type==esriFieldType.esriFieldTypeString)
                    {
                        comboxItem = new ClsComboxItem(pField.AliasName, pField.Name);
                        lstFields.Add(comboxItem);
                    }                 
                }
            }
            catch (System.Exception ex)
            {
                lstFields = new List<ClsComboxItem>();
                comboxItem = new ClsComboxItem("err:" + ex.Message, "");
                lstFields.Add(comboxItem);
            }
            if (pField != null)
                Marshal.ReleaseComObject(pField);
            if (pFields != null)
                Marshal.ReleaseComObject(pFields);
            if (pFeatureClass != null)
                Marshal.ReleaseComObject(pFeatureClass);
            return lstFields;
        }
特别要提到的是 ,如何实现将图层名、图层别名,字段名、字段别名,显示别名但与名称相联动呢?自定义了一个类,同时与ComboBox的DisplayMember以及ValueMember结合使用。
自定义的类,类名:  ClsComboxItem
    class ClsComboxItem
    {
        private string strDisplay;
        private string strValue;

        public ClsComboxItem(string m_display,string m_value)
        {
            strDisplay = m_display;
            strValue = m_value;
        }
        public string Display
        {
            get{ return strDisplay;}
        }
        public string Value
        {
            get { return strValue; }
        }
    }
补充二: 由字段列出数据表中唯一值。
        public List<string> GetAllValues(IFeatureLayer pFeatureLayer,string fieldName)
        {
            List<string> lstUniqueValue = new List<string>();
            IFeatureClass pFeatureClass = null;
            IFeatureCursor pFeatureCursor = null;
            IDataStatistics pDataStatistics = null;
            IEnumerator pEnumerator = null;
            try
            {
                pFeatureClass = pFeatureLayer.FeatureClass;
                pFeatureCursor = pFeatureClass.Search(null, false);
                pDataStatistics = new DataStatisticsClass();
                pDataStatistics.Field = fieldName;
                pDataStatistics.Cursor = pFeatureCursor as ICursor;
                pEnumerator = pDataStatistics.UniqueValues;
                pEnumerator.Reset();
                pEnumerator.MoveNext();
                for (int i = 0; i < pDataStatistics.UniqueValueCount;i++ )
                {
                    lstUniqueValue.Add(pEnumerator.Current.ToString());
                    pEnumerator.MoveNext();
                }
                if (pEnumerator != null)
                    Marshal.ReleaseComObject(pEnumerator);
                if (pDataStatistics != null)
                    Marshal.ReleaseComObject(pDataStatistics);
                if (pFeatureCursor != null)
                    Marshal.ReleaseComObject(pFeatureCursor);
                if (pFeatureClass != null)
                    Marshal.ReleaseComObject(pFeatureClass);
                return lstUniqueValue;
            }
            catch (System.Exception ex)
            {
                if (pEnumerator != null)
                    Marshal.ReleaseComObject(pEnumerator);
                if (pDataStatistics != null)
                    Marshal.ReleaseComObject(pDataStatistics);
                if (pFeatureCursor != null)
                    Marshal.ReleaseComObject(pFeatureCursor);
                if (pFeatureClass != null)
                    Marshal.ReleaseComObject(pFeatureClass);
                return null;
            }
        }
(3)输入关键字查询
AE属性查询(c) - 一缕阳光 - 一缕阳光
 
 
            if (this.txtKey.Text == "")
                strKey = "OBJECTID>0";
            else
                strKey = strFieldName+" LIKE '%" + txtKey.Text + "%'";

            this.lstResult.Items.Clear();
            pFC=ClsTFManage.OpenFCbyName(axMapControl, strLayerName);
            lstMatchedResult = layerInfo.GetMatchedValues(pFC, strKey, strFieldName);
            if (lstMatchedResult!=null && lstMatchedResult.Count>0)
            {
                for (int i = 0; i < lstMatchedResult.Count;i++ )
                {
                    lstResult.Items.Add(lstMatchedResult[i][0]);
                    lstResult.Items[i].SubItems.Add(lstMatchedResult[i][1]);
                    lstResult.Items[i].Checked = true;
                }
            }else
            {
                MessageBox.Show("没有匹配的记录,请重新输入关键字.", "提示");
                this.txtKey.Text = "";
                txtKey.Select();
            }   
根据图层别名获取IFeatureClass:
        public static IFeatureClass OpenFCbyName(AxMapControl axMapControl, string layerName)
        {
            IActiveView pActiveView = null;
            ILayer pLayer = null;
            ICompositeLayer pCompositeLayer = null;
            IFeatureLayer pFeatureLayer = null;
            IFeatureClass pFeatureClass = null;
            try
            {
                pActiveView = axMapControl.ActiveView;
                int LayerCount = pActiveView.FocusMap.LayerCount;
                for (int i = 0; i < LayerCount; i++)
                {
                    pLayer = pActiveView.FocusMap.get_Layer(i);
                    if (pLayer is IGroupLayer)
                    {
                        pCompositeLayer = pLayer as ICompositeLayer;
                        for (int j = 0; j < pCompositeLayer.Count; j++)
                        {
                            if (pCompositeLayer.get_Layer(j) is IFeatureLayer)
                            {
                                pFeatureLayer = pCompositeLayer.get_Layer(j) as IFeatureLayer;                                
                                if (pFeatureLayer.Name == layerName)
                                {
                                    pFeatureClass = pFeatureLayer.FeatureClass;
                                    if (pLayer != null)
                                        Marshal.ReleaseComObject(pLayer);
                                    if (pFeatureLayer != null)
                                        Marshal.ReleaseComObject(pFeatureLayer);
                                    if (pCompositeLayer != null)
                                        Marshal.ReleaseComObject(pCompositeLayer);
                                    if (pActiveView != null)
                                        Marshal.ReleaseComObject(pActiveView);
                                    return pFeatureClass;
                                }
                            }
                        }
                    }
                    else if (pLayer is IFeatureLayer)
                    {                        
                        if (pLayer.Name == layerName)
                        {
                            pFeatureClass = (pLayer as IFeatureLayer).FeatureClass;
                            break;
                        }
                    }
                }
                return pFeatureClass;
            }
            catch (System.Exception ex)
            {
                if (pLayer != null)
                    Marshal.ReleaseComObject(pLayer);
                if (pFeatureLayer != null)
                    Marshal.ReleaseComObject(pFeatureLayer);
                if (pCompositeLayer != null)
                    Marshal.ReleaseComObject(pCompositeLayer);
                if (pActiveView != null)
                    Marshal.ReleaseComObject(pActiveView);
                return null;
            }
        }
模糊查询结果:
       public List<string[]> GetMatchedValues(IFeatureClass pFeatureClass, string strQuery,string strFieldName)
        {
            List<string[]> lstValue = null;
            string[] temp = null;
            IQueryFilter pQueryFilter = null;
            IFeatureCursor pFeatureCursor = null;
            IFeature pFeature = null;
            try
            {
                pQueryFilter = new QueryFilterClass();
                pQueryFilter.WhereClause = strQuery;
                pFeatureCursor = pFeatureClass.Search(pQueryFilter, false);
                pFeature = pFeatureCursor.NextFeature();
                lstValue = new List<string[]>();
                while (pFeature != null)
                {
                    temp = new string[2];
                    temp[0] = pFeature.get_Value(pFeature.Fields.FindField("OBJECTID")).ToString();
                    temp[1]=pFeature.get_Value(pFeature.Fields.FindField(strFieldName)).ToString();                    
                    lstValue.Add(temp);
                    pFeature = pFeatureCursor.NextFeature();
                }
                if (pFeature != null)
                    Marshal.ReleaseComObject(pFeature);
                if (pFeatureCursor != null)
                    Marshal.ReleaseComObject(pFeatureCursor);
                if (pQueryFilter != null)
                    Marshal.ReleaseComObject(pQueryFilter);
                return lstValue;
            }
            catch (System.Exception ex)
            {
                if (pFeature != null)
                    Marshal.ReleaseComObject(pFeature);
                if (pFeatureCursor != null)
                    Marshal.ReleaseComObject(pFeatureCursor);
                if (pQueryFilter != null)
                    Marshal.ReleaseComObject(pQueryFilter);
                return null;
            }
        }         
(4)查询结果单击高亮定位
AE属性查询(c) - 一缕阳光 - 一缕阳光
补充一下:
查询中用到IFeatureCursor,要及时释放,因为其设定了最大限定数。
Marshal.ReleaseComObject(pFeatureCursor);

博文地址:http://blog.163.com/liuyang1285@126/blog/static/128913086201082610282340/
转载请注明出处
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值