예제 #1
0
        /// <summary>
        /// 生成检查数据库(Base库和Query库)
        /// </summary>
        /// <param name="strTaskPath">任务所在路径</param>
        /// <param name="strTaskName"></param>
        /// <param name="baseUseSource"></param>
        /// <param name="queryUseBase"></param>
        /// <param name="errMsg"></param>
        /// <returns></returns>
        public static bool CreateCheckDB(string strTaskPath, string strTaskName, bool baseUseSource, bool queryUseBase, ref string errMsg)
        {
            string strPath = strTaskPath + "\\" + strTaskName;

            // Base 库
            if (!baseUseSource)
            {
                if (!AEAccessFactory.CreateFGDB(strPath, COMMONCONST.DB_Name_Base))
                {
                    errMsg = "创建Base库时出错";
                    return(false);
                }
            }

            // Query
            if (!queryUseBase)
            {
                if (!AEAccessFactory.CreatePGDB(strPath, COMMONCONST.DB_Name_Query))
                {
                    errMsg = "创建Query库出错";
                    return(false);
                }
            }

            return(true);
        }
예제 #2
0
        protected override IFeatureDataset CreateFeatureDataset(IWorkspace wsTarget, ISpatialReference pSpatialRef)
        {
            if (wsTarget == null)
            {
                return(null);
            }

            ISpatialReference spatialRef = pSpatialRef;

            if (spatialRef == null)
            {
                if (!string.IsNullOrEmpty(this.ReferenceLayer))
                {
                    IWorkspace  wsSource   = AEAccessFactory.OpenWorkspace(this.m_DataType, this.m_Datasource);
                    IGeoDataset geoDataset = null;
                    // Shp判断使用Try Catch
                    if (this.m_DataType == enumDataType.SHP)
                    {
                        try
                        {
                            geoDataset = (wsSource as IFeatureWorkspace).OpenFeatureClass(this.ReferenceLayer) as IGeoDataset;
                        }
                        catch
                        {
                        }
                    }
                    else
                    {
                        if ((wsSource as IWorkspace2).get_NameExists(esriDatasetType.esriDTFeatureClass, this.ReferenceLayer))
                        {
                            geoDataset = (wsSource as IFeatureWorkspace).OpenFeatureClass(this.ReferenceLayer) as IGeoDataset;
                        }
                        else if ((wsSource as IWorkspace2).get_NameExists(esriDatasetType.esriDTFeatureDataset, this.ReferenceLayer))
                        {
                            geoDataset = (wsSource as IFeatureWorkspace).OpenFeatureDataset(this.ReferenceLayer) as IGeoDataset;
                        }
                    }

                    if (geoDataset != null)
                    {
                        spatialRef = geoDataset.SpatialReference;
                    }
                    else
                    {
                        SendMessage(enumMessageType.Exception, "NoReferenceDataImport调用错误:数据源中未找到指定的空间参考图层,将按未知参考创建“Dataset”");
                    }
                }
                else
                {
                    SendMessage(enumMessageType.Exception, "NoReferenceDataImport调用错误:未指定空间参考图层,将按未知参考创建“Dataset”");
                }
            }

            return(base.CreateFeatureDataset(wsTarget, spatialRef));
        }
예제 #3
0
        private bool PrepareForTable(IDataset dsTarget, out string strBaseName, out string strQueryName)
        {
            strQueryName = strBaseName = "Base.mdb";
            try
            {
                AEAccessFactory.CreateFGDB(TempPath, strBaseName);
                IWorkspace wsBase = AEAccessFactory.OpenWorkspace(enumDataType.FileGDB, string.Format("{0}\\{1}", TempPath, strBaseName));
                GPTool     gpTool = new GPTool();
                DataConverter.ConvertTable(dsTarget.Workspace, wsBase, dsTarget, dsTarget.Name);

                return(true);
            }
            catch
            {
                return(false);
            }
        }
