public void RasterMapperConstructorTest()
        {
            RasterMapper mapper = new RasterMapper(RasterMapMode.ValueIsArea, MatrixFactory.CreateIdentity(4));

            Assert.AreEqual(RasterMapMode.ValueIsArea, mapper.Mode);
            Assert.AreEqual(MatrixFactory.CreateIdentity(4), mapper.RasterTransformation);
            Assert.AreEqual(MatrixFactory.CreateIdentity(4), mapper.GeometryTransformation);
            Assert.AreEqual(1, mapper.ColumnSize);
            Assert.AreEqual(1, mapper.RowSize);
            Assert.AreEqual(new CoordinateVector(1, 0), mapper.ColumnVector);
            Assert.AreEqual(new CoordinateVector(0, 1), mapper.RowVector);
            Assert.AreEqual(new CoordinateVector(1, 1, 1), mapper.Scale);
            Assert.AreEqual(Coordinate.Empty, mapper.Translation);

            // exceptions

            Assert.Throws <ArgumentNullException>(() => new RasterMapper(RasterMapMode.ValueIsArea, null));
            Assert.Throws <ArgumentException>(() => new RasterMapper(RasterMapMode.ValueIsArea, new Matrix(1, 4)));
            Assert.Throws <ArgumentException>(() => new RasterMapper(RasterMapMode.ValueIsArea, new Matrix(4, 1)));
            Assert.Throws <ArgumentException>(() => new RasterMapper(RasterMapMode.ValueIsArea, new Matrix(4, 4, Double.NaN)));
            Assert.Throws <ArgumentException>(() => new RasterMapper(RasterMapMode.ValueIsArea, new Matrix(4, 4)));
            Assert.Throws <ArgumentException>(() =>
            {
                Matrix matrix = new Matrix(4, 4);
                matrix[3, 0]  = matrix[3, 1] = matrix[3, 2] = matrix[3, 3] = 1;
                new RasterMapper(RasterMapMode.ValueIsArea, matrix);
            });
            Assert.Throws <NotSupportedException>(() => new RasterMapper(RasterMapMode.ValueIsArea, MatrixFactory.CreateDiagonal(0, 0, 0, 1)));
        }
Exemple #2
0
        public void ProxyRasterGetValuesTest()
        {
            // index based

            ProxyRaster raster = new ProxyRaster(_factory.Object, _service.Object, null);

            for (Int32 j = 0; j < raster.NumberOfRows; j += 5)
            {
                for (Int32 k = 0; k < raster.NumberOfColumns; k += 5)
                {
                    Assert.IsTrue(_service.Object.ReadValueSequence(j, k, 0, 3).SequenceEqual(raster.GetValues(j, k)));
                    Assert.IsTrue(_service.Object.ReadValueSequence(j, k, 0, 3).SequenceEqual(raster[j, k]));
                }
            }

            // coordinate based

            RasterMapper mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsCoordinate, 1000, 1000, 0, 10, 10, 1);

            raster = new ProxyRaster(_factory.Object, _service.Object, mapper);

            for (Int32 x = 1000; x < 1000 + 10 * _service.Object.Dimensions.NumberOfColumns; x += 100)
            {
                for (Int32 y = 1000; y < 1000 + 10 * _service.Object.Dimensions.NumberOfRows; y += 100)
                {
                    Assert.IsTrue(_service.Object.ReadValueSequence((x - 1000) / 10, (y - 1000) / 10, 0, 3).SequenceEqual(raster.GetValues(new Coordinate(x, y))));
                    Assert.IsTrue(_service.Object.ReadValueSequence((x - 1000) / 10, (y - 1000) / 10, 0, 3).SequenceEqual(raster[new Coordinate(x, y)]));
                }
            }
        }
Exemple #3
0
        public void ProxyRasterConstructorTest()
        {
            // successful construction without spectral ranges and mapping
            ProxyRaster raster = new ProxyRaster(_factory.Object, _service.Object, null);

            Assert.IsFalse(raster.IsMapped);
            Assert.IsNull(raster.Mapper);
            Assert.IsTrue(raster.Coordinates.All(coordinate => !coordinate.IsValid));

            Assert.AreEqual(_service.Object.IsReadable, raster.IsReadable);
            Assert.AreEqual(_service.Object.IsWritable, raster.IsWritable);
            Assert.AreEqual(_service.Object.Dimensions, raster.Dimensions);
            Assert.AreEqual(_service.Object.Format, raster.Format);
            Assert.AreEqual(_service.Object.Dimensions.NumberOfBands, raster.NumberOfBands);
            Assert.AreEqual(_service.Object.Dimensions.NumberOfBands, raster.Bands.Count);
            Assert.AreEqual(_factory.Object, raster.Factory);

            // successful construction with mapping

            RasterMapper mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, 1000, 1000, 0, 10, 10, 1);

            raster = new ProxyRaster(_factory.Object, _service.Object, mapper);
            Assert.IsTrue(raster.IsMapped);
            Assert.AreEqual(mapper, raster.Mapper);
            Assert.AreEqual(new Coordinate(1000, 1200), raster.Coordinates[0]);
            Assert.AreEqual(new Coordinate(1150, 1200), raster.Coordinates[1]);
            Assert.AreEqual(new Coordinate(1150, 1000), raster.Coordinates[2]);
            Assert.AreEqual(new Coordinate(1000, 1000), raster.Coordinates[3]);

            // argument null exception

            Assert.Throws <ArgumentNullException>(() => { raster = new ProxyRaster(_factory.Object, null, null); });
        }
