Пример #1
0
        /// <summary>
        /// 获取要素类对象
        /// </summary>
        /// <param name="dto">参数模型</param>
        /// <returns></returns>
        public virtual TFeatureClass GetFeatureClass(InputFeatureClassDTO dto)
        {
            TWorkspace workspace;

            if (EnumDataSourceType.ENTERPRISE_GEODATABASE == EnumUtil.GetEnumObjByName <EnumDataSourceType>(dto.Source.Type))
            {
                // 企业级数据库连接
                OracleConn conn = JsonConvert.DeserializeObject <OracleConn>(dto.Source.Connection);
                workspace = this.OpenWorkspace(conn);
            }
            else
            {
                LocalConn conn = JsonConvert.DeserializeObject <LocalConn>(dto.Source.Connection);
                conn.Type = EnumUtil.GetEnumObjByName <EnumDataSourceType>(dto.Source.Type);
                workspace = this.OpenWorkspace(conn);
            }
            if (null == workspace)
            {
                throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, "获取源要素类工作空间失败");
            }
            TFeatureClass featureClass = this.GetFeatureClass(workspace, dto.Name);

            if (null == featureClass)
            {
                throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, "获取源要素类对象失败");
            }
            return(featureClass);
        }
Пример #2
0
        public override void Init(IDictionary <string, Property> parameters)
        {
            if (0 == base.InParams?.Count)
            {
                LOG.Error("未设置输入参数");
                throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, "未设置输入参数");
            }
            if (0 == base.OutParams?.Count)
            {
                LOG.Error("未设置输出参数");
                throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, "未设置输出参数");
            }
            if (!parameters.ContainsKey(nameof(this.SourceFeatureClass)))
            {
                LOG.Error($"缺失参数[{nameof(this.SourceFeatureClass)}]");
                throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"缺失参数[{nameof(this.SourceFeatureClass)}]");
            }
            if (!parameters.ContainsKey(nameof(this.TargetFeatureClass)))
            {
                LOG.Error($"缺失参数[{nameof(this.SourceFeatureClass)}]");
                throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"缺失参数[{nameof(this.TargetFeatureClass)}]");
            }
            if (!parameters.ContainsKey(nameof(this.AnalysisType)))
            {
                LOG.Error($"缺失参数[{nameof(this.AnalysisType)}]");
                throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"缺失参数[{nameof(this.AnalysisType)}]");
            }
            if (parameters.ContainsKey(nameof(IsClearTemp)))
            {
                this.IsClearTemp = Boolean.Parse(parameters[nameof(IsClearTemp)].ToString());
            }
            // 从步骤层传过来的数据已经被格式化成对象了(JSON->实体对象)
            this.sourceFeatureClassDTO = (InputFeatureClassDTO)parameters[nameof(this.SourceFeatureClass)].Value; //JsonConvert.DeserializeObject<InputFeatureClassDTO>(parameters[nameof(this.SourceFeatureClass)].ToString());
            this.targetFeatureClassDTO = (InputFeatureClassDTO)parameters[nameof(this.TargetFeatureClass)].Value; //JsonConvert.DeserializeObject<InputFeatureClassDTO>(parameters[nameof(this.TargetFeatureClass)].ToString());
            this.AnalysisType          = EnumUtil.GetEnumObjByValue <AnalysisType>(int.Parse(parameters[nameof(this.AnalysisType)].Value.ToString()));

            base.InitComplete = true;
        }
