コード例 #1
0
ファイル: GeoTiff.cs プロジェクト: salihdurus/MissionPlanner
        private static double ProcessScanLine(geotiffdata geotiffdata, int y, byte[] scanline)
        {
            if (scanline == null)
            {
            }
            if (geotiffdata.bits == 16)
            {
                return((short)((scanline[y * 2 + 1] << 8) + scanline[y * 2]));
            }
            else if (geotiffdata.bits == 32 && geotiffdata.type == 1)
            {
                return(BitConverter.ToUInt32(scanline, y * 4));
            }
            else if (geotiffdata.bits == 32 && geotiffdata.type == 2)
            {
                return(BitConverter.ToInt32(scanline, y * 4));
            }
            else if (geotiffdata.bits == 32 && geotiffdata.type == 3)
            {
                if (y * 4 > scanline.Length)
                {
                    return(short.MinValue);
                }
                return(BitConverter.ToSingle(scanline, y * 4));
            }

            throw new Exception("ProcessScanLine: Invalid geotiff coord");
        }
コード例 #2
0
ファイル: GeoTiff.cs プロジェクト: WhyZy9/MissionPlanner
 private static double GetAlt(geotiffdata geotiffdata, int x, int y)
 {
     if (x < 0 || y < 0 || x >= geotiffdata.width || y >= geotiffdata.height)
     {
         return(short.MinValue);
     }
     // if the image is to large use the direct to file approach
     return(GetAltNoCache(geotiffdata, x, y));
 }
コード例 #3
0
        private static double GetAlt(geotiffdata geotiffdata, int x, int y)
        {
            // if the image is to large use the direct to file approach
            if (!geotiffdata.cacheable)
            {
                return(GetAltNoCache(geotiffdata, x, y));
            }

            // use our cache
            return(cache[geotiffdata.FileName][x, y]);
        }
コード例 #4
0
ファイル: GeoTiff.cs プロジェクト: WhyZy9/MissionPlanner
        private static void ExtractScanLineFromTile(geotiffdata geotiffdata, int line)
        {
            FieldValue[] value      = geotiffdata.Tiff.GetField(TiffTag.IMAGEWIDTH);
            int          imageWidth = value[0].ToInt();

            value = geotiffdata.Tiff.GetField(TiffTag.IMAGELENGTH);
            int imageLength = value[0].ToInt();

            value = geotiffdata.Tiff.GetField(TiffTag.TILEWIDTH);
            int tileWidth = value[0].ToInt();

            value = geotiffdata.Tiff.GetField(TiffTag.TILELENGTH);
            int tileLength = value[0].ToInt();

            var bytespersample = geotiffdata.bits / 8;

            byte[][] scanlines = new byte[tileLength][];
            for (int i = 0; i < scanlines.Length; i++)
            {
                scanlines[i] = new byte[(imageWidth + tileWidth) * bytespersample];
            }

            int tiley = 0;

            byte[] buf = new byte[geotiffdata.Tiff.TileSize()];
            for (int y = 0; y < imageLength; y += tileLength)
            {
                for (int x = 0; x < imageWidth; x += tileWidth)
                {
                    if (y + tileLength < line || y > line)
                    {
                        break;
                    }

                    tiley = y;
                    geotiffdata.Tiff.ReadTile(buf, 0, x, y, 0, 0);

                    //int row = line % tileLength;

                    for (int i = 0; i < tileLength; i++)
                    {
                        Array.Copy(buf, i * bytespersample * tileLength, scanlines[i], x * bytespersample, tileWidth * bytespersample);
                        //Array.Copy(buf, row * bytespersample * tileLength, scanline, x * bytespersample, tileWidth * bytespersample);
                    }
                }
            }

            foreach (var scanline in scanlines)
            {
                AddToCache(geotiffdata, tiley, scanline);
                tiley++;
            }
        }