Exemple #4
0
        public void ProxyRasterSetValuesTest()
        {
            _service.Setup(entity => entity.WriteValueSequence(It.IsInRange(0, 19, Moq.Range.Inclusive),
                                                               It.IsInRange(0, 14, Moq.Range.Inclusive),
                                                               It.IsInRange(0, 2, Moq.Range.Inclusive), It.IsAny <UInt32[]>()))
            .Callback(new Action <Int32, Int32, Int32, UInt32[]>((rowIndex, columnIndex, bandIndex, values) => Assert.IsTrue(values.SequenceEqual(new UInt32[] { 0, 1, 2 }))));

            // test case 1: index based

            ProxyRaster raster = new ProxyRaster(_factory.Object, _service.Object, null);

            for (Int32 j = 0; j < raster.NumberOfRows; j += 5)
            {
                for (Int32 k = 0; k < raster.NumberOfColumns; k += 5)
                {
                    raster.SetValues(j, k, new UInt32[] { 0, 1, 2 });
                }
            }

            // test case 2: coordinate based

            RasterMapper mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsCoordinate, 1000, 1000, 0, 10, 10, 1);

            raster = new ProxyRaster(_factory.Object, _service.Object, mapper);

            for (Int32 x = 1000; x < 1000 + 10 * _service.Object.Dimensions.NumberOfColumns; x += 100)
            {
                for (Int32 y = 1000; y < 1000 + 10 * _service.Object.Dimensions.NumberOfRows; y += 100)
                {
                    raster.SetValues(new Coordinate(x, y), new UInt32[] { 0, 1, 2 });
                    raster[new Coordinate(x, y)] = new UInt32[] { 0, 1, 2 };
                }
            }
        }
        /// <summary>
        /// Computes the raster mapper.
        /// </summary>
        /// <returns>The raster mapper.</returns>
        protected override RasterMapper ComputeRasterMapper()
        {
            RasterMapper mapper = null;

            // try to read from file content
            try
            {
                mapper = ComputeRasterToModelSpaceMapping();
            }
            catch { }

            if (mapper != null)
            {
                return(mapper);
            }

            // try to read from metafile
            if (_metafileReader != null)
            {
                try
                {
                    mapper = _metafileReader.ReadMapping();
                }
                catch { }
            }


            if (mapper != null)
            {
                return(mapper);
            }

            // use default mapping
            return(RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, Coordinate.Empty, new CoordinateVector(1, 1, 0)));
        }
Exemple #6
0
        /// <summary>
        /// Sets the parameters of the format.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        private void SetParameters(IDictionary <GeometryStreamParameter, Object> parameters)
        {
            _layout                = ResolveParameter <RawImageLayout>(SpectralGeometryStreamParameters.Layout);
            _numberOfRows          = ResolveParameter <Int32>(SpectralGeometryStreamParameters.NumerOfRows);
            _numberOfColumns       = ResolveParameter <Int32>(SpectralGeometryStreamParameters.NumberOfColumns);
            _numberOfBands         = ResolveParameter <Int32>(SpectralGeometryStreamParameters.SpectralResolution);
            _radiometricResolution = ResolveParameter <Int32>(SpectralGeometryStreamParameters.RadiometricResolution);
            _byteOrder             = ResolveParameter <ByteOrder>(SpectralGeometryStreamParameters.SpectralResolution);
            _bytesGapPerBand       = ResolveParameter <Int32>(SpectralGeometryStreamParameters.BytesGapPerBand);
            _bytesPerBandRow       = IsProvidedParameter(SpectralGeometryStreamParameters.BytesPerBandRow) ?
                                     ResolveParameter <Int32>(SpectralGeometryStreamParameters.BytesPerBandRow) :
                                     Convert.ToInt32(Math.Ceiling(_numberOfColumns * _radiometricResolution / 8.0));
            _bytesPerRow = IsProvidedParameter(SpectralGeometryStreamParameters.BytesPerRow) ?
                           ResolveParameter <Int32>(SpectralGeometryStreamParameters.BytesPerRow) :
                           (_layout == RawImageLayout.BandInterlevedByLine ? _numberOfBands * _bytesGapPerBand : (Int32)Math.Ceiling(_numberOfRows * _numberOfColumns * _radiometricResolution / 8.0));
            _bytesSkipped = ResolveParameter <Int32>(SpectralGeometryStreamParameters.BytesSkipped);

            // set raster mapping if all parameters are available
            if (parameters.ContainsKey(SpectralGeometryStreamParameters.TieCoordinate) && parameters.ContainsKey(SpectralGeometryStreamParameters.ColumnDimension) && parameters.ContainsKey(SpectralGeometryStreamParameters.RowDimension))
            {
                _mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsCoordinate,
                                                          ResolveParameter <Coordinate>(SpectralGeometryStreamParameters.TieCoordinate).X,
                                                          ResolveParameter <Coordinate>(SpectralGeometryStreamParameters.TieCoordinate).Y,
                                                          0,
                                                          ResolveParameter <Double>(SpectralGeometryStreamParameters.ColumnDimension),
                                                          ResolveParameter <Double>(SpectralGeometryStreamParameters.RowDimension),
                                                          1);
            }
        }
        public void SetUp()
        {
            List <Coordinate> coordinates = new List <Coordinate>
            {
                new Coordinate(0, 0),
                new Coordinate(0, 4),
                new Coordinate(4, 0),
                new Coordinate(4, 4)
            };

            RasterMapper mapper = RasterMapper.FromCoordinates(RasterMapMode.ValueIsArea,
                                                               new RasterCoordinate(0, 0, 0, 0),
                                                               new RasterCoordinate(4, 0, 0, 4),
                                                               new RasterCoordinate(4, 4, 4, 4),
                                                               new RasterCoordinate(0, 4, 4, 0));

            _sourceRasterMock = new Mock <IRaster>(MockBehavior.Strict);
            _sourceRasterMock.Setup(raster => raster.Factory).Returns(new RasterFactory());
            _sourceRasterMock.Setup(raster => raster.Coordinates).Returns(coordinates);
            _sourceRasterMock.Setup(raster => raster.IsReadable).Returns(true);
            _sourceRasterMock.Setup(raster => raster.Dimensions).Returns(new RasterDimensions(4, 4, 1, 8));
            _sourceRasterMock.Setup(raster => raster.NumberOfRows).Returns(4);
            _sourceRasterMock.Setup(raster => raster.NumberOfColumns).Returns(4);
            _sourceRasterMock.Setup(raster => raster.NumberOfBands).Returns(1);
            _sourceRasterMock.Setup(raster => raster.RadiometricResolution).Returns(8);
            _sourceRasterMock.Setup(raster => raster.Mapper).Returns(mapper);
            _sourceRasterMock.Setup(raster => raster.Format).Returns(RasterFormat.Integer);
            _sourceRasterMock.Setup(raster => raster.IsMapped).Returns(true);

            _sourceRasterMock.Setup(raster => raster.GetValue(It.IsInRange(0, 4, Moq.Range.Inclusive), It.IsInRange(0, 4, Moq.Range.Inclusive), It.IsInRange(0, 3, Moq.Range.Inclusive))).Returns(4);


            _referenceRasterMock = new Mock <IRaster>(MockBehavior.Strict);
            _referenceRasterMock.Setup(raster => raster.Factory).Returns(new RasterFactory());
            _referenceRasterMock.Setup(raster => raster.Coordinates).Returns(coordinates);
            _referenceRasterMock.Setup(raster => raster.IsReadable).Returns(true);
            _referenceRasterMock.Setup(raster => raster.Dimensions).Returns(new RasterDimensions(4, 4, 1, 8));
            _referenceRasterMock.Setup(raster => raster.NumberOfRows).Returns(4);
            _referenceRasterMock.Setup(raster => raster.NumberOfColumns).Returns(4);
            _referenceRasterMock.Setup(raster => raster.NumberOfBands).Returns(1);
            _referenceRasterMock.Setup(raster => raster.RadiometricResolution).Returns(8);
            _referenceRasterMock.Setup(raster => raster.Mapper).Returns(mapper);
            _referenceRasterMock.Setup(raster => raster.Format).Returns(RasterFormat.Integer);
            _referenceRasterMock.Setup(raster => raster.IsMapped).Returns(true);

            for (Int32 i = 0; i < 4; i++)
            {
                for (Int32 j = 0; j < 4; j++)
                {
                    if (i == 0 && j == 0)
                    {
                        _referenceRasterMock.Setup(raster => raster.GetValue(0, 0, It.IsInRange(0, 3, Moq.Range.Inclusive))).Returns(10);
                    }
                    else
                    {
                        _referenceRasterMock.Setup(raster => raster.GetValue(i, j, It.IsInRange(0, 3, Moq.Range.Inclusive))).Returns(4);
                    }
                }
            }
        }
        public void RasterMapperFromMapperTest()
        {
            // matrix from identity

            RasterMapper sourceMapper = new RasterMapper(RasterMapMode.ValueIsArea, MatrixFactory.CreateIdentity(4));

            RasterMapper mapper = RasterMapper.FromMapper(sourceMapper, MatrixFactory.CreateIdentity(4));

            Assert.AreEqual(RasterMapMode.ValueIsArea, mapper.Mode);
            Assert.AreEqual(MatrixFactory.CreateIdentity(4), mapper.GeometryTransformation);


            // coordinate and vector from identity

            mapper = RasterMapper.FromMapper(sourceMapper, new Coordinate(300, 1000, 0), new CoordinateVector(10, 3));

            Assert.AreEqual(RasterMapMode.ValueIsArea, mapper.Mode);
            Assert.AreEqual(new CoordinateVector(10, 0), mapper.ColumnVector);
            Assert.AreEqual(new CoordinateVector(0, 3), mapper.RowVector);
            Assert.AreEqual(new Coordinate(300, 1000), mapper.Translation);


            // all values from identity

            mapper = RasterMapper.FromMapper(sourceMapper, 300, 1000, 0, 10, 3, 0);

            Assert.AreEqual(RasterMapMode.ValueIsArea, mapper.Mode);
            Assert.AreEqual(new CoordinateVector(10, 0), mapper.ColumnVector);
            Assert.AreEqual(new CoordinateVector(0, 3), mapper.RowVector);
            Assert.AreEqual(new Coordinate(300, 1000), mapper.Translation);


            // exceptions

            Assert.Throws <ArgumentNullException>(() => RasterMapper.FromMapper(mapper, null));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, new Matrix(1, 4)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, new Matrix(4, 1)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, new Matrix(4, 4, Double.NaN)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, new Matrix(4, 4)));
            Assert.Throws <ArgumentException>(() =>
            {
                Matrix matrix = new Matrix(4, 4);
                matrix[3, 0]  = matrix[3, 1] = matrix[3, 2] = matrix[3, 3] = 1;
                RasterMapper.FromMapper(mapper, matrix);
            });
            Assert.Throws <NotSupportedException>(() => RasterMapper.FromMapper(mapper, MatrixFactory.CreateDiagonal(0, 0, 0, 1)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, Coordinate.Undefined, new CoordinateVector(0, 1, 0)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, Coordinate.Empty, new CoordinateVector(Double.NaN, Double.NaN, Double.NaN)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, Coordinate.Empty, new CoordinateVector(0, 1, 0)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, Coordinate.Empty, new CoordinateVector(1, 0, 0)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, Double.NaN, 0, 0, 1, 0, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, 0, Double.NaN, 0, 1, 0, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, 0, 0, Double.NaN, 1, 0, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, 0, 0, 0, 1, 0, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, 0, 0, 0, 0, 1, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, 0, 0, 0, Double.NaN, 1, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, 0, 0, 0, 1, Double.NaN, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromMapper(mapper, 0, 0, 0, 1, 1, Double.NaN));
        }