예제 #4
0
        /// <summary>
        /// (从数据源)导入到Base库,并返回Base库Workspace对象
        /// </summary>
        /// <param name="wsSource"></param>
        /// <returns></returns>
        protected virtual bool ImportToBase(ref IWorkspace wsBase)
        {
            // 直接复制的方式
            if (m_JustCopy)
            {
                return(CopyToBase(ref wsBase));
            }

            // 导入的方式
            string strWorkspace = this.m_TargetPath + "\\" + COMMONCONST.DB_Name_Base;

            if (!Hy.Common.Utility.Esri.AEAccessFactory.OpenFGDB(ref wsBase, strWorkspace))
            {
                SendMessage(enumMessageType.Exception, "导入数据失败:无法打开Base库,请确认在创建任务文件结构时已创建Base库");
                return(false);
            }// Hy.Common.Utility.Esri.AEAccessFactory.CreateFGDB(this.m_TargetPath, COMMONCONST.DB_Name_Base);
            IFeatureDataset fdsTarget = CreateFeatureDataset(wsBase, this.m_SpatialReference);

            if (fdsTarget == null)
            {
                SendMessage(enumMessageType.Exception, "“Dataset”没有创建成功,无法继续导入");
                return(false);
            }
            Hy.Common.Utility.Esri.GPTool gpTool = new Hy.Common.Utility.Esri.GPTool();

            // 打开数据源
            IWorkspace wsSource = null;

            try
            {
                wsSource = AEAccessFactory.OpenWorkspace(this.m_DataType, this.m_Datasource);
                if (wsSource == null)
                {
                    SendMessage(enumMessageType.Exception, "打开数据源出错");
                    return(false);
                }

                // 获取FeatureClass名列表
                IEnumDataset enDataset = wsSource.get_Datasets(esriDatasetType.esriDTAny);
                IDataset     dataset   = enDataset.Next();
                while (dataset != null)
                {
                    switch (dataset.Type)
                    {
                    case esriDatasetType.esriDTTable:
                        SendEvent(dataset.Name);
                        Hy.Common.Utility.Esri.DataConverter.ConvertTable(wsSource, wsBase, dataset, GetObjectName(dataset.Name));
                        break;

                    case esriDatasetType.esriDTFeatureClass:
                        SendEvent(dataset.Name);
                        gpTool.CopyFeatureClass(string.Format("{0}\\{1}", this.m_Datasource, dataset.Name + (this.m_DataType == enumDataType.SHP ? ".shp" : "")), string.Format("{0}\\{1}\\{2}", strWorkspace, fdsTarget.Name, GetObjectName(dataset.Name)));
                        //Hy.Common.Utility.Esri.DataConverter.ConvertFeatureClass(wsSource as IDataset,fdsTarget as IDataset, dataset as IFeatureClass, GetObjectName(dataset.Name));
                        break;

                    case esriDatasetType.esriDTFeatureDataset:
                        IFeatureClassContainer fsContainer = dataset as IFeatureClassContainer;
                        for (int i = 0; i < fsContainer.ClassCount; i++)
                        {
                            string strFcName = (fsContainer.get_Class(i) as IDataset).Name;
                            SendEvent(strFcName);
                            gpTool.CopyFeatureClass(string.Format("{0}\\{1}\\{2}", this.m_Datasource, dataset.Name, strFcName), string.Format("{0}\\{1}\\{2}", strWorkspace, fdsTarget.Name, GetObjectName(strFcName)));
                            //Hy.Common.Utility.Esri.DataConverter.ConvertFeatureClass(dataset, fdsTarget as IDataset, fsContainer.get_Class(i), (fsContainer.get_Class(i) as IDataset).Name);
                        }

                        break;

                    default: break;
                    }

                    dataset = enDataset.Next();
                }

                // 释放
                enDataset = null;
                dataset   = null;

                // 改别名
                this.RenameClassObjects(wsBase);
            }
            catch (Exception exp)
            {
                SendMessage(enumMessageType.Exception, "导入Base库出错:" + exp.ToString());
            }
            finally
            {
                if (wsSource != null)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(wsSource);
                    wsSource = null;
                }
            }

            return(true);
        }
