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);
                    }
                }
            }
        }
Exemple #2
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));
        }
        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))));
        }
        /// <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);
        }