Ejemplo n.º 1
0
        /// <summary>
        /// 对要素类创建空间缓存
        /// </summary>
        /// <param name="featureClass"></param>
        /// <returns></returns>
        public static ISpatialCacheManager CreateCache(this IFeatureClass featureClass)
        {
            ISpatialCacheManager spatialCacheManager = (ISpatialCacheManager)((IDataset)featureClass).Workspace;//填充Spatial Cache
            IEnvelope            cacheExtent         = ((IGeoDataset)featureClass).Extent;

            if (!spatialCacheManager.CacheIsFull)           //检测是否存在缓存
            {
                spatialCacheManager.FillCache(cacheExtent); //不存在,则创建缓存
            }
            return(spatialCacheManager);
        }
Ejemplo n.º 2
0
        private void iSpatialFilterSpatialCacheToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Stopwatch myWatch = Stopwatch.StartNew();
            //从MapControl中获取的点图层
            IFeatureLayer     pointFeatureLayer     = axMapControl1.get_Layer(0) as IFeatureLayer;
            IFeatureSelection pointFeatureSelection = pointFeatureLayer as IFeatureSelection;
            //从MapControl中获取的面图层
            IFeatureLayer polygonFeatureLayer = axMapControl1.get_Layer(1) as IFeatureLayer;
            //填充Spatial Cache
            ISpatialCacheManager spatialCacheManager = (ISpatialCacheManager)(pointFeatureLayer as IDataset).Workspace;
            IEnvelope            cacheExtent         = (pointFeatureLayer as IGeoDataset).Extent;

            //检测是否存在缓存
            if (!spatialCacheManager.CacheIsFull)
            {
                //不存在,则创建缓存
                spatialCacheManager.FillCache(cacheExtent);
            }

            //构建缓存后进行查询
            IQueryFilter queryFilter = new QueryFilterClass();

            //Search如果返回属性值的话设置SubFields会提高效率
            queryFilter.SubFields = "Shape";
            IFeatureCursor cursor         = polygonFeatureLayer.Search(queryFilter, true);
            IFeature       polygonFeature = null;

            while ((polygonFeature = cursor.NextFeature()) != null)
            {
                IGeometry queryGeometry = polygonFeature.Shape;
                //构建空间查询
                ISpatialFilter spatialFilter = new SpatialFilterClass();
                spatialFilter.Geometry      = queryGeometry;
                spatialFilter.GeometryField = pointFeatureLayer.FeatureClass.ShapeFieldName;
                spatialFilter.SpatialRel    = esriSpatialRelEnum.esriSpatialRelContains;
                //选择的话可以不设置SubFields
                pointFeatureSelection.SelectFeatures(spatialFilter as IQueryFilter, esriSelectionResultEnum.esriSelectionResultAdd, false);
            }
            int count = pointFeatureSelection.SelectionSet.Count;

            //清空空间缓存
            spatialCacheManager.EmptyCache();
            axMapControl1.Refresh();
            //释放游标
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cursor);
            myWatch.Stop();
            string time = myWatch.Elapsed.TotalSeconds.ToString();

            MessageBox.Show("The selected point count is " + count.ToString() + "! and " + time + " Seconds");
        }