public static void Run()
        {
            TiffFile tiffFile = new TiffFile(Util.GetPath("Resources/Images/fw9_18.tif"));
            Document document = tiffFile.GetDocument();

            document.Draw(Util.GetPath("Output/TiffToPDF.pdf"));
        }
        // Convert a multipage TIFF image to a PDF document.
        // This code uses the DynamicPDF Core Suite for .NET product.
        // It used the following namespace from the ceTe.DynamicPDF.CoreSuite.NET NuGet package:
        //  * ceTe.DynamicPDF namespace for the Document class
        //  * ceTe.DynamicPDF.Imaging namespace for the TiffFile class
        static void ConvertExampleOne()
        {
            TiffFile tiffFile = new TiffFile("../../../Resources/fw9_18.tif");
            Document document = tiffFile.GetDocument();

            document.Draw("core-suite-output.pdf");
        }
Пример #3
0
        public HeightMap GetHeightMap(FileMetadata metadata)
        {
            HeightMap heightMap = new HeightMap(metadata.Width, metadata.Height);

            heightMap.Count = heightMap.Width * heightMap.Height;
            var coords = new List <GeoPoint>(heightMap.Count);

            // metadata.BitsPerSample
            // When 16 we have 2 bytes per sample
            // When 32 we have 4 bytes per sample
            int bytesPerSample = metadata.BitsPerSample / 8;

            byte[] byteScanline = new byte[metadata.ScanlineSize];

            for (int y = 0; y < metadata.Height; y++)
            {
                TiffFile.ReadScanline(byteScanline, y);

                double latitude = metadata.StartLat + (metadata.pixelSizeY * y);
                for (int x = 0; x < metadata.Width; x++)
                {
                    double longitude = metadata.StartLon + (metadata.pixelSizeX * x);

                    float heightValue = 0;
                    switch (metadata.SampleFormat)
                    {
                    case RasterSampleFormat.FLOATING_POINT:
                        heightValue = BitConverter.ToSingle(byteScanline, x * metadata.BitsPerSample / 8);
                        break;

                    case RasterSampleFormat.INTEGER:
                        heightValue = BitConverter.ToInt16(byteScanline, x * metadata.BitsPerSample / 8);
                        break;

                    case RasterSampleFormat.UNSIGNED_INTEGER:
                        heightValue = BitConverter.ToUInt16(byteScanline, x * metadata.BitsPerSample / 8);
                        break;

                    default:
                        throw new Exception("Sample format unsupported.");
                    }
                    if (heightValue < 32768)
                    {
                        heightMap.Minimum = Math.Min(metadata.MinimumAltitude, heightValue);
                        heightMap.Maximum = Math.Max(metadata.MaximumAltitude, heightValue);
                    }
                    else
                    {
                        heightValue = 0;
                    }
                    coords.Add(new GeoPoint(latitude, longitude, heightValue));
                }
            }

            heightMap.Coordinates = coords;
            return(heightMap);
        }