コード例 #5
0
 private static void AddToCache(geotiffdata geotiffdata, int x, byte[] scanline)
 {
     lock (cachescanlines)
     {
         var ci = cachescanlines.CreateEntry(geotiffdata.FileName + x.ToString());
         ci.Value = scanline;
         ci.Size  = ((byte[])ci.Value).Length;
         // evict after no access
         ci.SlidingExpiration = TimeSpan.FromMinutes(5);
         ci.Dispose();
     }
 }
コード例 #6
0
        private static double GetAltNoCache(geotiffdata geotiffdata, int x, int y)
        {
            byte[] scanline;
            lock (cachescanlines)
                scanline = cachescanlines.Get(geotiffdata.FileName + x.ToString()) as byte[];
            if (scanline == null)
            {
                //Task.Run(() =>
                {
                    lock (geotiffdata)
                        if (geotiffdata.Tiff == null)
                        {
                            geotiffdata.Tiff = Tiff.Open(geotiffdata.FileName, "r");
                        }

                    lock (geotiffdata.Tiff)
                    {
                        lock (cachescanlines)
                            scanline = cachescanlines.Get(geotiffdata.FileName + x.ToString()) as byte[];
                        if (scanline == null)
                        {
                            if (geotiffdata.Tiff.GetField(TiffTag.TILEWIDTH) != null &&
                                geotiffdata.Tiff.GetField(TiffTag.TILEWIDTH).Length >= 1)
                            {
                                //log.Info("read tile scanline " + x);
                                //return short.MinValue;

                                ExtractScanLineFromTile(geotiffdata, x);
                                lock (cachescanlines)
                                    scanline = cachescanlines.Get(geotiffdata.FileName + x.ToString()) as byte[];
                            }
                            else
                            {
                                //log.Info("read scanline " + x);
                                scanline = new byte[geotiffdata.Tiff.ScanlineSize()];

                                geotiffdata.Tiff.ReadScanline(scanline, x);
                                AddToCache(geotiffdata, x, scanline);
                            }
                        }
                    }
                }
                //);
                //return short.MinValue;

                if (scanline == null)
                {
                    return(short.MinValue);
                }
            }

            return(ProcessScanLine(geotiffdata, y, scanline));
        }
コード例 #7
0
        private static void generateIndex()
        {
            var files = Directory.GetFiles(srtm.datadirectory, "*.tif");

            foreach (var file in files)
            {
                try
                {
                    geotiffdata tif = new geotiffdata();

                    tif.LoadFile(file);
                }
                catch
                {
                }
            }
        }
コード例 #8
0
ファイル: GeoTiff.cs プロジェクト: EShamaev/MissionPlanner
        private static void AddToCache(geotiffdata geotiffdata, int x, byte[] scanline)
        {
            lock (cachescanlines)
            {
                if (cachescanlines.Get(geotiffdata.FileName.GetHashCode() ^ x.GetHashCode()) != null)
                {
                    return;
                }

                var ci = cachescanlines.CreateEntry(geotiffdata.FileName.GetHashCode() ^ x.GetHashCode());
                ci.Value = scanline;
                ci.Size  = ((byte[])ci.Value).Length;
                // evict after no access
                ci.SlidingExpiration = TimeSpan.FromMinutes(5);
                ci.Dispose();
            }
        }
コード例 #9
0
        private static double GetAltNoCache(geotiffdata geotiffdata, int x, int y)
        {
            using (Tiff tiff = Tiff.Open(geotiffdata.FileName, "r"))
            {
                byte[] scanline = new byte[tiff.ScanlineSize()];

                for (int row = 0; row < geotiffdata.height; row++)
                {
                    tiff.ReadScanline(scanline, x);

                    if (geotiffdata.bits == 16)
                    {
                        return((short)((scanline[y * 2 + 1] << 8) + scanline[y * 2]));
                    }
                    else if (geotiffdata.bits == 32)
                    {
                        return(BitConverter.ToSingle(scanline, y * 4));
                    }
                }
            }

            throw new Exception("GetAltNoCache: Invalid geotiff coord");
        }
