/// <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); }
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"); }