예제 #5
0
        private bool CopyToBase(ref IWorkspace wsBase)
        {
            // VCT数据不允许直接复制
            if (m_DataType == enumDataType.VCT)
            {
                SendMessage(enumMessageType.Exception, "导入VCT数据不允许直接复制");

                return(false);
            }

            //if (ImportingObjectChanged != null)
            //{
            //    ImportingObjectChanged("数据复制");
            //}

            // MDB使用文件复制
            if (m_DataType == enumDataType.PGDB)
            {
                try
                {
                    string strDBPath = this.m_TargetPath + "\\Base.MDB";
                    System.IO.File.Copy(this.m_Datasource, strDBPath);//+ COMMONCONST.DB_Name_Base);

                    if (!Hy.Common.Utility.Esri.AEAccessFactory.OpenPGDB(ref wsBase, strDBPath))
                    {
                        SendMessage(enumMessageType.Exception, "导入数据(复制文件)后打开出错,请确认数据源为正确的PGDB文件");
                        return(false);
                    }
                }
                catch
                {
                    SendMessage(enumMessageType.Exception, "导入数据(复制文件)出错");

                    return(false);
                }
            }
            else // Shp和FileGDB使用文件夹复制
            {
                try
                {
                    string strFolderName = "Base";
                    if (m_DataType == enumDataType.SHP)
                    {
                        strFolderName = "Base";
                        CopyDirectory(this.m_Datasource, this.m_TargetPath, strFolderName);
                    }
                    else
                    {
                        strFolderName = COMMONCONST.DB_Name_Base;
                        Hy.Common.Utility.Esri.GPTool gpTool = new Hy.Common.Utility.Esri.GPTool();
                        gpTool.Copy(this.m_Datasource, this.m_TargetPath + "\\" + strFolderName);
                    }

                    wsBase = AEAccessFactory.OpenWorkspace(m_DataType, this.m_TargetPath + "\\" + strFolderName);
                }
                catch
                {
                    SendMessage(enumMessageType.Exception, "导入数据(复制文件夹)出错");

                    return(false);
                }
            }

            return(true);
        }
예제 #6
0
        private bool PrepareForWorkspace(IWorkspace wsTarget, out string strBaseName, out string strQueryName, out enumDataType baseDataType)
        {
            strBaseName  = null;
            strQueryName = null;
            baseDataType = enumDataType.FileGDB;

            try
            {
                string      strPath    = wsTarget.PathName;
                IDataImport dataImport = new NoReferenceDataImport();
                dataImport.ImportingObjectChanged += new ImportingObjectChangedHandler(DataImport_ImportingObjectChanged);
                dataImport.Datasource              = strPath;
                dataImport.TargetPath              = TempPath;
                dataImport.JustCopy = true;

                // 获取空间参考
                ISpatialReference spatialRef = null;
                IEnumDataset      enDataset  = wsTarget.get_Datasets(esriDatasetType.esriDTAny);
                IDataset          dsCurrent  = enDataset.Next();
                while (dsCurrent != null)
                {
                    if (dsCurrent is IGeoDataset)
                    {
                        spatialRef = (dsCurrent as IGeoDataset).SpatialReference;
                        break;
                    }

                    dsCurrent = enDataset.Next();
                }
                dataImport.SpatialReference = spatialRef;
                enumDataType dataType = enumDataType.PGDB;

                // 设置数据类型
                string strName = System.IO.Path.GetExtension(strPath);
                if (string.IsNullOrEmpty(strName))  // Shp File
                {
                    dataType = enumDataType.SHP;
                }
                else if (strName.ToLower() == ".gdb")
                {
                    dataType = enumDataType.FileGDB;
                }
                else // MDB
                {
                    dataType = enumDataType.PGDB;
                }
                dataImport.DataType = dataType;
                if (dataType != enumDataType.PGDB)
                {
                    AEAccessFactory.CreatePGDB(TempPath, "Query.mdb");
                }

                dataImport.Import();

                // 获取Base/Query库Workspace和ADO连接
                strBaseName  = (dataType == enumDataType.PGDB ? "Base.mdb" : (dataType == enumDataType.FileGDB ? "Base.gdb" : "Base"));
                strQueryName = (dataType == enumDataType.PGDB ? strBaseName : "Query.mdb");
                baseDataType = dataType;

                return(true);
            }
            catch
            {
                return(false);
            }
        }