コード例 #10
0
        private static void generateIndex()
        {
            if (!Directory.Exists(srtm.datadirectory))
            {
                return;
            }

            var files = Directory.GetFiles(srtm.datadirectory, "*.tif");

            foreach (var file in files)
            {
                try
                {
                    geotiffdata tif = new geotiffdata();

                    tif.LoadFile(file);
                }
                catch (Exception ex)
                {
                    log.Error(ex);
                }
            }
        }
コード例 #11
0
        private static void generateIndex()
        {
            if (!Directory.Exists(srtm.datadirectory))
                return;

            var files = Directory.GetFiles(srtm.datadirectory, "*.tif");

            foreach (var file in files)
            {
                try
                {
                    geotiffdata tif = new geotiffdata();

                    tif.LoadFile(file);
                }
                catch (Exception ex)
                {
                    log.Error(ex);
                }
            }
        }
コード例 #12
0
ファイル: GeoTiff.cs プロジェクト: h0st1le/MissionPlanner
        private static void generateIndex()
        {
            var files = Directory.GetFiles(srtm.datadirectory, "*.tif");

            foreach (var file in files)
            {
                try
                {
                    geotiffdata tif = new geotiffdata();

                    tif.LoadFile(file);
                }
                catch
                {
                }
            }
        }
コード例 #13
0
ファイル: GeoTiff.cs プロジェクト: EShamaev/MissionPlanner
        private static double GetAltNoCache(geotiffdata geotiffdata, int x, int y)
        {
            byte[] scanline;
            lock (cachescanlines)
                scanline = cachescanlines.Get(geotiffdata.FileName.GetHashCode() ^ x.GetHashCode()) as byte[];
            if (scanline == null)
            {
                //Task.Run(() =>
                {
                    lock (geotiffdata)
                        if (geotiffdata.Tiff == null)
                        {
                            geotiffdata.Tiff = Tiff.Open(geotiffdata.FileName, "r");
                        }

                    lock (geotiffdata.Tiff)
                    {
                        lock (cachescanlines)
                            scanline = cachescanlines.Get(geotiffdata.FileName.GetHashCode() ^ x.GetHashCode()) as byte[];
                        if (scanline == null)
                        {
                            if (geotiffdata.Tiff.GetField(TiffTag.TILEWIDTH) != null &&
                                geotiffdata.Tiff.GetField(TiffTag.TILEWIDTH).Length >= 1)
                            {
                                //log.Info("read tile scanline " + x);
                                //return short.MinValue;

                                ExtractScanLineFromTile(geotiffdata, x);
                                lock (cachescanlines)
                                    scanline = cachescanlines.Get(geotiffdata.FileName.GetHashCode() ^ x.GetHashCode()) as byte[];
                            }
                            else
                            {
                                //log.Info("read scanline " + x);

                                //RowsPerStrip
                                //http://www.libtiff.org/man/TIFFReadScanline.3t.html
                                var rps = geotiffdata.Tiff.GetField(TiffTag.ROWSPERSTRIP);
                                if (rps != null && rps.Length > 0 && (int)rps[0].Value > 1)
                                {
                                    var start = x - (x % (int)rps[0].Value);
                                    for (int i = start; i < start + (int)rps[0].Value; i++)
                                    {
                                        scanline = new byte[geotiffdata.Tiff.ScanlineSize()];
                                        geotiffdata.Tiff.ReadScanline(scanline, i);
                                        AddToCache(geotiffdata, i, scanline);
                                    }
                                }
                                else
                                {
                                    scanline = new byte[geotiffdata.Tiff.ScanlineSize()];
                                    geotiffdata.Tiff.ReadScanline(scanline, x);
                                    AddToCache(geotiffdata, x, scanline);
                                }
                            }
                        }
                    }
                }
                //);
                //return short.MinValue;

                if (scanline == null)
                {
                    return(short.MinValue);
                }
            }

            return(ProcessScanLine(geotiffdata, y, scanline));
        }