Exemple #9
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ProxyRaster" /> class.
        /// </summary>
        /// <param name="factory">The raster factory.</param>
        /// <param name="service">The raster service.</param>
        /// <param name="mapper">The raster mapper.</param>
        /// <exception cref="System.ArgumentNullException">The service is null.</exception>
        public ProxyRaster(IRasterFactory factory, IRasterService service, RasterMapper mapper)
            : base(factory, service?.Dimensions, mapper)
        {
            if (service == null)
            {
                throw new ArgumentNullException("service", "The service is null.");
            }

            _service             = service;
            _isSequentialService = _service.DataOrder == RasterDataOrder.RowColumnBand;

            _histogramValues = Enumerable.Repeat <Int32[]>(null, NumberOfRows).ToArray();
        }
        public void RasterMapperFromTransformationTest()
        {
            // matrix

            RasterMapper mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, MatrixFactory.CreateIdentity(4));

            Assert.AreEqual(RasterMapMode.ValueIsArea, mapper.Mode);
            Assert.AreEqual(MatrixFactory.CreateIdentity(4), mapper.GeometryTransformation);


            // coordinate and vector

            mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, new Coordinate(300, 1000, 0), new CoordinateVector(10, 3));

            Assert.AreEqual(new Coordinate(300, 1000), mapper.Translation);
            Assert.AreEqual(RasterMapMode.ValueIsArea, mapper.Mode);
            Assert.AreEqual(10, mapper.ColumnSize);
            Assert.AreEqual(3, mapper.RowSize);
            Assert.AreEqual(new CoordinateVector(10, 0), mapper.ColumnVector);
            Assert.AreEqual(new CoordinateVector(0, 3), mapper.RowVector);


            // all values

            mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, 300, 1000, 0, 10, 3, 0);

            Assert.AreEqual(new Coordinate(300, 1000), mapper.Translation);
            Assert.AreEqual(RasterMapMode.ValueIsArea, mapper.Mode);
            Assert.AreEqual(10, mapper.ColumnSize);
            Assert.AreEqual(3, mapper.RowSize);
            Assert.AreEqual(new CoordinateVector(10, 0), mapper.ColumnVector);
            Assert.AreEqual(new CoordinateVector(0, 3), mapper.RowVector);


            // exceptions

            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, Coordinate.Undefined, new CoordinateVector(0, 1, 0)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, Coordinate.Empty, new CoordinateVector(Double.NaN, Double.NaN, Double.NaN)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, Coordinate.Empty, new CoordinateVector(0, 1, 0)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, Coordinate.Empty, new CoordinateVector(1, 0, 0)));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, Double.NaN, 0, 0, 1, 0, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, 0, Double.NaN, 0, 1, 0, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, 0, 0, Double.NaN, 1, 0, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, 0, 0, 0, 1, 0, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, 0, 0, 0, 0, 1, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, 0, 0, 0, Double.NaN, 1, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, 0, 0, 0, 1, Double.NaN, 0));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, 0, 0, 0, 1, 1, Double.NaN));
        }