예제 #7
0
        /// <summary>
        /// 使用统一入口进行质检
        /// </summary>
        /// <param name="dsTarget">可以是IWorkspace,IFeatureClass或ITable</param>
        /// <returns></returns>
        public DataTable Check(IDataset dsTarget)
        {
            // 数据导入
            string       strBaseName  = "Base.gdb";
            string       strQueryDB   = "Base.mdb";
            bool         ready        = false;
            enumDataType baseDataType = enumDataType.FileGDB;

            SendCheckingMessage("正在进行数据导入…");

            try
            {
                Clear();
                if (dsTarget is IWorkspace)
                {
                    ready = PrepareForWorkspace(dsTarget as IWorkspace, out strBaseName, out strQueryDB, out baseDataType);
                }
                else if (dsTarget is IFeatureClass)
                {
                    ready        = PrepareForFeatureClass(dsTarget, out strBaseName, out strQueryDB);
                    baseDataType = enumDataType.PGDB;
                }
                else if (dsTarget is ITable)
                {
                    ready        = PrepareForTable(dsTarget, out strBaseName, out strQueryDB);
                    baseDataType = enumDataType.PGDB;
                }


                if (!ready)
                {
                }

                // 开始准备检查

                string        strBaseFullName  = string.Format("{0}\\{1}", TempPath, strBaseName);
                string        strQueryFullName = string.Format("{0}\\{1}", TempPath, strQueryDB);
                IWorkspace    wsBase           = AEAccessFactory.OpenWorkspace(baseDataType, strBaseFullName);
                IWorkspace    wsQuery          = AEAccessFactory.OpenWorkspace(enumDataType.PGDB, strQueryFullName);
                IDbConnection queryConnection  = AdoDbHelper.GetDbConnection(strQueryFullName);

                // 开始执行检查
                Checker curChecker = new Checker();
                curChecker.VerifyingRuleChanged   += new DealingRuleChangedHandler(VerifyingRuleChanged);
                curChecker.VerifyedComplete       += new VerifyedCompleteHandler(VerifyedComplete);
                curChecker.PretreatingRuleChanged += new DealingRuleChangedHandler(PretreatingRuleChanged);
                curChecker.PretreatComplete       += new CheckEventHandler(PretreatComplete);
                curChecker.CheckingRuleChanged    += new DealingRuleChangedHandler(CheckingRuleChanged);
                curChecker.CheckComplete          += new CheckEventHandler(CheckComplete);
                curChecker.RuleChecked            += new RuleCheckedHandler(RuleChecked);
                curChecker.TopoRuleCheckBegin     += new CheckEventHandler(TopoRuleCheckBegin);

                curChecker.BaseWorkspace   = wsBase;
                curChecker.QueryWorkspace  = wsQuery;
                curChecker.QueryConnection = queryConnection;
                curChecker.ResultPath      = TempPath;
                // 如果没有设置SchemaID,获取第一个
                // 如果没有设置RuleInfo列表,获取所有
                if (string.IsNullOrEmpty(this.SchemaID))
                {
                    Dictionary <int, string> dictStandard = SysDbHelper.GetStandardInfo();
                    if (dictStandard == null || dictStandard.Count == 0)
                    {
                        return(null);
                    }

                    Dictionary <string, string> dictSchema = SysDbHelper.GetSchemasInfo(dictStandard.ElementAt(0).Value);
                    if (dictSchema == null || dictSchema.Count == 0)
                    {
                        return(null);
                    }

                    this.SchemaID = dictSchema.ElementAt(0).Key;
                }
                if (this.RuleInfos == null)
                {
                    TemplateRules templateRule = new TemplateRules(this.SchemaID);
                    this.RuleInfos = templateRule.CurrentSchemaRules;
                }

                curChecker.RuleInfos     = this.RuleInfos;
                curChecker.SchemaID      = this.SchemaID;
                curChecker.TopoDBPath    = TempPath;
                curChecker.TopoTolerance = this.TopoTolerence;

                COMMONCONST.TOPOTOLORANCE = this.TopoTolerence;
                COMMONCONST.dAreaThread   = this.MapScale * 0.04;
                COMMONCONST.dLengthThread = this.MapScale * 0.2 / 10000;

                //SendCheckBeginEvent(curChecker);

                curChecker.Check();            // 检查

                // 获取结果
                string        strResultFullName = string.Format("{0}\\{1}", TempPath, "Result.mdb");
                IDbConnection resultConnection  = AdoDbHelper.GetDbConnection(strResultFullName);

                return(GetErrors(resultConnection));
            }
            catch
            {
                return(null);
            }
            finally
            {
                GC.Collect();

                //Clear();
            }
        }