Esempio n. 1
0
        private unsafe void CheckIsNeedAsyncNotify(int bandNo, TileId tile, byte[] data)
        {
            string key = GetTileTaskKey(bandNo, tile);

            if (_needAsyncNotifyTasks.Contains(key))
            {
                TileData tileData = new TileData();
                tileData.BandNo = bandNo;
                tileData.Tile   = tile;
                tileData.Data   = new byte[data.Length];
                fixed(byte *srcptr = data, dstptr = (byte[])tileData.Data)
                {
                    IntPtr src = new IntPtr(srcptr);
                    IntPtr dst = new IntPtr(dstptr);

                    WinAPI.MemoryCopy(src, dst, data.Length);
                }

                if (_tileReadedCallback != null)
                {
                    _tileReadedCallback.BeginInvoke(tileData, null, null);
                }
                _needAsyncNotifyTasks.Remove(key);
            }
        }
Esempio n. 2
0
        private bool TileIsEixst(TileId tile)
        {
            Dictionary <int, TileData> levelCache = null;

            if (!_cache.ContainsKey(tile.LevelNo))
            {
                levelCache = new Dictionary <int, TileData>();
                _cache.Add(tile.LevelNo, levelCache);
            }
            return(_cache[tile.LevelNo].ContainsKey(tile.Index));
        }
Esempio n. 3
0
        public TileData[] GetTiles(int levelNo, Rectangle rasterEnvelope)
        {
            if (levelNo > _tileComputer.Levels.Length - 1)
            {
                return(null);
            }
            TileId[] visibleTiles = GetVisibileTiles(levelNo, rasterEnvelope);
            //如果本级没有缓存,则向上找分辨率较粗的一级代替
            if (!_cache.ContainsKey(levelNo))
            {
                //通知异步读取线程优先读取
                for (int i = 0; i < visibleTiles.Length; i++)
                {
                    TileId tile = visibleTiles[i];
                    _requestAgent.DoRequest(_bandNo, tile);
                }
                //找分辨率较粗的一级代替
                GetTiles(levelNo++, rasterEnvelope);
            }
            LevelId lv = _tileComputer.Levels[levelNo];
            Dictionary <int, TileData> lvTiles  = _cache[levelNo];
            List <TileData>            retTiles = new List <TileData>();
            int idx = 0;

            for (int i = 0; i < visibleTiles.Length; i++)
            {
                TileId tile = visibleTiles[i];
                if (lvTiles.ContainsKey(tile.Index))
                {
                    retTiles.Add(lvTiles[tile.Index]);
                }
                else//如果该块不在内存,则通知异步获取,向上查找较粗分辨率的一层代替
                {
                    TileData data = ToUpperLevel(lv.No, tile.Row, tile.Col);
                    if (data != null)
                    {
                        retTiles.Add(data);
                    }
                    _requestAgent.DoRequest(_bandNo, _tileComputer.Levels[lv.No].Tiles[idx]);
                }
            }
            return(retTiles.Count > 0 ? retTiles.ToArray() : null);
        }
Esempio n. 4
0
        private int GetTileCount(ref LevelId lv, out TileId[] tiles)
        {
            int rows = (int)Math.Ceiling(lv.Height / (float)_tileSize);
            int cols = (int)Math.Ceiling(lv.Width / (float)_tileSize);

            tiles   = new TileId[rows * cols];
            lv.Rows = rows;
            lv.Cols = cols;
            for (int r = 0; r < rows; r++)
            {
                for (int c = 0; c < cols; c++)
                {
                    TileId tile = new TileId();
                    tile.LevelNo = lv.No;
                    if (c == cols - 1)
                    {
                        tile.Width = Math.Min(_tileSize, lv.Width - (cols - 1) * _tileSize);
                    }
                    else
                    {
                        tile.Width = _tileSize;
                    }
                    if (r == rows - 1)
                    {
                        tile.Height = Math.Min(_tileSize, lv.Height - (rows - 1) * _tileSize);
                    }
                    else
                    {
                        tile.Height = _tileSize;
                    }
                    tile.Row          = r;
                    tile.Col          = c;
                    tile.Index        = r * cols + c;
                    tiles[tile.Index] = tile;
                }
            }
            return(rows * cols);
        }
Esempio n. 5
0
        public void Update(int levelNo, Rectangle rasterEnvelopeOfWnd, Rectangle rasterEnvelopeOfVirtualWnd)
        {
            LevelId lv = _tileComputer.Levels[levelNo];

            TileId[] visibleTiles = GetVisibileTiles(levelNo, rasterEnvelopeOfVirtualWnd);
            //通知异步读取线程优先读取(这里还可以优化)
            Console.WriteLine("---------------- bandNo " + _bandNo.ToString() + "--------------------");
            if (visibleTiles != null)
            {
                for (int i = 0; i < visibleTiles.Length; i++)
                {
                    TileId tile = visibleTiles[i];
                    if (!TileIsEixst(tile))
                    {
                        _requestAgent.DoRequest(_bandNo, tile);
                        Console.WriteLine("Request: " + tile.ToString());
                    }
                    else
                    {
                        Console.WriteLine("In Memeory: " + tile.ToString());
                    }
                }
            }
        }
Esempio n. 6
0
        private unsafe void DirectTileFromDataProvider(TileTask tileTask)
        {
            byte[] data = new byte[_tileBufferSize];
            fixed(byte *ptr = data)
            {
                IntPtr  buffer = new IntPtr(ptr);
                TileId  tile   = tileTask.Tile;
                LevelId lv     = _tileComputer.Levels[tile.LevelNo];

                _dataProvider.GetRasterBand(tileTask.BandNo).Read(
                    (int)(_tileSize * tile.Col / lv.Scale),
                    (int)(_tileSize * tile.Row / lv.Scale),
                    (int)(tile.Width / lv.Scale),
                    (int)(tile.Height / lv.Scale),
                    buffer, _dataProvider.DataType, tile.Width, tile.Height);
                //
                TileData tileData = new TileData();

                tileData.BandNo = tileTask.BandNo;
                tileData.Tile   = tile;
                tileData.Data   = data;
                _tileReadedCallback(tileData);
            }
        }
Esempio n. 7
0
 private void RequestTileHandlerFuc(int bandNo, TileId tile)
 {
     _diskCacheManager.Request(bandNo, new TileId[] { tile });
 }
Esempio n. 8
0
 public void DoRequest(int bandNo, TileId tile)
 {
     _requestTileHandler.BeginInvoke(bandNo, tile, null, null);
 }
Esempio n. 9
0
 private string GetTileTaskKey(int bandNo, TileId tile)
 {
     return(string.Format("{0}_{1}_{2}_{3}", bandNo, tile.LevelNo, tile.Row, tile.Col));
 }