Exemple #11
0
        /// <summary>
        /// Sets the properties of the result.
        /// </summary>
        /// <param name="format">The raster format.</param>
        /// <param name="numberOfBands">The number of bands.</param>
        /// <param name="numberOfRows">The number of rows.</param>
        /// <param name="numberOfColumns">The number of columns.</param>
        /// <param name="radiometricResolution">The radiometric resolution.</param>
        /// <param name="mapper">The mapper.</param>
        /// <param name="presentation">The raster presentation.</param>
        /// <param name="imaging">The raster imaging.</param>
        protected void SetResultProperties(RasterFormat format, Int32 numberOfBands, Int32 numberOfRows, Int32 numberOfColumns, Int32 radiometricResolution, RasterMapper mapper, RasterPresentation presentation, RasterImaging imaging)
        {
            if (_resultPropertiesSet)
            {
                return;
            }

            _resultFormat       = format;
            _resultDimensions   = new RasterDimensions(numberOfBands, numberOfRows, numberOfColumns, radiometricResolution);
            _resultMapper       = mapper;
            _resultPresentation = presentation;
            _resultImaging      = imaging;

            _resultPropertiesSet = true;
        }
Exemple #12
0
        /// <summary>
        /// Sets the properties of the result.
        /// </summary>
        /// <param name="numberOfBands">The number of bands.</param>
        /// <param name="numberOfRows">The number of rows.</param>
        /// <param name="numberOfColumns">The number of columns.</param>
        /// <param name="radiometricResolution">The radiometric resolution.</param>
        protected void SetResultProperties(Int32 numberOfBands, Int32 numberOfRows, Int32 numberOfColumns, Int32 radiometricResolution)
        {
            if (_resultPropertiesSet)
            {
                return;
            }

            _resultFormat       = Source.Raster.Format;
            _resultDimensions   = new RasterDimensions(numberOfBands, numberOfRows, numberOfColumns, radiometricResolution);
            _resultMapper       = Source.Raster.Mapper;
            _resultPresentation = Source.Presentation;
            _resultImaging      = Source.Imaging;

            _resultPropertiesSet = true;
        }
Exemple #13
0
        /// <summary>
        /// Sets the properties of the result.
        /// </summary>
        /// <param name="format">The raster format.</param>
        /// <param name="dimensions">The raster dimensions.</param>
        protected void SetResultProperties(RasterFormat format, RasterDimensions dimensions)
        {
            if (_resultPropertiesSet)
            {
                return;
            }

            _resultFormat       = format;
            _resultDimensions   = dimensions ?? Source.Raster.Dimensions;
            _resultMapper       = Source.Raster.Mapper;
            _resultPresentation = Source.Presentation;
            _resultImaging      = Source.Imaging;

            _resultPropertiesSet = true;
        }
        public void RasterMapperGetHashCodeTest()
        {
            RasterMapper mapper1 = new RasterMapper(RasterMapMode.ValueIsArea, MatrixFactory.CreateIdentity(4));
            RasterMapper mapper2 = new RasterMapper(RasterMapMode.ValueIsArea, MatrixFactory.CreateIdentity(4));

            Assert.AreEqual(mapper1.GetHashCode(), mapper2.GetHashCode());

            mapper2 = new RasterMapper(RasterMapMode.ValueIsCoordinate, MatrixFactory.CreateIdentity(4));

            Assert.AreNotEqual(mapper1.GetHashCode(), mapper2.GetHashCode());

            mapper2 = RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, new Coordinate(300, 1000, 0), new CoordinateVector(10, 3));

            Assert.AreNotEqual(mapper1.GetHashCode(), mapper2.GetHashCode());
        }
Exemple #15
0
        /// <summary>
        /// Sets the properties of the result.
        /// </summary>
        /// <param name="format">The raster format.</param>
        /// <param name="dimensions">The raster dimensions.</param>
        /// <param name="mapper">The mapper.</param>
        /// <param name="presentation">The raster presentation.</param>
        /// <param name="imaging">The raster imaging.</param>
        protected void SetResultProperties(RasterFormat format, RasterDimensions dimensions, RasterMapper mapper, RasterPresentation presentation, RasterImaging imaging)
        {
            if (_resultPropertiesSet)
            {
                return;
            }

            _resultFormat       = format;
            _resultDimensions   = dimensions ?? Source.Raster.Dimensions;
            _resultMapper       = mapper;
            _resultPresentation = presentation;
            _resultImaging      = imaging;

            _resultPropertiesSet = true;
        }
Exemple #16
0
        /// <summary>
        /// Sets the properties of the result.
        /// </summary>
        /// <param name="geometry">The geometry.</param>
        /// <param name="format">The raster format.</param>
        /// <param name="numberOfBands">The number of bands.</param>
        /// <param name="radiometricResolution">The radiometric resolution.</param>
        /// <param name="presentation">The raster presentation.</param>
        protected void SetResultProperties(ISpectralGeometry geometry, RasterFormat format, Int32 numberOfBands, Int32 radiometricResolution, RasterPresentation presentation)
        {
            if (_resultPropertiesSet)
            {
                return;
            }

            _resultGeometry     = geometry;
            _resultFormat       = format;
            _resultDimensions   = new RasterDimensions(numberOfBands, Source.Raster.NumberOfRows, Source.Raster.NumberOfColumns, radiometricResolution);
            _resultMapper       = Source.Raster.Mapper;
            _resultPresentation = presentation;
            _resultImaging      = Source.Imaging;

            _resultPropertiesSet = true;
        }
Exemple #17
0
        /// <summary>
        /// Computes the raster mapper of the mask.
        /// </summary>
        /// <param name="source">The source.</param>
        /// <param name="rowStart">The starting row index of a mask.</param>
        /// <param name="columnStart">The starting column index of a mask.</param>
        /// <param name="numberOfRows">The number of rows in the mask.</param>
        /// <param name="numberOfColumns">The number of columns in the mask.</param>
        /// <returns>The raster mapper of the specified source.</returns>
        /// <exception cref="System.ArgumentNullException">The source is null.</exception>
        private static RasterMapper ComputeMapper(IRaster source, Int32 rowStart, Int32 columnStart)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source", "The source is null.");
            }

            if (source.Mapper == null)
            {
                return(null);
            }
            else
            {
                // the mask is a translation of the source
                return(RasterMapper.FromMapper(source.Mapper, (Coordinate)(source.Mapper.MapCoordinate(rowStart, columnStart) - source.Mapper.MapCoordinate(0, 0)), new CoordinateVector(1, 1, 1)));
            }
        }