Пример #4
0
        public FileMetadata ParseMetaData()
        {
            FileMetadata metadata = new FileMetadata(FilePath);

            ///
            metadata.Height = TiffFile.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
            metadata.Width  = TiffFile.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();

            ///
            FieldValue[] modelPixelScaleTag = TiffFile.GetField(TiffTag.GEOTIFF_MODELPIXELSCALETAG);
            FieldValue[] modelTiepointTag   = TiffFile.GetField(TiffTag.GEOTIFF_MODELTIEPOINTTAG);

            byte[] modelPixelScale = modelPixelScaleTag[1].GetBytes();
            double pixelSizeX      = BitConverter.ToDouble(modelPixelScale, 0);
            double pixelSizeY      = BitConverter.ToDouble(modelPixelScale, 8) * -1;

            metadata.pixelSizeX  = pixelSizeX;
            metadata.pixelSizeY  = pixelSizeY;
            metadata.PixelScaleX = BitConverter.ToDouble(modelPixelScale, 0);
            metadata.PixelScaleY = BitConverter.ToDouble(modelPixelScale, 8);

            // Ignores first set of model points (3 bytes) and assumes they are 0's...
            byte[] modelTransformation = modelTiepointTag[1].GetBytes();
            metadata.OriginLongitude = BitConverter.ToDouble(modelTransformation, 24);
            metadata.OriginLatitude  = BitConverter.ToDouble(modelTransformation, 32);


            double startLat = metadata.OriginLatitude + (pixelSizeY / 2.0);
            double startLon = metadata.OriginLongitude + (pixelSizeX / 2.0);

            metadata.StartLat = startLat;
            metadata.StartLon = startLon;

            var scanline = new byte[TiffFile.ScanlineSize()];

            metadata.ScanlineSize = TiffFile.ScanlineSize();
            //TODO: Check if band is stored in 1 byte or 2 bytes.
            //If 2, the following code would be required
            var scanline16Bit = new ushort[TiffFile.ScanlineSize() / 2];

            Buffer.BlockCopy(scanline, 0, scanline16Bit, 0, scanline.Length);


            // Grab some raster metadata
            metadata.BitsPerSample = TiffFile.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt();
            var sampleFormat = TiffFile.GetField(TiffTag.SAMPLEFORMAT);

            // Add other information about the data
            metadata.SampleFormat = sampleFormat[0].Value.ToString();
            // TODO: Read this from tiff metadata or determine after parsing
            metadata.NoDataValue = "-10000";

            metadata.WorldUnits = "meter";

            return(metadata);
        }
Пример #5
0
        public static void Run(string outputPdfPath)
        {
            // Create a TiffFile object from the TIFF image
            TiffFile tiffFile = new TiffFile(Util.GetResourcePath("Images/fw9_18.tif"));

            // Create a document object from the file
            Document document = tiffFile.GetDocument();

            // Save the PDF document
            document.Draw(outputPdfPath);
        }
Пример #6
0
        /// <summary>
        /// Konvertiert die PDF-Datei in Tiff-Dateien.
        /// Gibt eine liste mit den Pfaden der Tiff-Dateien zurück.
        /// </summary>
        public List <string> ConvertPDFToImage(string pathFolder, bool tempPrefix, DocumentParam param)
        {
            List <string> list = new List <string>();

            try
            {
                if (string.CompareOrdinal(pathFolder, string.Empty) == 0)
                {
                    return(list);
                }

                FileInfo fileInfo = new FileInfo(param.FilePath);

                if (fileInfo.Exists == false)
                {
                    return(list);
                }

                FilesFunctions.DeleteFilesInFolder(pathFolder, Tiff);

                // open existing PDF document
                using (PdfDocument pdfDocument = new PdfDocument(param.FilePath, true))
                {
                    // set resolution
                    //pdfDocument.RenderingSettings.Resolution = new Resolution(param.Resolution, param.Resolution);

                    //// set rendering mode - optimal balance between rendering speed and quality
                    //pdfDocument.RenderingSettings.RenderingMode = PdfRenderingMode.HighSpeed;

                    for (int pageCount = 0; pageCount < pdfDocument.Pages.Count; pageCount++)
                    {
                        string tempName = FilesFunctions.GetRandomName(pathFolder, fileInfo, tempPrefix, Tiff);

                        // create new TIFF file
                        using (TiffFile tiffFile = new TiffFile(tempName, TiffFileFormat.LittleEndian))
                        {
                            tiffFile.Pages.EncoderSettings.Compression = TiffCompression.Zip;
                            tiffFile.Pages.Add(pdfDocument.Pages[pageCount].Render());
                            tiffFile.SaveChanges();
                            list.Add(tempName);
                        }
                    }
                }


                return(list);
            }
            catch (Exception ex)
            {
                FileLogger.FileLogger.Instance.WriteExeption(ex);
                return(list);
            }
        }
