public MolodenskyBadekasGeographicTransformation(ISpheroid<double> spheroidFrom, MolodenskyBadekasTransformation molodenskyBadekas, ISpheroid<double> spheroidTo)
     : base(spheroidFrom, spheroidTo)
 {
     if (null == molodenskyBadekas) throw new ArgumentNullException("molodenskyBadekas");
     Contract.Requires(spheroidFrom != null);
     Contract.Requires(spheroidTo != null);
     MolodenskyBadekas = molodenskyBadekas;
 }
        public void EpsgExample2441Test()
        {
            var transform = new MolodenskyBadekasTransformation(
                new Vector3(-270.933, 115.599, -360.226),
                new Vector3(-0.000025530288, -0.000006001993, 0.000011543414),
                new Point3(2464351.59, -5783466.61, 974809.81),
                -5.109
            );
            var a = new Point3(2550408.96, -5749912.26, 1054891.11);
            var b = new Point3(2550138.46, -5749799.87, 1054530.82);

            var result = transform.TransformValue(a);

            Assert.AreEqual(b.X, result.X, 0.005);
            Assert.AreEqual(b.Y, result.Y, 0.0004);
            Assert.AreEqual(b.Z, result.Z, 0.006);
        }
        public void EpsgExample2441InverseTest()
        {
            var transform = new MolodenskyBadekasTransformation(
                new Vector3(-270.933, 115.599, -360.226),
                new Vector3(-0.000025530288, -0.000006001993, 0.000011543414),
                new Point3(2464351.59, -5783466.61, 974809.81),
                -5.109
                );
            var a = new Point3(2550408.96, -5749912.26, 1054891.11);
            var b = new Point3(2550138.46, -5749799.87, 1054530.82);

            var result = transform.GetInverse().TransformValue(b);

            Assert.AreEqual(a.X, result.X, 0.005);
            Assert.AreEqual(a.Y, result.Y, 0.0004);
            Assert.AreEqual(a.Z, result.Z, 0.006);
        }