Exemple #18
0
        /// <summary>
        /// Reads the raster mapping stored in the metafile stream.
        /// </summary>
        /// <returns>The raster mapping.</returns>
        protected override RasterMapper ReadMappingInternal()
        {
            List <RasterCoordinate> coordinates = new List <RasterCoordinate>(4);

            foreach (XElement vertexElement in _document.Element("Dimap_Document").Element("Dataset_Frame").Elements("Vertex"))
            {
                RasterCoordinate coordinate = new RasterCoordinate(
                    Int32.Parse(vertexElement.Element("FRAME_ROW").Value, NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat),
                    Int32.Parse(vertexElement.Element("FRAME_COL").Value, NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat),
                    Double.Parse(vertexElement.Element("FRAME_LAT").Value, NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat),
                    Double.Parse(vertexElement.Element("FRAME_LON").Value, NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat)
                    );

                coordinates.Add(coordinate);
            }

            return(RasterMapper.FromCoordinates(RasterMapMode.ValueIsArea, coordinates));
        }
Exemple #19
0
        public void ProxyRasterSetValueTest()
        {
            for (Int32 i = 0; i < 3; i++)
            {
                _service.Setup(entity => entity.WriteValue(It.IsInRange(0, 19, Moq.Range.Inclusive),
                                                           It.IsInRange(0, 14, Moq.Range.Inclusive),
                                                           i, It.IsAny <UInt32>()))
                .Callback(new Action <Int32, Int32, Int32, UInt32>((rowIndex, columnIndex, bandIndex, value) => Assert.AreEqual(bandIndex, value, 0)));
            }

            // test case 1: index based

            ProxyRaster raster = new ProxyRaster(_factory.Object, _service.Object, null);

            for (Int32 i = 0; i < raster.NumberOfBands; i++)
            {
                for (Int32 j = 0; j < raster.NumberOfRows; j += 5)
                {
                    for (Int32 k = 0; k < raster.NumberOfColumns; k += 5)
                    {
                        raster.SetValue(j, k, i, (UInt32)i);
                        raster[j, k, i] = (UInt32)i;
                    }
                }
            }

            // test case 2: coordinate based

            RasterMapper mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsCoordinate, 1000, 1000, 0, 10, 10, 1);

            raster = new ProxyRaster(_factory.Object, _service.Object, mapper);

            for (Int32 i = 0; i < raster.NumberOfBands; i++)
            {
                for (Int32 x = 1000; x < 1000 + 10 * _service.Object.Dimensions.NumberOfColumns; x += 100)
                {
                    for (Int32 y = 1000; y < 1000 + 10 * _service.Object.Dimensions.NumberOfRows; y += 100)
                    {
                        raster.SetValue(new Coordinate(x, y), i, (UInt32)i);
                        raster[new Coordinate(x, y), i] = (UInt32)i;
                    }
                }
            }
        }
Exemple #20
0
        public void ProxyRasterGetValueTest()
        {
            // index based

            ProxyRaster raster = new ProxyRaster(_factory.Object, _service.Object, null);

            for (Int32 i = -1; i <= raster.NumberOfBands; i++)
            {
                for (Int32 j = -1; j <= raster.NumberOfRows + 5; j += 5)
                {
                    for (Int32 k = -1; k <= raster.NumberOfColumns + 5; k += 5)
                    {
                        try
                        {
                            Assert.AreEqual(_service.Object.ReadValue(j, k, i), raster.GetValue(j, k, i));
                            Assert.AreEqual(_service.Object.ReadValue(j, k, i), raster[j, k, i]);
                        }
                        catch (ArgumentOutOfRangeException)
                        {
                            Assert.IsTrue(i < 0 || i >= raster.NumberOfBands ||
                                          j < 0 || j >= raster.NumberOfRows ||
                                          k < 0 || k >= raster.NumberOfColumns);
                        }
                    }
                }
            }

            // coordinate based

            RasterMapper mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsCoordinate, 1000, 1000, 0, 10, 10, 1);

            raster = new ProxyRaster(_factory.Object, _service.Object, mapper);

            for (Int32 x = 1000; x < 1000 + 10 * _service.Object.Dimensions.NumberOfColumns; x += 100)
            {
                for (Int32 y = 1000; y < 1000 + 10 * _service.Object.Dimensions.NumberOfRows; y += 100)
                {
                    Assert.AreEqual(_service.Object.ReadValue((x - 1000) / 10, (y - 1000) / 10, 0), raster.GetValue(new Coordinate(x, y), 0));
                    Assert.AreEqual(_service.Object.ReadValue((x - 1000) / 10, (y - 1000) / 10, 0), raster[new Coordinate(x, y), 0]);
                }
            }
        }
