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
            });
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
 //protected abstract Task<T> ReadPixel(DeletableFileStream stream, byte[] buffer);
 protected abstract T ReadPixel(DeletableFileStream stream, byte[] buffer);
示例#5
0
//        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));
        }