public Feature[] GetFeatures(Envelope envelope) { if (_features == null) { return(null); } if (envelope == null) { return(null); } Envelope validExtent = _envelope.IntersectWith(envelope); if (validExtent == null) { return(null); } List <Feature> retFets = new List <Feature>(); foreach (Feature fet in _features) { if (validExtent.Contains(fet.Geometry.Envelope)) { retFets.Add(fet); } else { if (fet.Geometry.Envelope.IsInteractived(validExtent)) { retFets.Add(fet); fet.IsRepeatedOverGrids = true; } } } return(retFets.Count > 0 ? retFets.ToArray() : null); }
private void TryCheckUnloadedGrids(IFeatureLayer layer, Envelope currentExtent) { if (layer == null || currentExtent == null) { return; } IFeatureClass fetclass = layer.Class as IFeatureClass; //所有网格已经全部在内存,无需读取 if ((fetclass.DataSource as IFeatureDataSource).ReadIsFinished) { return; } if ((fetclass.DataSource as IFeatureDataSource).GridStateIndicator.GetUnFlagedCount() == 0) { TryEndRead(fetclass.DataSource as IGridReader, fetclass.Name); _finishedLayerCount++; return; } Envelope validExtent = currentExtent.IntersectWith(fetclass.FullEnvelope); // if (validExtent == null) { return; } //将可使区域转换为数据源的坐标类型 ProjectEnvelope(validExtent, fetclass); //计算未读出的网格编号 _tempGridNos.Clear(); (fetclass.DataSource as IFeatureDataSource).GridStateIndicator.GetDiffGridNos(validExtent, _tempGridNos); if (_tempGridNos == null || _tempGridNos.Count == 0) { return; } //往加载网格队列中添加任务 for (int i = 0; i < _tempGridNos.Count; i++) { (fetclass.DataSource as IFeatureDataSource).GridStateIndicator.Flaging(_tempGridNos[i]); _waitingReadingTaskes.Push(new TaskState(fetclass, _tempGridNos[i])); } }