Пример #3
0
        public Result Run()
        {
            // 找到算法输入依赖的算法实体
            AlgorithmDTO dto = this.ruleStepMeta.GetAlgorithm();
            // 找到这个步骤注入的参数值
            var db = base.repository.GetDbContext();
            List <DmeRuleStepAttribute> stepAttributes = db.Queryable <DmeRuleStepAttribute>().Where(rsa => rsa.RuleStepId == this.step.Id).ToList();

            if (0 == stepAttributes?.Count)
            {
                LOG.Warn("没有找到步骤关联的参数设置,停止执行");
                return(new Result(EnumSystemStatusCode.DME_FAIL, "没有找到步骤关联的参数设置,停止执行", null));
            }
            IDictionary <string, Property> inputParams = dto.AlgorithmInstance.InParams;
            // 载入参数值
            IDictionary <string, Property> paraValues = new Dictionary <string, Property>();

            foreach (var item in stepAttributes)
            {
                if (!inputParams.ContainsKey(item.AttributeCode))
                {
                    continue;
                }
                Property inputParaProperty = inputParams[item.AttributeCode];
                if (1 == item.IsNeedPrecursor)
                {
                    // 前驱参数
                    if (null == item.AttributeValue ||
                        string.IsNullOrEmpty(item.AttributeValue.ToString()) ||
                        !item.AttributeValue.ToString().Contains(":"))
                    {
                        throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"步骤[{step.SysCode}]的参数[{item.AttributeCode}]无效,值[{inputParaProperty.Value}]");
                    }
                    string preStepName      = item.AttributeValue.ToString().Split(":")[0];
                    string preAttributeName = item.AttributeValue.ToString().Split(":")[1];
                    DmeRuleStepAttribute preRuleStepAttribute = db.Queryable <DmeRuleStepAttribute, DmeRuleStep> ((rsa, rs) => new object[] { rs.Id == rsa.RuleStepId })
                                                                .Where((rsa, rs) => rs.ModelId == step.ModelId && rs.Name == preStepName && rsa.AttributeCode == preAttributeName)
                                                                .Single();
                    if (null == preRuleStepAttribute)
                    {
                        throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"步骤[{step.SysCode}]的参数[{item.AttributeCode}]无效,找不到前驱参数信息");
                    }
                    paraValues[item.AttributeCode] = base.GetStepAttributeValue(preStepName, preAttributeName);// new Property(item.AttributeCode, item.AttributeCode, EnumValueMetaType.TYPE_UNKNOWN, preRuleStepAttribute.AttributeValue);
                }
                else
                {
                    if (inputParaProperty.DataType == (int)EnumValueMetaType.TYPE_FEATURECLASS)
                    {
                        // 这种类型,要注意解析数据源
                        JObject featureClassJson = JObject.Parse(item.AttributeValue.ToString());
                        string  featureClassName = featureClassJson.GetValue("name").Value <string>();
                        string  sourceId         = featureClassJson.GetValue("source").Value <string>();
                        // 根据sourceId查找数据源实体
                        DmeDataSource dataSource = base.repository.GetDbContext().Queryable <DmeDataSource>().Single(ds => ds.SysCode == sourceId);

                        InputFeatureClassDTO inputFeatureClassDTO = new InputFeatureClassDTO
                        {
                            Name   = featureClassName,
                            Source = ClassValueCopier <DataSourceDTO> .Copy(dataSource)
                        };
                        paraValues[item.AttributeCode] = new Property(item.AttributeCode, item.AttributeCode, EnumValueMetaType.TYPE_OBJECT, inputFeatureClassDTO);
                    }
                    else
                    {
                        paraValues[item.AttributeCode] = new Property(item.AttributeCode, item.AttributeCode, EnumValueMetaType.TYPE_UNKNOWN, item.AttributeValue);
                    }
                }
            }

            dto.AlgorithmInstance.Init(paraValues);
            Result result = dto.AlgorithmInstance.Execute();

            // 保存输出
            if (result != null && EnumUtil.GetEnumDisplayName(EnumSystemStatusCode.DME_SUCCESS).Equals(result.Status))
            {
                base.SaveOutput(dto.AlgorithmInstance.OutParams);
                return(new Result(EnumSystemStatusCode.DME_SUCCESS, "执行完毕", true));
            }
            return(new Result(EnumSystemStatusCode.DME_FAIL, "执行失败,无异常信息", false));
        }