Example #1
0
        /// <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)}抛异常");
            }
        }
Example #2
0
        /// <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);
            }
        }
Example #3
0
        /// <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);
            }
        }