Exemple #21
0
        /// <summary>
        /// Prepares the result of the operation.
        /// </summary>
        /// <returns>The resulting geometry.</returns>
        protected override ISpectralGeometry PrepareResult()
        {
            // compute the mapper
            RasterMapper mapper  = null;
            IPolygon     polygon = null;

            if (Source.Raster.IsMapped)
            {
                mapper = RasterMapper.FromMapper(Source.Raster.Mapper,
                                                 (Coordinate)(Source.Raster.Mapper.MapCoordinate(SourceRowOffset, SourceColumnOffset) - Source.Raster.Mapper.MapCoordinate(0, 0)),
                                                 new CoordinateVector(SourceRowCount / _targetNumberOfRows, SourceColumnCount / _targetNumberOfColumns));

                if (mapper.Mode == RasterMapMode.ValueIsArea)
                {
                    polygon = Source.Factory.CreatePolygon(mapper.MapCoordinate(0, 0),
                                                           mapper.MapCoordinate(_targetNumberOfRows - 1, 0),
                                                           mapper.MapCoordinate(_targetNumberOfRows - 1, _targetNumberOfColumns - 1),
                                                           mapper.MapCoordinate(0, _targetNumberOfColumns - 1));
                }
                else
                {
                    polygon = Source.Factory.CreatePolygon(mapper.MapCoordinate(0, 0),
                                                           mapper.MapCoordinate(_targetNumberOfRows, 0),
                                                           mapper.MapCoordinate(_targetNumberOfRows, _targetNumberOfColumns),
                                                           mapper.MapCoordinate(0, _targetNumberOfColumns));
                }
            }
            else
            {
                polygon = Source.Factory.CreatePolygon(new Coordinate(0, 0),
                                                       new Coordinate(_targetNumberOfRows, 0),
                                                       new Coordinate(_targetNumberOfRows, _targetNumberOfColumns),
                                                       new Coordinate(0, _targetNumberOfColumns));
            }

            SetResultProperties(Source.Raster.Format, Source.Raster.NumberOfBands, _targetNumberOfRows, _targetNumberOfColumns, Source.Raster.RadiometricResolution, mapper);

            return(base.PrepareResult());
        }
        public void RasterMapperEqualsTest()
        {
            RasterMapper mapper1 = new RasterMapper(RasterMapMode.ValueIsArea, MatrixFactory.CreateIdentity(4));
            RasterMapper mapper2 = new RasterMapper(RasterMapMode.ValueIsArea, MatrixFactory.CreateIdentity(4));

            Assert.IsTrue(mapper1.Equals(mapper1));
            Assert.IsFalse(mapper1.Equals(null));
            Assert.IsTrue(mapper1.Equals(mapper2));
            Assert.IsTrue(mapper1.Equals((Object)mapper1));
            Assert.IsFalse(mapper1.Equals((Object)null));
            Assert.IsTrue(mapper1.Equals((Object)mapper2));

            mapper2 = new RasterMapper(RasterMapMode.ValueIsCoordinate, MatrixFactory.CreateIdentity(4));

            Assert.IsFalse(mapper1.Equals(mapper2));
            Assert.IsFalse(mapper1.Equals((Object)mapper2));

            mapper2 = RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, new Coordinate(300, 1000, 0), new CoordinateVector(10, 3));

            Assert.IsFalse(mapper1.Equals(mapper2));
            Assert.IsFalse(mapper1.Equals((Object)mapper2));
        }
Exemple #23
0
        public void ProxyRasterNearestValueTest()
        {
            // test case 1: index based

            ProxyRaster raster = new ProxyRaster(_factory.Object, _service.Object, null);

            for (Int32 i = 0; i < raster.NumberOfBands; i++)
            {
                for (Int32 j = -1; j <= raster.NumberOfRows + 5; j += 5)
                {
                    for (Int32 k = -1; k <= raster.NumberOfColumns + 5; k += 5)
                    {
                        Assert.AreEqual(_service.Object.ReadValue(Math.Max(0, Math.Min(j, _service.Object.Dimensions.NumberOfRows - 1)),
                                                                  Math.Max(0, Math.Min(j, _service.Object.Dimensions.NumberOfColumns - 1)), i),
                                        raster.GetNearestValue(j, k, i));
                    }
                }
            }

            // test case 2: coordinate based

            RasterMapper mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsCoordinate, 1000, 1000, 0, 10, 10, 1);

            raster = new ProxyRaster(_factory.Object, _service.Object, mapper);

            for (Int32 i = 0; i < raster.NumberOfBands; i++)
            {
                for (Int32 x = 1000; x < 1000 + 10 * _service.Object.Dimensions.NumberOfColumns; x += 100)
                {
                    for (Int32 y = 1000; y < 1000 + 10 * _service.Object.Dimensions.NumberOfRows; y += 100)
                    {
                        Assert.AreEqual(_service.Object.ReadValue(Math.Max(0, Math.Min((x - 1000) / 10, _service.Object.Dimensions.NumberOfRows - 1)),
                                                                  Math.Max(0, Math.Min((y - 1000) / 10, _service.Object.Dimensions.NumberOfColumns - 1)), i),
                                        raster.GetNearestValue(new Coordinate(x, y), i));
                    }
                }
            }
        }
        public void RasterMapperFromCoordinatesTest()
        {
            RasterMapper sourceMapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsCoordinate, new Coordinate(300, 1000, 0), new CoordinateVector(10, 3));

            RasterMapper mapper = RasterMapper.FromCoordinates(RasterMapMode.ValueIsCoordinate,
                                                               new RasterCoordinate(0, 0, sourceMapper.MapCoordinate(0, 0)),
                                                               new RasterCoordinate(100, 0, sourceMapper.MapCoordinate(100, 0)),
                                                               new RasterCoordinate(100, 100, sourceMapper.MapCoordinate(100, 100)),
                                                               new RasterCoordinate(0, 100, sourceMapper.MapCoordinate(0, 100))
                                                               );

            Assert.AreEqual(RasterMapMode.ValueIsCoordinate, mapper.Mode);
            Assert.AreEqual(sourceMapper.ColumnVector, mapper.ColumnVector);
            Assert.AreEqual(sourceMapper.RowVector, mapper.RowVector);
            Assert.AreEqual(sourceMapper.Translation.X, mapper.Translation.X, 0.000001);
            Assert.AreEqual(sourceMapper.Translation.Y, mapper.Translation.Y, 0.000001);
            Assert.AreEqual(sourceMapper.Translation.Z, mapper.Translation.Z, 0.000001);

            // exceptions

            Assert.Throws <ArgumentNullException>(() => RasterMapper.FromCoordinates(RasterMapMode.ValueIsCoordinate, null));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromCoordinates(RasterMapMode.ValueIsCoordinate, new RasterCoordinate(0, 0, sourceMapper.MapCoordinate(0, 0)), new RasterCoordinate(0, 100, sourceMapper.MapCoordinate(0, 100))));
            Assert.Throws <ArgumentException>(() => RasterMapper.FromCoordinates(RasterMapMode.ValueIsCoordinate, new RasterCoordinate(0, 0, sourceMapper.MapCoordinate(0, 0)), new RasterCoordinate(100, 0, sourceMapper.MapCoordinate(100, 0))));
        }
        public void RasterMapperMapRasterTest()
        {
            // value is coordinate

            RasterMapper mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsCoordinate, 300, 1000, 0, 10, 3, 1);

            for (Int32 i = -100; i < 100; i += 3)
            {
                for (Int32 j = -100; j < 100; j += 3)
                {
                    Int32 rowIndex, columnIndex;
                    mapper.MapRaster(new Coordinate(300 + i * 10, 1000 + j * 3), out rowIndex, out columnIndex);

                    Assert.AreEqual(i, columnIndex);
                    Assert.AreEqual(j, rowIndex);

                    Double floatRowIndex, floatColumnIndex;

                    mapper.MapRaster(new Coordinate(300 + i * 10, 1000 + j * 3), out floatRowIndex, out floatColumnIndex);

                    Assert.AreEqual(i, floatColumnIndex);
                    Assert.AreEqual(j, floatRowIndex);

                    mapper.MapRaster(new Coordinate(300 + i * 10, 1000 + j * 3), RasterMapMode.ValueIsCoordinate, out floatRowIndex, out floatColumnIndex);

                    Assert.AreEqual(i, floatColumnIndex);
                    Assert.AreEqual(j, floatRowIndex);

                    mapper.MapRaster(new Coordinate(295 + i * 10, 998.5 + j * 3), RasterMapMode.ValueIsArea, out floatRowIndex, out floatColumnIndex);

                    Assert.AreEqual(i, floatColumnIndex);
                    Assert.AreEqual(j, floatRowIndex);
                }
            }


            // value is area

            mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsArea, 300, 1000, 0, 10, 3, 1);

            for (Int32 i = -100; i < 100; i += 3)
            {
                for (Int32 j = -100; j < 100; j += 3)
                {
                    Int32 rowIndex, columnIndex;
                    mapper.MapRaster(new Coordinate(300 + i * 10, 1000 + j * 3), out rowIndex, out columnIndex);

                    Assert.AreEqual(i, columnIndex);
                    Assert.AreEqual(j, rowIndex);

                    Double floatRowIndex, floatColumnIndex;

                    mapper.MapRaster(new Coordinate(300 + i * 10, 1000 + j * 3), out floatRowIndex, out floatColumnIndex);

                    Assert.AreEqual(i, floatColumnIndex);
                    Assert.AreEqual(j, floatRowIndex);

                    mapper.MapRaster(new Coordinate(305 + i * 10, 1001.5 + j * 3), RasterMapMode.ValueIsCoordinate, out floatRowIndex, out floatColumnIndex);

                    Assert.AreEqual(i, floatColumnIndex);
                    Assert.AreEqual(j, floatRowIndex);

                    mapper.MapRaster(new Coordinate(300 + i * 10, 1000 + j * 3), RasterMapMode.ValueIsArea, out floatRowIndex, out floatColumnIndex);

                    Assert.AreEqual(i, floatColumnIndex);
                    Assert.AreEqual(j, floatRowIndex);
                }
            }
        }
