public async Task <GetDataResult> TryGetDataAtPoint(double latDegree, double lonDegree, TraceListener log) { if (!triedToGetMS) { ms = await BlobHelper.TryGetStreamAsync(container, fullFileName, log); triedToGetMS = true; } if (ms == null || !HasDataAtLat(latDegree) || !HasDataAtLon(lonDegree)) { return(new GetDataResult() { Success = false, Data = default(T) }); } int i = (int)Math.Round(scaleLat * (latDegree - latLo)); int j = numLon - 1 - (int)Math.Round(scaleLon * (lonDegree - lonLo)); var data = readPixel(ms, i, j); return(new GetDataResult() { Success = true, Data = data }); }
public static async Task <DeletableFileStream> TryGetStreamAsync(string containerName, string fileName, TraceListener log) { var localFileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".tmp"); var cacheFileName = Path.Combine(Path.GetTempPath(), fileName); foreach (DriveInfo d in DriveInfo.GetDrives().Where(p => p.Name.ToLower()[0] == localFileName.ToLower()[0] && p.IsReady)) { log?.WriteLine(string.Format("{0} has {1, 15} bytes available", d.Name, d.AvailableFreeSpace)); } if (!File.Exists(cacheFileName)) { try { CloudBlockBlob blockBlob = (await GetContainerAsync(containerName, log)).GetBlockBlobReference(fileName); await blockBlob.DownloadToFileAsync(localFileName, FileMode.CreateNew); } catch (Exception ex) { log?.WriteLine("Missing blob: " + fileName); log?.WriteLine("Error was:" + ex.ToString()); return(null); } var fi = new FileInfo(localFileName); if (!File.Exists(cacheFileName)) { fi.CopyTo(cacheFileName); } } else { var fi = new FileInfo(cacheFileName); fi.CopyTo(localFileName); } var fs = File.OpenRead(localFileName); fs.Position = 0; var ret = new DeletableFileStream(localFileName, fs); return(ret); }
private ChunkHolder <T> ReadChunk(DeletableFileStream stream, StandardChunkMetadata template) { byte[] buffer = new byte[Math.Max(4, pixelDataSize)]; stream.Read(buffer, 0, 4); int width = BitConverter.ToInt32(buffer, 0); stream.Read(buffer, 0, 4); int height = BitConverter.ToInt32(buffer, 0); var ret = new ChunkHolder <T>(width, height, template.LatLo, template.LonLo, template.LatHi, template.LonHi, null, toDouble, fromDouble); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { ret.Data[i][j] = ReadPixel(stream, buffer); } } return(ret); }
//protected abstract Task<T> ReadPixel(DeletableFileStream stream, byte[] buffer); protected abstract T ReadPixel(DeletableFileStream stream, byte[] buffer);
// protected override async Task<float> ReadPixel(DeletableFileStream stream, byte[] buffer) protected override float ReadPixel(DeletableFileStream stream, byte[] buffer) { //await stream.ReadAsync(buffer, 0, 4); stream.Read(buffer, 0, 4); return(BitConverter.ToSingle(buffer, 0)); }