Exemple #4
0
        private static StaticCoordinateOperationCompiler.StepCompilationResult CreateMolodenskyBadekas(TransformationCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var xTransParam = new KeywordNamedParameterSelector("XAXIS", "TRANS");
            var yTransParam = new KeywordNamedParameterSelector("YAXIS", "TRANS");
            var zTransParam = new KeywordNamedParameterSelector("ZAXIS", "TRANS");
            var xRotParam   = new KeywordNamedParameterSelector("XAXIS", "ROT");
            var yRotParam   = new KeywordNamedParameterSelector("YAXIS", "ROT");
            var zRotParam   = new KeywordNamedParameterSelector("ZAXIS", "ROT");
            var scaleParam  = new KeywordNamedParameterSelector("SCALE");
            var ord1Param   = new KeywordNamedParameterSelector("ORDINATE1");
            var ord2Param   = new KeywordNamedParameterSelector("ORDINATE2");
            var ord3Param   = new KeywordNamedParameterSelector("ORDINATE3");

            if (!opData.ParameterLookup.Assign(xTransParam, yTransParam, zTransParam, xRotParam, yRotParam, zRotParam, scaleParam, ord1Param, ord2Param, ord3Param))
            {
                return(null);
            }

            Vector3 translation, rotation;
            Point3  ordinate;
            double  scale;

            if (!TryCreateVector3(xTransParam.Selection, yTransParam.Selection, zTransParam.Selection, out translation))
            {
                return(null);
            }
            if (!TryCreateVector3(xRotParam.Selection, yRotParam.Selection, zRotParam.Selection, OgcAngularUnit.DefaultRadians, out rotation))
            {
                return(null);
            }
            if (!TryCreatePoint3(ord1Param.Selection, ord2Param.Selection, ord3Param.Selection, out ordinate))
            {
                return(null);
            }
            if (!NamedParameter.TryGetDouble(scaleParam.Selection, out scale))
            {
                return(null);
            }

            var molodensky = new MolodenskyBadekasTransformation(translation, rotation, ordinate, scale);

            if (opData.StepParams.RelatedInputCrs is ICrsGeocentric && opData.StepParams.RelatedOutputCrs is ICrsGeocentric)
            {
                return(new StaticCoordinateOperationCompiler.StepCompilationResult(
                           opData.StepParams,
                           opData.StepParams.RelatedOutputCrsUnit ?? opData.StepParams.RelatedInputCrsUnit ?? opData.StepParams.InputUnit,
                           molodensky));
            }

            // TODO: need to handle units here
            var spheroidFrom = opData.StepParams.RelatedInputSpheroid;

            if (null == spheroidFrom)
            {
                return(null);
            }

            // TODO: need to handle units here
            var spheroidTo = opData.StepParams.RelatedOutputSpheroid;

            if (null == spheroidTo)
            {
                return(null);
            }

            ITransformation transformation = new GeocentricTransformationGeographicWrapper(spheroidFrom, spheroidTo, molodensky);
            var             conv           = StaticCoordinateOperationCompiler.CreateCoordinateUnitConversion(opData.StepParams.InputUnit, OgcAngularUnit.DefaultRadians);

            if (null != conv)
            {
                transformation = new ConcatenatedTransformation(new[] { conv, transformation });
            }

            return(new StaticCoordinateOperationCompiler.StepCompilationResult(
                       opData.StepParams,
                       OgcAngularUnit.DefaultRadians,
                       transformation));
        }
        private static StaticCoordinateOperationCompiler.StepCompilationResult CreateMolodenskyBadekas(TransformationCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var xTransParam = new KeywordNamedParameterSelector("XAXIS", "TRANS");
            var yTransParam = new KeywordNamedParameterSelector("YAXIS", "TRANS");
            var zTransParam = new KeywordNamedParameterSelector("ZAXIS", "TRANS");
            var xRotParam = new KeywordNamedParameterSelector("XAXIS", "ROT");
            var yRotParam = new KeywordNamedParameterSelector("YAXIS", "ROT");
            var zRotParam = new KeywordNamedParameterSelector("ZAXIS", "ROT");
            var scaleParam = new KeywordNamedParameterSelector("SCALE");
            var ord1Param = new KeywordNamedParameterSelector("ORDINATE1");
            var ord2Param = new KeywordNamedParameterSelector("ORDINATE2");
            var ord3Param = new KeywordNamedParameterSelector("ORDINATE3");

            if (!opData.ParameterLookup.Assign(xTransParam, yTransParam, zTransParam, xRotParam, yRotParam, zRotParam, scaleParam, ord1Param, ord2Param, ord3Param))
                return null;

            Vector3 translation, rotation;
            Point3 ordinate;
            double scale;

            if (!TryCreateVector3(xTransParam.Selection, yTransParam.Selection, zTransParam.Selection, out translation))
                return null;
            if (!TryCreateVector3(xRotParam.Selection, yRotParam.Selection, zRotParam.Selection, OgcAngularUnit.DefaultRadians, out rotation))
                return null;
            if (!TryCreatePoint3(ord1Param.Selection, ord2Param.Selection, ord3Param.Selection, out ordinate))
                return null;
            if (!NamedParameter.TryGetDouble(scaleParam.Selection, out scale))
                return null;

            var molodensky = new MolodenskyBadekasTransformation(translation, rotation, ordinate, scale);

            if (opData.StepParams.RelatedInputCrs is ICrsGeocentric && opData.StepParams.RelatedOutputCrs is ICrsGeocentric)
                return new StaticCoordinateOperationCompiler.StepCompilationResult(
                    opData.StepParams,
                    opData.StepParams.RelatedOutputCrsUnit ?? opData.StepParams.RelatedInputCrsUnit ?? opData.StepParams.InputUnit,
                    molodensky);

            // TODO: need to handle units here
            var spheroidFrom = opData.StepParams.RelatedInputSpheroid;
            if (null == spheroidFrom)
                return null;

            // TODO: need to handle units here
            var spheroidTo = opData.StepParams.RelatedOutputSpheroid;
            if (null == spheroidTo)
                return null;

            ITransformation transformation = new GeocentricTransformationGeographicWrapper(spheroidFrom, spheroidTo, molodensky);
            var conv = StaticCoordinateOperationCompiler.CreateCoordinateUnitConversion(opData.StepParams.InputUnit, OgcAngularUnit.DefaultRadians);
            if (null != conv)
                transformation = new ConcatenatedTransformation(new[] { conv, transformation });

            return new StaticCoordinateOperationCompiler.StepCompilationResult(
                opData.StepParams,
                OgcAngularUnit.DefaultRadians,
                transformation);
        }