Пример #7
0
        public float GetElevationAtPoint(FileMetadata metadata, int x, int y)
        {
            float heightValue = 0;

            try
            {
                if (this.IsTiled)
                {
                    // TODO store in metadata
                    int    tileWidth  = this.TileWidth;
                    int    tileHeight = this.TileHeight;
                    int    tileSize   = this.TileSize;
                    byte[] buffer;

                    var tileX = (x / tileWidth) * tileWidth;
                    var tileY = (y / tileHeight) * tileHeight;

                    if (tilesCache == null)
                    {
                        tilesCache = new Dictionary <int, byte[]>();
                    }
                    var tileKey = (x / tileWidth) + (y / tileHeight) * (metadata.Width / tileWidth + 1);
                    if (!tilesCache.TryGetValue(tileKey, out buffer))
                    {
                        buffer = new byte[tileSize];
                        TiffFile.ReadTile(buffer, 0, tileX, tileY, 0, 0);
                        tilesCache.Add(tileKey, buffer);
                    }
                    var offset = x - tileX + (y - tileY) * tileHeight;
                    heightValue = GetElevationAtPoint(metadata, offset, buffer);
                }
                else
                {
                    // metadata.BitsPerSample
                    // When 16 we have 2 bytes per sample
                    // When 32 we have 4 bytes per sample
                    int    bytesPerSample = metadata.BitsPerSample / 8;
                    byte[] byteScanline   = new byte[metadata.ScanlineSize];

                    TiffFile.ReadScanline(byteScanline, y);

                    heightValue = GetElevationAtPoint(metadata, x, byteScanline);
                }
            }
            catch (Exception e)
            {
                throw new Exception($"Error in ParseGeoDataAtPoint: {e.Message}");
            }
            return(heightValue);
        }
Пример #8
0
        //public bool Colour { get; set; }
        //public int Compression { get; set; }
        //public bool KeepOriginal { get; set; }

        /// <summary>
        /// Von dem PDF-Dokument wird die erste Seite in tiff konvertiert und gespeichert.
        /// die funktion liefert den Path zu der neue Datei zurück.
        /// </summary>
        public string GetFirstPageAsImageFromDocument(DocumentParam param)
        {
            try
            {
                string   fileName = string.Empty;
                FileInfo fileInfo = new FileInfo(param.FilePath);

                if (fileInfo.Exists == false)
                {
                    return(fileName);
                }

                string pathFolder = Path.GetTempPath();

                using (PdfDocument pdfDocument = new PdfDocument(param.FilePath, true))
                {
                    // set resolution
                    pdfDocument.RenderingSettings.Resolution = new Resolution(param.Resolution, param.Resolution);

                    // set rendering mode - optimal balance between rendering speed and quality
                    pdfDocument.RenderingSettings.RenderingMode = PdfRenderingMode.HighQuality;

                    string tempName = FilesFunctions.GetRandomName(pathFolder, fileInfo, true, Tiff);
                    for (int pageCount = 0; pageCount < pdfDocument.Pages.Count; pageCount++)
                    {
                        // create new TIFF file
                        using (TiffFile tiffFile = new TiffFile(tempName, TiffFileFormat.LittleEndian))
                        {
                            tiffFile.Pages.EncoderSettings.Compression = TiffCompression.Lzw;
                            tiffFile.Pages.Add(pdfDocument.Pages[pageCount].Render());
                            tiffFile.SaveChanges();
                            fileName = tempName;
                        }
                    }
                }

                return(fileName);
            }
            catch (Exception ex)
            {
                FileLogger.FileLogger.Instance.WriteExeption(ex);
                return(string.Empty);
            }
        }
Пример #9
0
        static void Main(string[] args)
        {
            using (TiffFile file = new TiffFile("F:\\Downloads\\Public\\VLI\\heic0601a.ptiff"))
            {
                TiffImage image = file.Images[5];

                using (Bitmap bitmap = image.GetTile(0 * 256, 0 * 256))
                    bitmap.Save("0.jpg", ImageFormat.Jpeg);

                using (Bitmap bitmap = image.GetTile(1 * 256, 0 * 256))
                    bitmap.Save("1.jpg", ImageFormat.Jpeg);

                using (Bitmap bitmap = image.GetTile(0 * 256, 1 * 256))
                    bitmap.Save("2.jpg", ImageFormat.Jpeg);

                using (Bitmap bitmap = image.GetTile(1 * 256, 1 * 256))
                    bitmap.Save("3.jpg", ImageFormat.Jpeg);
            }
        }
