public override Result Execute() { if (!base.InitComplete) { throw new BusinessException((int)EnumSystemStatusCode.DME_FAIL_INIT, "初始化工作未完成"); } DMEWorkspaceBridge <IWorkspace, IFeatureClass> dmeWorkspaceBridge = new DMEWorkspaceBridge <IWorkspace, IFeatureClass>(); dmeWorkspaceBridge.SetWorkspace(new EsriWorkspace()); // 目前先以ORACLE和MDB为数据源类型 // 获取source feature class this.SourceFeatureClass = dmeWorkspaceBridge.GetFeatureClass(this.sourceFeatureClassDTO); // 获取target feature class this.TargetFeatureClass = dmeWorkspaceBridge.GetFeatureClass(this.targetFeatureClassDTO); if (AnalysisType.COVER == this.AnalysisType) { OverlayCommonTool.GetTopounionGeometryByQuery(this.SourceFeatureClass, null, null, esriSpatialRelEnum.esriSpatialRelUndefined, out IGeometry sourceGeom, out IList <string> oidList); //找出touch的要素oid,排除掉touch的图形 OverlayCommonTool.GetTopounionGeometryByQuery(this.TargetFeatureClass, null, sourceGeom, esriSpatialRelEnum.esriSpatialRelTouches, out IGeometry touchGeom, out IList <string> touchOIDList); //通过intersect查找压盖部分的要素 string queryClause = null; if (touchOIDList != null && touchOIDList.Count > 0) { queryClause = $"OBJECTID NOT in ({string.Join(",", ((List<string>)touchOIDList).ToArray())})"; } // 求取空间相交的部分 OverlayCommonTool.GetIntersectFeaturesByQuery(this.TargetFeatureClass, queryClause, sourceGeom, out IList <IntersectFeatureDTO> intersectFeatureDTOs, out double sumIntersectArea); if (intersectFeatureDTOs?.Count > 0) { OverlayRespDTO overlayRespDTO = new OverlayRespDTO { SumArea = sumIntersectArea }; foreach (var item in intersectFeatureDTOs) { FeatureRespDTO intersectFeatureRespDTO = new FeatureRespDTO { OID = item.OID, Area = item.Area, Coordinates = item.Coordinates, GeoType = item.GeoType }; overlayRespDTO.Features.Add(intersectFeatureRespDTO); } Property resultProp = base.OutputParametersMeta[nameof(Result)]; resultProp.Value = overlayRespDTO; return(new Result(EnumSystemStatusCode.DME_SUCCESS, "运行完成", EnumSystemStatusCode.DME_SUCCESS, null)); } } else if (AnalysisType.OVERTOP == this.AnalysisType) { // 先拷贝一份mdb模板 string sTemplate = System.AppDomain.CurrentDomain.BaseDirectory + GlobalSystemConfig.PATH_TEMPLATE_PGDB;// @"\template\pgdb.mdb"; string sPath = System.AppDomain.CurrentDomain.BaseDirectory + GlobalSystemConfig.DIR_TEMP + "/" + GuidUtil.NewGuid() + ".mdb"; File.Copy(sTemplate, sPath); IWorkspace mdbWorkspace = WorkspaceUtil.OpenMdbWorspace(sPath); if (FeatureClassUtil.ExportToWorkspace(this.SourceFeatureClass, mdbWorkspace)) { // 获取导出的临时要素类信息 IFeatureClass tempExpFeatureClass = WorkspaceUtil.GetFeatureClass(mdbWorkspace, this.sourceFeatureClassDTO.Name); // 进行擦除操作 OverlayCommonTool.Erase(tempExpFeatureClass, this.TargetFeatureClass); // 计算完保存结果,如何保存? if (tempExpFeatureClass != null) { OverlayRespDTO overlayRespDTO = new OverlayRespDTO(); // 总面积 double sumArea = 0; IFeatureCursor pFeatureCursor = tempExpFeatureClass.Search(null, false); IFeature pFeature = null; //获得“Area”字段 //IFields fields = pFeatureCursor.Fields; //int areaIndex = fields.FindField("Area"); while ((pFeature = pFeatureCursor.NextFeature()) != null) { double area = ((IArea)pFeature.Shape).Area;// (double)pFeature.get_Value(areaIndex); sumArea += area; FeatureRespDTO featureRespDTO = new FeatureRespDTO { OID = pFeature.OID, Area = area, Coordinates = GeometryUtil.ConvertGeometryToJson(pFeature.Shape, out string msg) }; overlayRespDTO.Features.Add(featureRespDTO); pFeature = pFeatureCursor.NextFeature(); } overlayRespDTO.SumArea = sumArea; Property resultProp = base.OutputParametersMeta[nameof(Result)]; resultProp.Value = overlayRespDTO; return(new Result(EnumSystemStatusCode.DME_SUCCESS, "运行完成", EnumSystemStatusCode.DME_SUCCESS, null)); } } // 删除临时文件 if (IsClearTemp && File.Exists(sPath)) { File.Delete(sPath); } } else { throw new BusinessException((int)EnumSystemStatusCode.DME_FAIL, "分析类型不匹配"); } return(new Result(EnumSystemStatusCode.DME_SUCCESS, "运行完成,但没有运算结果", EnumSystemStatusCode.DME_SUCCESS, null)); }
public override IFeatureClass GetFeatureClass(IWorkspace workspace, string featureClassName) { return(WorkspaceUtil.GetFeatureClass(workspace, featureClassName)); }