/// <summary> /// 获取topo下的geometry union的数据 /// </summary> /// <param name="featureClass">源要素类</param> /// <param name="queryClause">查询条件</param> /// <param name="queryGeometry">指定范围下</param> /// <param name="spatialRelType">空间参考类型</param> /// <param name="topoUnionGeometry">输出topo union后的geometry</param> /// <param name="oidList">输出OID集合</param> /// <param name="geometryField">geometry字段名称,默认为Shape</param> public static void GetTopounionGeometryByQuery(IFeatureClass featureClass, String queryClause, IGeometry queryGeometry, esriSpatialRelEnum spatialRelType, out IGeometry topoUnionGeometry, out IList <string> oidList, string geometryField = "Shape") { List <IFeature> featureList = new List <IFeature>(); topoUnionGeometry = null; oidList = new List <string>(); try { ISpatialFilter spatialFilter = new SpatialFilter(); if (!string.IsNullOrEmpty(queryClause)) { spatialFilter.WhereClause = queryClause; } if (!string.IsNullOrEmpty(geometryField)) { spatialFilter.GeometryField = geometryField; } if (queryGeometry != null) { spatialFilter.Geometry = queryGeometry; spatialFilter.SpatialRel = spatialRelType; } ITopologicalOperator topologicalOperator = null; IFeatureCursor featureCursor = featureClass.Search(spatialFilter, false); IFeature feature = featureCursor.NextFeature(); IGeometry geometryTemp; while (feature != null) { geometryTemp = feature.Shape; // feature.ShapeCopy; if (topologicalOperator == null) { topologicalOperator = geometryTemp as ITopologicalOperator; } else { topologicalOperator = topologicalOperator.Union(geometryTemp) as ITopologicalOperator; } oidList.Add(feature.OID.ToString()); featureList.Add(feature); feature = featureCursor.NextFeature(); } topoUnionGeometry = topologicalOperator as IGeometry; WorkspaceUtil.ReleaseComObject(featureCursor); } catch (Exception e) { LOG.Error(e, $"{nameof(GetTopounionGeometryByQuery)}抛异常"); } }
/// <summary> /// 两个要素类进行擦除操作 /// </summary> /// <param name="sourceFeatureClass">源要素类</param> /// <param name="eraseFeatureClass">用于擦除的要素类,必须是个面要素类</param> public static void Erase(IFeatureClass sourceFeatureClass, IFeatureClass eraseFeatureClass) { if (eraseFeatureClass.ShapeType != esriGeometryType.esriGeometryPolygon) { throw new Exception("EraseFeatureClass不是个面要素类"); } if (esriGeometryType.esriGeometryPoint == sourceFeatureClass.ShapeType) { throw new Exception("SourceFeatureClass不能是个点要素类"); } // 先要临时复制一个要素类 // 遍历用于擦除的要素 IFeatureCursor eraseFeatureCursor = eraseFeatureClass.Search(null, false); IFeature eraseFeature = null; while ((eraseFeature = eraseFeatureCursor.NextFeature()) != null) { ISpatialFilter spatialFilter = new SpatialFilterClass { Geometry = eraseFeature.Shape, SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects }; IFeatureCursor sourceFeatureCursor = sourceFeatureClass.Update(spatialFilter, false); IFeature sourceFeature = null; while ((sourceFeature = sourceFeatureCursor.NextFeature()) != null) { IGeometry geometry = sourceFeature.ShapeCopy; ITopologicalOperator topoOper = geometry as ITopologicalOperator; IGeometry geoDifference = topoOper.Difference(eraseFeature.Shape); sourceFeature.Shape = geoDifference; sourceFeatureCursor.UpdateFeature(sourceFeature); } // 释放游标 WorkspaceUtil.ReleaseComObject(sourceFeatureCursor); } }
/// <summary> /// 获取指定空间范围下相交的要素集合 /// </summary> /// <param name="featureClass">被查询要素类</param> /// <param name="queryClause">查询条件</param> /// <param name="queryGeometry">指定空间范围</param> /// <param name="intersectFeatureDTOs">输出相交要素信息</param> /// <param name="sumIntersectArea">输出相交部分的总面积</param> /// <param name="geometryField">geometry字段名称,默认为Shape</param> public static void GetIntersectFeaturesByQuery(IFeatureClass featureClass, string queryClause, IGeometry queryGeometry, out IList <IntersectFeatureDTO> intersectFeatureDTOs, out double sumIntersectArea, string geometryField = "Shape") { List <IFeature> featureList = new List <IFeature>(); intersectFeatureDTOs = new List <IntersectFeatureDTO>(); sumIntersectArea = 0d; try { ISpatialFilter spatialFilter = new SpatialFilter(); if (queryClause != null) { spatialFilter.WhereClause = queryClause; } if (queryGeometry != null) { spatialFilter.Geometry = queryGeometry; spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; } if (geometryField != null) { spatialFilter.GeometryField = geometryField; } IFeatureCursor featureCursor = featureClass.Search(spatialFilter, false); IFeature feature = featureCursor.NextFeature(); IntersectFeatureDTO intersectFeatureDTOTemp = null; while (feature != null) { IGeometry intersectGeometry = OverlayCommonTool.GetIntersectGeometry(queryGeometry as IPolygon, feature.Shape as IPolygon); if (null == intersectGeometry || intersectGeometry.IsEmpty) { continue; } intersectFeatureDTOTemp = new IntersectFeatureDTO { Geometry = feature.Shape, OID = feature.OID, Coordinates = GeometryUtil.ConvertGeometryToJson(intersectGeometry, out string message), Area = GeometryUtil.GetArea(intersectGeometry), QueryGeometry = queryGeometry, IntersectGeometry = intersectGeometry, GeoType = EnumUtil.GetEnumName <esriGeometryType>((int)intersectGeometry.GeometryType) }; intersectFeatureDTOs.Add(intersectFeatureDTOTemp); IArea area = intersectGeometry as IArea; double intersectArea = area.Area; sumIntersectArea += intersectArea; featureList.Add(feature); feature = featureCursor.NextFeature(); } WorkspaceUtil.ReleaseComObject(featureCursor); } catch (Exception e) { LOG.Error(e); } }