Пример #10
0
        public float ParseGeoDataAtPoint(FileMetadata metadata, int x, int y)
        {
            float heightValue = 0;

            try
            {
                byte[]   scanline      = new byte[metadata.ScanlineSize];
                ushort[] scanline16Bit = new ushort[metadata.ScanlineSize / 2];

                TiffFile.ReadScanline(scanline, y);
                Buffer.BlockCopy(scanline, 0, scanline16Bit, 0, scanline.Length);

                heightValue = ParseGeoDataAtPoint(metadata, x, scanline16Bit);
            }
            catch (Exception e)
            {
                throw new Exception($"Error in ParseGeoDataAtPoint: {e.Message}");
            }
            return(heightValue);
        }
Пример #11
0
        public float GetElevationAtPoint(FileMetadata metadata, int x, int y)
        {
            float heightValue = 0;

            try
            {
                // metadata.BitsPerSample
                // When 16 we have 2 bytes per sample
                // When 32 we have 4 bytes per sample
                int    bytesPerSample = metadata.BitsPerSample / 8;
                byte[] byteScanline   = new byte[metadata.ScanlineSize];

                TiffFile.ReadScanline(byteScanline, y);

                heightValue = GetElevationAtPoint(metadata, x, byteScanline);
            }
            catch (Exception e)
            {
                throw new Exception($"Error in ParseGeoDataAtPoint: {e.Message}");
            }
            return(heightValue);
        }
Пример #12
0
        public HeightMap ParseGeoDataInBBox(BoundingBox bbox, FileMetadata metadata, float noDataValue = 0)
        {
            // metadata.BitsPerSample
            // When 16 we have 2 bytes per sample
            // When 32 we have 4 bytes per sample
            int bytesPerSample = metadata.BitsPerSample / 8;

            byte[] byteScanline = new byte[metadata.ScanlineSize];


            int yStart = (int)Math.Floor((bbox.yMax - metadata.StartLat) / metadata.pixelSizeY);
            int yEnd   = (int)Math.Ceiling((bbox.yMin - metadata.StartLat) / metadata.pixelSizeY);
            int xStart = (int)Math.Floor((bbox.xMin - metadata.StartLon) / metadata.pixelSizeX);
            int xEnd   = (int)Math.Ceiling((bbox.xMax - metadata.StartLon) / metadata.pixelSizeX);

            xStart = Math.Max(0, xStart);
            xEnd   = Math.Min(metadata.Width - 1, xEnd);
            yStart = Math.Max(0, yStart);
            yEnd   = Math.Min(metadata.Height - 1, yEnd);

            HeightMap heightMap = new HeightMap(xEnd - xStart + 1, yEnd - yStart + 1);

            heightMap.Count = heightMap.Width * heightMap.Height;
            var coords = new List <GeoPoint>(heightMap.Count);

            heightMap.BoundingBox = new BoundingBox(0, 0, 0, 0);

            for (int y = yStart; y <= yEnd; y++)
            {
                TiffFile.ReadScanline(byteScanline, y);

                double latitude = metadata.StartLat + (metadata.pixelSizeY * y);

                // bounding box
                if (y == yStart)
                {
                    heightMap.BoundingBox.yMax = latitude;
                    heightMap.BoundingBox.xMin = metadata.StartLon + (metadata.pixelSizeX * xStart);
                    heightMap.BoundingBox.xMax = metadata.StartLon + (metadata.pixelSizeX * xEnd);
                }
                else if (y == yEnd)
                {
                    heightMap.BoundingBox.yMin = latitude;
                }

                for (int x = xStart; x <= xEnd; x++)
                {
                    double longitude = metadata.StartLon + (metadata.pixelSizeX * x);

                    float heightValue = 0;
                    switch (metadata.SampleFormat)
                    {
                    case "IEEEFP":
                        heightValue = BitConverter.ToSingle(byteScanline, x * bytesPerSample);
                        break;

                    case "INT":
                        heightValue = BitConverter.ToInt16(byteScanline, x * bytesPerSample);
                        break;

                    case "UINT":
                        heightValue = BitConverter.ToUInt16(byteScanline, x * bytesPerSample);
                        break;

                    default:
                        throw new Exception("Sample format unsupported.");
                    }
                    if (heightValue < 32768)
                    {
                        heightMap.Mininum = Math.Min(heightMap.Mininum, heightValue);
                        heightMap.Maximum = Math.Max(heightMap.Maximum, heightValue);
                    }
                    else
                    {
                        heightValue = (float)noDataValue;
                    }
                    coords.Add(new GeoPoint(latitude, longitude, heightValue, x, y));
                }
            }
            Debug.Assert(heightMap.Width * heightMap.Height == coords.Count);

            heightMap.Coordinates = coords;
            return(heightMap);
        }
