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); } }
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)); }
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); }
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); }
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()); } } } }
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); } }
private void RequestTileHandlerFuc(int bandNo, TileId tile) { _diskCacheManager.Request(bandNo, new TileId[] { tile }); }
public void DoRequest(int bandNo, TileId tile) { _requestTileHandler.BeginInvoke(bandNo, tile, null, null); }
private string GetTileTaskKey(int bandNo, TileId tile) { return(string.Format("{0}_{1}_{2}_{3}", bandNo, tile.LevelNo, tile.Row, tile.Col)); }