GIS

ArcObject : FeatureClass , Feature, Table 의 Domain(도메인)값 찾아서 가져오기-C#

조심이 2010. 12. 6. 16:56
반응형

공간정보에서 피쳐클래스나 속성테이블의 필드에 Domain을 사용하였을 경우
해당 값(코드정보등..)의 Domain 값을 찾아 반환해주는 함수이다.

만약 도메인에 구성된 값이 아닐경우에는 그냥 본래의 값을 반환한다.

만약 도메인 값 리스트를 뽑고 싶으면 소스에서 반환타입과 비교절을 적절히 사용하면 됨.

아래의 함수는 피쳐에 도메인 값을 반환하는 경우인데 만약 일반 속성테이블이나 
피쳐클래쓰라면  빨간색으로 써논 부분을 참고해서 사용하면 된다. 

using ESRI.ArcGIS.Geodatabase;

        /// <summary>
        /// 도메인 이름 가져오기
        /// </summary>
        /// <param name="pFeature"> 피쳐</param>
        /// <param name="fieldName">필드이름</param>
        /// <param name="domainCode">필드값</param>
        /// <returns></returns>
        public string FindDominValue(IFeature pFeature, string fieldName, string domainCode)
       public string FindDominValue(IRow pRow, string fieldName, string domainCode)
       public string FindDominValue(IFeatureClass pFeatureClass, string fieldName, string domainCode)

        {
            string domainValue = domainCode;

            IObjectClass pObjectClass = null; ;
            IValidation pValidation = null; ;
            IEnumRule pEnumRule = null;
            IRule pRule = null;
            IAttributeRule pAttributeRule = null;
            IDomain pDomin = null;
            ISubtypes pSubtypes =null;
            ICodedValueDomain pCodedValueDomain = null;

            try
            {
                pObjectClass = pFeature.Class;
             /*
             - IRow 경우
             pObjectClass = pRow as IObjectClass;
             
             -IFeatureClass 경우
               pObjectClass = pFeatureClass;
     
            로 각각 맞춰서 사용하면 됨.
            쉽죠잉~
           */
                pValidation = pObjectClass as IValidation;

                pEnumRule = pValidation.get_RulesByField(fieldName);
                if (pEnumRule != null)
                {
                    pEnumRule.Reset();
                    pRule = pEnumRule.Next();

                    if (pRule != null)
                    {
                        if (pRule.Type == esriRuleType.esriRTAttribute)
                        {
                            pAttributeRule = pRule as IAttributeRule;
                            pSubtypes = pObjectClass as ISubtypes;

                            pDomin = pSubtypes.get_Domain(pAttributeRule.SubtypeCode, pAttributeRule.FieldName);
                            if (pDomin != null)
                            {
                                if (pDomin.Type == esriDomainType.esriDTCodedValue)
                                {
                                    pCodedValueDomain = pDomin as ICodedValueDomain;

                                    int iCodeCount = 0;

                                    iCodeCount = pCodedValueDomain.CodeCount;

                                    for (int i = 0; i < iCodeCount; i++)
                                    {
                                        if (domainCode.Equals(pCodedValueDomain.get_Value(i) as string))
                                        {
                                            domainValue = pCodedValueDomain.get_Name(i) as string;
                                        }
                                    }
                                }
                            }
                        }
                       
                    }
                }

                 pObjectClass = null; ;
                 pValidation = null; ;
                 pEnumRule = null;
                 pRule = null;
                 pAttributeRule = null;
                 pDomin = null;
                 pSubtypes = null;
                 pCodedValueDomain = null;
            }
            catch (Exception ex)
            {
                return domainValue;
            }

            return domainValue;
        }

반응형