Пример #13
0
        public HeightMap GetHeightMapInBBox(BoundingBox bbox, FileMetadata metadata, float noDataValue = 0)
        {
            int yStart = 0;
            int yEnd   = 0;
            int xStart = 0;
            int xEnd   = 0;

            if (metadata.FileFormat.Registration == DEMFileRegistrationMode.Grid)
            {
                yStart = (int)Math.Floor((bbox.yMax - metadata.PhysicalEndLat) / metadata.pixelSizeY);
                yEnd   = (int)Math.Ceiling((bbox.yMin - metadata.PhysicalEndLat) / metadata.pixelSizeY);
                xStart = (int)Math.Floor((bbox.xMin - metadata.PhysicalStartLon) / metadata.pixelSizeX);
                xEnd   = (int)Math.Ceiling((bbox.xMax - metadata.PhysicalStartLon) / metadata.pixelSizeX);
            }
            else
            {
                yStart = (int)Math.Floor((bbox.yMax - metadata.DataEndLat) / metadata.pixelSizeY);
                yEnd   = (int)Math.Ceiling((bbox.yMin - metadata.DataEndLat) / metadata.pixelSizeY);
                xStart = (int)Math.Floor((bbox.xMin - metadata.DataStartLon) / metadata.pixelSizeX);
                xEnd   = (int)Math.Ceiling((bbox.xMax - metadata.DataStartLon) / metadata.pixelSizeX);
            }


            // Tiled geotiffs like aster have overlapping 1px borders
            int overlappingPixel = this.IsTiled ? 1 : 0;

            xStart = Math.Max(0, xStart);
            xEnd   = Math.Min(metadata.Width - 1, xEnd) - overlappingPixel;
            yStart = Math.Max(0, yStart);
            yEnd   = Math.Min(metadata.Height - 1, yEnd) - overlappingPixel;

            HeightMap heightMap = new HeightMap(xEnd - xStart + 1, yEnd - yStart + 1);

            heightMap.Count = heightMap.Width * heightMap.Height;
            var coords = new List <GeoPoint>(heightMap.Count);

            heightMap.BoundingBox = new BoundingBox(0, 0, 0, 0);

            if (this.IsTiled)
            {
                // Tiled rasters are composed of multiple "sub" images
                // TODO store in metadata
                int    tileWidth  = this.TileWidth;
                int    tileHeight = this.TileHeight;
                int    tileSize   = this.TileSize;
                byte[] buffer;

                for (int y = yStart; y <= yEnd; y++)
                {
                    double latitude = metadata.DataEndLat + (metadata.pixelSizeY * y);
                    // bounding box
                    if (y == yStart)
                    {
                        heightMap.BoundingBox.yMax = latitude;
                        heightMap.BoundingBox.xMin = metadata.DataStartLon + (metadata.pixelSizeX * xStart);
                        heightMap.BoundingBox.xMax = metadata.DataStartLon + (metadata.pixelSizeX * xEnd);
                    }
                    if (y == yEnd)
                    {
                        heightMap.BoundingBox.yMin = latitude;
                    }

                    for (int x = xStart; x <= xEnd; x++)
                    {
                        double longitude = metadata.DataStartLon + (metadata.pixelSizeX * x);
                        var    tileX     = (x / tileWidth) * tileWidth;
                        var    tileY     = (y / tileHeight) * tileHeight;

                        if (tilesCache == null)
                        {
                            tilesCache = new Dictionary <int, byte[]>();
                        }
                        var tileKey = (x / tileWidth) + (y / tileHeight) * (metadata.Width / tileWidth + 1);
                        if (!tilesCache.TryGetValue(tileKey, out buffer))
                        {
                            buffer = new byte[tileSize];
                            TiffFile.ReadTile(buffer, 0, tileX, tileY, 0, 0);
                            tilesCache.Add(tileKey, buffer);
                        }
                        var   offset      = x - tileX + (y - tileY) * tileHeight;
                        float heightValue = GetElevationAtPoint(metadata, offset, buffer);
                        if (heightValue <= 0)
                        {
                            heightMap.Minimum = Math.Min(heightMap.Minimum, heightValue);
                            heightMap.Maximum = Math.Max(heightMap.Maximum, heightValue);
                        }
                        else if (heightValue < 32768)
                        {
                            heightMap.Minimum = Math.Min(heightMap.Minimum, heightValue);
                            heightMap.Maximum = Math.Max(heightMap.Maximum, heightValue);
                        }

                        else
                        {
                            heightValue = (float)noDataValue;
                        }
                        coords.Add(new GeoPoint(latitude, longitude, heightValue));
                    }
                }
            }
            else
            {
                // metadata.BitsPerSample
                // When 16 we have 2 bytes per sample
                // When 32 we have 4 bytes per sample
                int    bytesPerSample = metadata.BitsPerSample / 8;
                byte[] byteScanline   = new byte[metadata.ScanlineSize];
                double endLat         = metadata.DataEndLat + metadata.pixelSizeY / 2d;
                double startLon       = metadata.DataStartLon + metadata.pixelSizeX / 2d;

                for (int y = yStart; y <= yEnd; y++)
                {
                    TiffFile.ReadScanline(byteScanline, y);

                    // TODO: handle Cell registered DEMs: lat is 1/2 pixel off
                    double latitude = endLat + (metadata.pixelSizeY * y);

                    // bounding box
                    if (y == yStart)
                    {
                        heightMap.BoundingBox.yMax = latitude;
                        heightMap.BoundingBox.xMin = startLon + (metadata.pixelSizeX * xStart);
                        heightMap.BoundingBox.xMax = startLon + (metadata.pixelSizeX * xEnd);
                    }
                    else if (y == yEnd)
                    {
                        heightMap.BoundingBox.yMin = latitude;
                    }

                    for (int x = xStart; x <= xEnd; x++)
                    {
                        double longitude = startLon + (metadata.pixelSizeX * x);

                        float heightValue = 0;
                        switch (metadata.SampleFormat)
                        {
                        case RasterSampleFormat.FLOATING_POINT:
                            heightValue = BitConverter.ToSingle(byteScanline, x * bytesPerSample);
                            break;

                        case RasterSampleFormat.INTEGER:
                            heightValue = BitConverter.ToInt16(byteScanline, x * bytesPerSample);
                            break;

                        case RasterSampleFormat.UNSIGNED_INTEGER:
                            heightValue = BitConverter.ToUInt16(byteScanline, x * bytesPerSample);
                            break;

                        default:
                            throw new Exception("Sample format unsupported.");
                        }
                        if (heightValue <= 0)
                        {
                            heightMap.Minimum = Math.Min(heightMap.Minimum, heightValue);
                            heightMap.Maximum = Math.Max(heightMap.Maximum, heightValue);
                        }
                        else if (heightValue < 32768)
                        {
                            heightMap.Minimum = Math.Min(heightMap.Minimum, heightValue);
                            heightMap.Maximum = Math.Max(heightMap.Maximum, heightValue);
                        }

                        else
                        {
                            heightValue = (float)noDataValue;
                        }
                        coords.Add(new GeoPoint(latitude, longitude, heightValue));
                    }
                }
            }
            heightMap.BoundingBox.zMin = heightMap.Minimum;
            heightMap.BoundingBox.zMax = heightMap.Maximum;
            Debug.Assert(heightMap.Width * heightMap.Height == coords.Count);

            heightMap.Coordinates = coords;
            return(heightMap);
        }
