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);
        }
示例#2
0
        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]));
            }
        }