Exemple #26
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Raster16" /> class.
        /// </summary>
        /// <param name="factory">The factory.</param>
        /// <param name="spectralValues">The array of spectral values.</param>
        /// <param name="dimensions">The dimensions of the raster.</param>
        /// <param name="mapper">The mapper.</param>
        private Raster16(IRasterFactory factory, UInt16[][] spectralValues, RasterDimensions dimensions, RasterMapper mapper)
            : base(factory, dimensions, mapper)
        {
            // copy values for all bands
            for (Int32 bandIndex = 0; bandIndex < spectralValues.Length; bandIndex++)
            {
                _values[bandIndex] = new UInt16[spectralValues[bandIndex].Length];
                Array.Copy(spectralValues[bandIndex], _values[bandIndex], spectralValues[bandIndex].Length);
            }

            _histogramValues = Enumerable.Repeat <Int32[]>(null, spectralValues.Length).ToArray();
        }
Exemple #27
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Raster16" /> class.
        /// </summary>
        /// <param name="factory">The factory.</param>
        /// <param name="numberOfBands">The number of bands.</param>
        /// <param name="numberOfRows">The number of rows.</param>
        /// <param name="numberOfColumns">The number of columns.</param>
        /// <param name="radiometricResolution">The radiometric resolution.</param>
        /// <param name="mapper">The mapper.</param>
        /// <exception cref="System.ArgumentOutOfRangeException">
        /// The number of bands is less than 1.
        /// or
        /// The number of rows is less than 0.
        /// or
        /// The number of columns is less than 0.
        /// or
        /// The radiometric resolution is less than 1.
        /// or
        /// The radiometric resolution is greater than 64.
        /// </exception>
        public Raster16(IRasterFactory factory, Int32 numberOfBands, Int32 numberOfRows, Int32 numberOfColumns, Int32 radiometricResolution, RasterMapper mapper)
            : base(factory, numberOfBands, numberOfRows, numberOfColumns, radiometricResolution, mapper)
        {
            // generate empty values for all bands
            _values          = Enumerable.Repeat <UInt16[]>(null, numberOfBands).ToArray();
            _histogramValues = Enumerable.Repeat <Int32[]>(null, numberOfBands).ToArray();

            for (Int32 bandIndex = 0; bandIndex < _values.Length; bandIndex++)
            {
                _values[bandIndex] = new UInt16[NumberOfRows * NumberOfColumns];
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="RasterFloat32" /> class.
 /// </summary>
 /// <param name="factory">The factory.</param>
 /// <param name="spectralValues">The array of spectral values.</param>
 /// <param name="dimensions">The dimensions of the raster.</param>
 /// <param name="mapper">The mapper.</param>
 private RasterFloat32(IRasterFactory factory, Single[][] spectralValues, RasterDimensions dimensions, RasterMapper mapper)
     : base(factory, dimensions, mapper)
 {
     // copy values for all bands
     for (Int32 bandIndex = 0; bandIndex < spectralValues.Length; bandIndex++)
     {
         _values[bandIndex] = new Single[spectralValues[bandIndex].Length];
         Array.Copy(spectralValues[bandIndex], _values[bandIndex], spectralValues[bandIndex].Length);
     }
 }
        /// <summary>
        /// Reads the mapping from model space to raster space.
        /// </summary>
        /// <returns>The mapping from model space to raster space.</returns>
        protected RasterMapper ComputeRasterToModelSpaceMapping()
        {
            if (!_currentGeoKeys.ContainsKey(GeoKey.RasterType))
            {
                return(null);
            }

            RasterMapMode mode = Convert.ToInt16(_currentGeoKeys[GeoKey.RasterType]) == 1 ? RasterMapMode.ValueIsArea : RasterMapMode.ValueIsCoordinate;

            Double[] modelTiePointsArray      = null;
            Double[] modelPixelScaleArray     = null;
            Double[] modelTransformationArray = null;

            // gather information from tags
            if (_imageFileDirectories[_currentImageIndex].ContainsKey(TiffTag.ModelTiepointTag))
            {
                modelTiePointsArray = _imageFileDirectories[_currentImageIndex][TiffTag.ModelTiepointTag].Select(value => Convert.ToDouble(value)).ToArray();
            }
            if (_imageFileDirectories[_currentImageIndex].ContainsKey(TiffTag.ModelPixelScaleTag))
            {
                modelPixelScaleArray = _imageFileDirectories[_currentImageIndex][TiffTag.ModelPixelScaleTag].Select(value => Convert.ToDouble(value)).ToArray();
            }
            if (_imageFileDirectories[_currentImageIndex].ContainsKey(TiffTag.ModelTransformationTag))
            {
                modelTransformationArray = _imageFileDirectories[_currentImageIndex][TiffTag.ModelTransformationTag].Select(value => Convert.ToDouble(value)).ToArray();
            }

            // for GeoTIFF 0.2, IntergraphMatrixTag (33920) may contain the transformation values
            if (modelTransformationArray == null && _imageFileDirectories[_currentImageIndex].ContainsKey(TiffTag.IntergraphMatrixTag))
            {
                modelTransformationArray = _imageFileDirectories[_currentImageIndex][TiffTag.IntergraphMatrixTag].Select(value => Convert.ToDouble(value)).ToArray();
            }

            // compute with model tie points
            if (modelTiePointsArray != null && (modelTiePointsArray.Length > 6 || (modelTiePointsArray.Length == 6 && modelPixelScaleArray.Length == 3)))
            {
                if (modelTiePointsArray.Length > 6) // transformation is specified by tie points
                {
                    RasterCoordinate[] coordinates = new RasterCoordinate[modelTiePointsArray.Length / 6];

                    for (Int32 i = 0; i < modelTiePointsArray.Length; i += 6)
                    {
                        coordinates[i / 6] = new RasterCoordinate(Convert.ToInt32(modelTiePointsArray[i]), Convert.ToInt32(modelTiePointsArray[i + 1]), new Coordinate(modelTiePointsArray[i + 3], modelTiePointsArray[i + 4], modelTiePointsArray[i + 5]));
                    }

                    return(RasterMapper.FromCoordinates(mode, coordinates));
                }
                else // transformation is specified by single tie point and scale
                {
                    Coordinate rasterSpaceCoordinate = new Coordinate(modelTiePointsArray[0], modelTiePointsArray[1], modelTiePointsArray[2]);
                    Coordinate modelSpaceCoordinate  = new Coordinate(modelTiePointsArray[3], modelTiePointsArray[4], modelTiePointsArray[5]);
                    Double     scaleX = modelPixelScaleArray[0];
                    Double     scaleY = -modelPixelScaleArray[1];
                    Double     scaleZ = modelPixelScaleArray[2];

                    return(RasterMapper.FromTransformation(mode,
                                                           modelSpaceCoordinate.X - rasterSpaceCoordinate.X * scaleX,
                                                           modelSpaceCoordinate.Y + rasterSpaceCoordinate.Y * scaleY,
                                                           modelSpaceCoordinate.Z - rasterSpaceCoordinate.Z * scaleZ,
                                                           scaleX, scaleY, scaleZ));
                }
            }

            // compute with transformation values
            if (modelTransformationArray != null)
            {
                Matrix transformation = new Matrix(4, 4);
                for (Int32 i = 0; i < 4; i++)
                {
                    for (Int32 j = 0; j < 4; j++)
                    {
                        transformation[i, j] = modelTransformationArray[i * 4 + j];
                    }
                }
                return(RasterMapper.FromTransformation(mode, transformation));
            }

            // nothing is available
            return(null);
        }
        /// <summary>
        /// Reads the header file.
        /// </summary>
        /// <exception cref="System.IO.FileNotFoundException">The header file is not available.</exception>
        private void ReadHeader()
        {
            String headerFileName;

            if (_fileSystem.Exists(_basePath + _fileSystem.DirectorySeparator + _baseFileName + ".hdr"))
            {
                headerFileName = _basePath + _fileSystem.DirectorySeparator + _baseFileName + ".hdr";
            }
            else if (_fileSystem.Exists(_basePath + _fileSystem.DirectorySeparator + _baseFileName + ".HDR"))
            {
                headerFileName = _basePath + _fileSystem.DirectorySeparator + _baseFileName + ".HDR";
            }
            else
            {
                throw new FileNotFoundException("The header file is not available.", _basePath + _fileSystem.DirectorySeparator + _baseFileName + ".hdr");
            }

            using (StreamReader reader = new StreamReader(headerFileName))
            {
                Double upperLeftX = 0, upperLeftY = 0, vectorX = 0, vectorY = 0;
                Regex  regex = new Regex(@"\s");

                while (!reader.EndOfStream)
                {
                    String line = reader.ReadLine();
                    if (String.IsNullOrEmpty(line) || line[0] == '#')
                    {
                        continue;
                    }

                    String[] lineParts = regex.Split(line.ToUpper()).Where(linePart => !String.IsNullOrEmpty(linePart)).ToArray();

                    if (lineParts.Length >= 2)
                    {
                        switch (lineParts[0])
                        {
                        case "BYTEORDER":
                            _byteOrder = (lineParts[1].Equals("I")) ? ByteOrder.LittleEndian : ByteOrder.BigEndian;
                            break;

                        case "LAYOUT":
                            switch (lineParts[1])
                            {
                            case "BIP":
                                _layout = RawImageLayout.BandInterlevedByPixel;
                                break;

                            case "BIL":
                                _layout = RawImageLayout.BandInterlevedByLine;
                                break;

                            case "BSQ":
                                _layout = RawImageLayout.BandSequential;
                                break;
                            }
                            break;

                        case "NROWS":
                            _numberOfRows = Int32.Parse(lineParts[1]);
                            break;

                        case "NCOLS":
                            _numberOfColumns = Int32.Parse(lineParts[1]);
                            break;

                        case "NBANDS":
                            _numberOfBands = Int32.Parse(lineParts[1]);
                            break;

                        case "NBITS":
                            _radiometricResolution = Int32.Parse(lineParts[1]);
                            break;

                        case "ULXMAP":
                            upperLeftX = Double.Parse(lineParts[1], CultureInfo.InvariantCulture);
                            break;

                        case "ULYMAP":
                            upperLeftY = Double.Parse(lineParts[1], CultureInfo.InvariantCulture);
                            break;

                        case "XDIM":
                            vectorX = Double.Parse(lineParts[1], CultureInfo.InvariantCulture);
                            break;

                        case "YDIM":
                            vectorY = Double.Parse(lineParts[1], CultureInfo.InvariantCulture);
                            break;
                        }
                    }
                }

                _bytesGapPerBand = 0;
                _bytesPerBandRow = (Int32)Math.Ceiling(_numberOfColumns * _radiometricResolution / 8.0);
                _bytesPerRow     = (Int32)Math.Ceiling(_numberOfRows * _numberOfColumns * _radiometricResolution / 8.0);
                _bytesSkipped    = 0;

                if (vectorX != 0 && vectorY != 0)
                {
                    _mapper = RasterMapper.FromTransformation(RasterMapMode.ValueIsCoordinate, upperLeftX, upperLeftY, 0, vectorX, vectorY, 0);
                }
            }
        }