Пример #14
0
        public FileMetadata ParseMetaData(DEMFileDefinition format)
        {
            FileMetadata metadata = new FileMetadata(FilePath, format);

            ///
            metadata.Height = TiffFile.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
            metadata.Width  = TiffFile.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();

            ///
            FieldValue[] modelPixelScaleTag = TiffFile.GetField(TiffTag.GEOTIFF_MODELPIXELSCALETAG);
            FieldValue[] modelTiepointTag   = TiffFile.GetField(TiffTag.GEOTIFF_MODELTIEPOINTTAG);

            byte[] modelPixelScale = modelPixelScaleTag[1].GetBytes();
            double pixelSizeX      = BitConverter.ToDouble(modelPixelScale, 0);
            double pixelSizeY      = BitConverter.ToDouble(modelPixelScale, 8) * -1;

            metadata.pixelSizeX  = pixelSizeX;
            metadata.pixelSizeY  = pixelSizeY;
            metadata.PixelScaleX = BitConverter.ToDouble(modelPixelScale, 0);
            metadata.PixelScaleY = BitConverter.ToDouble(modelPixelScale, 8);

            // Ignores first set of model points (3 bytes) and assumes they are 0's...
            byte[] modelTransformation = modelTiepointTag[1].GetBytes();
            metadata.DataStartLon = BitConverter.ToDouble(modelTransformation, 24);
            metadata.DataStartLat = BitConverter.ToDouble(modelTransformation, 32);
            metadata.DataEndLon   = metadata.DataStartLon + metadata.Width * pixelSizeX;
            metadata.DataEndLat   = metadata.DataStartLat + metadata.Height * pixelSizeY;

            if (metadata.DataStartLon > metadata.DataEndLon)
            {
                double temp = metadata.DataStartLon;
                metadata.DataStartLon = metadata.DataEndLon;
                metadata.DataEndLon   = temp;
            }
            if (metadata.DataStartLat > metadata.DataEndLat)
            {
                double temp = metadata.DataStartLat;
                metadata.DataStartLat = metadata.DataEndLat;
                metadata.DataEndLat   = temp;
            }

            if (format.Registration == DEMFileRegistrationMode.Grid)
            {
                metadata.PhysicalStartLat = metadata.DataStartLat;
                metadata.PhysicalStartLon = metadata.DataStartLon;
                metadata.PhysicalEndLat   = metadata.DataEndLat;
                metadata.PhysicalEndLon   = metadata.DataEndLon;
                metadata.DataStartLat     = Math.Round(metadata.DataStartLat + (metadata.PixelScaleY / 2.0), 10);
                metadata.DataStartLon     = Math.Round(metadata.DataStartLon + (metadata.PixelScaleX / 2.0), 10);
                metadata.DataEndLat       = Math.Round(metadata.DataEndLat - (metadata.PixelScaleY / 2.0), 10);
                metadata.DataEndLon       = Math.Round(metadata.DataEndLon - (metadata.PixelScaleX / 2.0), 10);
            }
            else
            {
                metadata.PhysicalStartLat = metadata.DataStartLat;
                metadata.PhysicalStartLon = metadata.DataStartLon;
                metadata.PhysicalEndLat   = metadata.DataEndLat;
                metadata.PhysicalEndLon   = metadata.DataEndLon;
            }
            var scanline = new byte[TiffFile.ScanlineSize()];

            metadata.ScanlineSize = TiffFile.ScanlineSize();

            // Grab some raster metadata
            metadata.BitsPerSample = TiffFile.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt();
            var sampleFormat = TiffFile.GetField(TiffTag.SAMPLEFORMAT);

            // Add other information about the data
            metadata.SampleFormat = sampleFormat[0].Value.ToString();
            // TODO: Read this from tiff metadata or determine after parsing
            metadata.NoDataValue = "-10000";

            metadata.WorldUnits = "meter";

            return(metadata);
        }
Пример #15
0
 public TiffTileProvider(string filePath)
 {
     file = new TiffFile(filePath);
 }