コード例 #1
0
        private static StaticCoordinateOperationCompiler.StepCompilationResult CreateAffineParametricTransformation(TransformationCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var a0Param = new KeywordNamedParameterSelector("A0");
            var a1Param = new KeywordNamedParameterSelector("A1");
            var a2Param = new KeywordNamedParameterSelector("A2");
            var b0Param = new KeywordNamedParameterSelector("B0");
            var b1Param = new KeywordNamedParameterSelector("B1");
            var b2Param = new KeywordNamedParameterSelector("B2");
            if (!opData.ParameterLookup.Assign(a0Param, a1Param, a2Param, b0Param, b1Param, b2Param))
                return null;

            Vector3 a, b;
            if (!TryCreateVector3(a0Param.Selection, a1Param.Selection, a2Param.Selection, out a))
                return null;
            if (!TryCreateVector3(b0Param.Selection, b1Param.Selection, b2Param.Selection, out b))
                return null;

            return new StaticCoordinateOperationCompiler.StepCompilationResult(
                opData.StepParams,
                opData.StepParams.InputUnit,
                new AffineParametricTransformation(a.X, a.Y, a.Z, b.X, b.Y, b.Z));
        }
コード例 #2
0
        private static bool ExtractHelmertParams(TransformationCompilationParams opData, out Vector3 translation, out Vector3 rotation, out double scale)
        {
            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");

            translation = Vector3.Invalid;
            rotation = Vector3.Invalid;
            scale = Double.NaN;

            if (!opData.ParameterLookup.Assign(xTransParam, yTransParam, zTransParam, xRotParam, yRotParam, zRotParam, scaleParam))
                return false;
            if (!TryCreateVector3(xTransParam.Selection, yTransParam.Selection, zTransParam.Selection, out translation))
                return false;
            if (!TryCreateVector3(xRotParam.Selection, yRotParam.Selection, zRotParam.Selection, OgcAngularUnit.DefaultArcSeconds, out rotation))
                return false;
            if (!NamedParameter.TryGetDouble(scaleParam.Selection, out scale))
                return false;

            ConvertIfVaild(scaleParam.Selection.Unit, ScaleUnitPartsPerMillion.Value, ref scale);
            return true;
        }
コード例 #3
0
        private static StaticCoordinateOperationCompiler.StepCompilationResult CreateVerticalPerspective(TransformationCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var outputUnit = opData.StepParams.RelatedOutputCrsUnit;
            if (null == outputUnit)
                return null;

            var latParam = new KeywordNamedParameterSelector("LAT");
            var lonParam = new KeywordNamedParameterSelector("LON");
            var hOriginParam = new KeywordNamedParameterSelector("H", "HEIGHT", "ORIGIN");
            var hViewParam = new KeywordNamedParameterSelector("H", "HEIGHT", "VIEW");
            opData.ParameterLookup.Assign(latParam, lonParam, hOriginParam, hViewParam);

            GeographicHeightCoordinate origin;
            if (!TryCreateGeographicHeightCoordinate(latParam.Selection, lonParam.Selection, hOriginParam.Selection, OgcAngularUnit.DefaultRadians, outputUnit, out origin))
                origin = GeographicHeightCoordinate.Zero;

            double viewHeight;
            if (!TryGetDouble(hViewParam.Selection, outputUnit, out viewHeight))
                viewHeight = Double.NaN;

            var spheroidIn = opData.StepParams.ConvertRelatedInputSpheroidUnit(outputUnit);
            if (null == spheroidIn)
                return null;

            ITransformation transformation = new VerticalPerspective(origin, viewHeight, spheroidIn);

            return new StaticCoordinateOperationCompiler.StepCompilationResult(
                opData.StepParams,
                outputUnit,
                transformation
            );
        }
コード例 #4
0
        private static StaticCoordinateOperationCompiler.StepCompilationResult CreateVerticalOffset(TransformationCompilationParams opData)
        {
            Contract.Requires(opData != null);
            double offsetValue = 0;

            var offsetParam = new KeywordNamedParameterSelector("OFFSET", "VERTICAL");
            if (opData.ParameterLookup.Assign(offsetParam)) {
                if (!NamedParameter.TryGetDouble(offsetParam.Selection, out offsetValue))
                    offsetValue = 0;
            }

            return new StaticCoordinateOperationCompiler.StepCompilationResult(
                opData.StepParams,
                opData.StepParams.InputUnit,
                new VerticalOffset(offsetValue));
        }
コード例 #5
0
        private static StaticCoordinateOperationCompiler.StepCompilationResult CreateSimilarityTransformation(TransformationCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var xParam = new KeywordNamedParameterSelector("ORDINATE1");
            var yParam = new KeywordNamedParameterSelector("ORDINATE2");
            var mParam = new KeywordNamedParameterSelector("SCALE");
            var rParam = new KeywordNamedParameterSelector("ROTATION");
            if (!opData.ParameterLookup.Assign(xParam, yParam, mParam, rParam))
                return null;

            Point2 origin;
            if (!TryCreatePoint2(xParam.Selection, yParam.Selection, out origin))
                return null;

            double scale, rotation;
            if (!NamedParameter.TryGetDouble(mParam.Selection, out scale))
                return null;
            if (!NamedParameter.TryGetDouble(rParam.Selection, out rotation))
                return null;

            ConvertIfVaild(rParam.Selection.Unit, OgcAngularUnit.DefaultRadians, ref rotation);

            return new StaticCoordinateOperationCompiler.StepCompilationResult(
                opData.StepParams,
                opData.StepParams.RelatedOutputCrsUnit ?? opData.StepParams.RelatedInputCrsUnit ?? opData.StepParams.InputUnit,
                new SimilarityTransformation(origin, scale, rotation));
        }
コード例 #6
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);
        }
コード例 #7
0
        private static StaticCoordinateOperationCompiler.StepCompilationResult CreateGeographicTopocentric(TransformationCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var outputUnit = opData.StepParams.RelatedOutputCrsUnit;
            if (null == outputUnit)
                return null;

            var latParam = new KeywordNamedParameterSelector("LAT");
            var lonParam = new KeywordNamedParameterSelector("LON");
            var hParam = new KeywordNamedParameterSelector("H");
            opData.ParameterLookup.Assign(latParam, lonParam, hParam);

            GeographicHeightCoordinate origin;
            if (!TryCreateGeographicHeightCoordinate(latParam.Selection, lonParam.Selection, hParam.Selection, OgcAngularUnit.DefaultRadians, opData.StepParams.RelatedOutputCrsUnit, out origin))
                origin = GeographicHeightCoordinate.Zero;

            var spheroidIn = opData.StepParams.ConvertRelatedInputSpheroidUnit(outputUnit);
            if (null == spheroidIn)
                return null;

            var spheroidOut = opData.StepParams.ConvertRelatedOutputSpheroidUnit(outputUnit);
            if (null == spheroidOut)
                return null;

            var geographicGeocentric = new GeographicGeocentricTransformation(spheroidIn);
            var topocentricOrigin = geographicGeocentric.TransformValue(origin);

            var transformations = new List<ITransformation>() {
                geographicGeocentric,
                new GeocentricTopocentricTransformation(topocentricOrigin, spheroidOut)
            };

            var inputUnitConversion = StaticCoordinateOperationCompiler.CreateCoordinateUnitConversion(opData.StepParams.InputUnit, OgcAngularUnit.DefaultRadians);
            if (null != inputUnitConversion)
                transformations.Insert(0, inputUnitConversion);

            return new StaticCoordinateOperationCompiler.StepCompilationResult(
                opData.StepParams,
                outputUnit,
                new ConcatenatedTransformation(transformations)
            );
        }
コード例 #8
0
        private SpheroidProjectionBase CreateHotineObliqueMercator(ProjectionCompilationParams opData)
        {
            Contract.Requires(opData != null);

            var latParam = new MultiParameterSelector(
                new LatitudeOfCenterParameterSelector(),
                new LatitudeOfNaturalOriginParameterSelector());
            var lonParam = new MultiParameterSelector(
                new LongitudeOfCenterParameterSelector(),
                new LongitudeOfNaturalOriginParameterSelector());

            var scaleFactorParam = new ScaleFactorParameterSelector();
            var azimuthParam = new KeywordNamedParameterSelector("AZIMUTH");
            var angleSkewParam = new KeywordNamedParameterSelector("ANGLE", "SKEW");

            var offsetXParam = new FalseEastingParameterSelector();
            var offsetYParam = new FalseNorthingParameterSelector();
            var xAtOriginParam = new EastingAtCenterParameterSelector();
            var yAtOriginParam = new NorthingAtCenterParameterSelector();

            opData.ParameterLookup.Assign(latParam, lonParam, offsetXParam, offsetYParam, xAtOriginParam, yAtOriginParam, scaleFactorParam, azimuthParam, angleSkewParam);

            var spheroid = opData.StepParams.ConvertRelatedOutputSpheroidUnit(opData.StepParams.RelatedOutputCrsUnit);
            if (null == spheroid)
                return null;

            double lat, lon;
            if(!latParam.IsSelected || !latParam.TryGetValueAsDouble(OgcAngularUnit.DefaultRadians, out lat))
                lat = 0;
            if(!lonParam.IsSelected || !lonParam.TryGetValueAsDouble(OgcAngularUnit.DefaultRadians, out lon))
                lon = 0;
            var origin = new GeographicCoordinate(lat, lon);

            double scaleFactor;
            if (!scaleFactorParam.IsSelected || !TryGetDouble(scaleFactorParam.Selection, ScaleUnitUnity.Value, out scaleFactor))
                scaleFactor = 1.0;

            double azimuth;
            if (!azimuthParam.IsSelected || !TryGetDouble(azimuthParam.Selection, OgcAngularUnit.DefaultRadians, out azimuth))
                azimuth = 0;

            double angleSkew;
            if (!angleSkewParam.IsSelected || !TryGetDouble(angleSkewParam.Selection, OgcAngularUnit.DefaultRadians, out angleSkew))
                angleSkew = 0;

            var outputUnit = opData.StepParams.RelatedOutputCrsUnit;
            double x,y;
            if(xAtOriginParam.IsSelected || yAtOriginParam.IsSelected){
                if (!xAtOriginParam.IsSelected || !xAtOriginParam.TryGetValueAsDouble(outputUnit, out x))
                    x = 0;
                if (!yAtOriginParam.IsSelected || !yAtOriginParam.TryGetValueAsDouble(outputUnit, out y))
                    y = 0;
                return new HotineObliqueMercator.VariantB(new GeographicCoordinate(lat, lon), azimuth, angleSkew, scaleFactor, new Vector2(x,y), spheroid);
            }
            else {
                if (!offsetXParam.IsSelected || !offsetXParam.TryGetValueAsDouble(outputUnit, out x))
                    x = 0;
                if (!offsetYParam.IsSelected || !offsetYParam.TryGetValueAsDouble(outputUnit, out y))
                    y = 0;
                return new HotineObliqueMercator.VariantA(new GeographicCoordinate(lat, lon), azimuth, angleSkew, scaleFactor, new Vector2(x,y), spheroid);
            }
        }
コード例 #9
0
        private static StaticCoordinateOperationCompiler.StepCompilationResult CreateGeocentricTranslation(TransformationCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var xParam = new KeywordNamedParameterSelector("XAXIS", "X");
            var yParam = new KeywordNamedParameterSelector("YAXIS", "Y");
            var zParam = new KeywordNamedParameterSelector("ZAXIS", "Z");
            opData.ParameterLookup.Assign(xParam, yParam, zParam);

            Vector3 delta;
            if (!TryCreateVector3(xParam.Selection, yParam.Selection, zParam.Selection, out delta))
                return null;

            if (opData.StepParams.RelatedInputCrs is ICrsGeocentric && opData.StepParams.RelatedOutputCrs is ICrsGeocentric) {
                // assume the units are correct
                return new StaticCoordinateOperationCompiler.StepCompilationResult(
                    opData.StepParams,
                    opData.StepParams.RelatedOutputCrsUnit ?? opData.StepParams.RelatedInputCrsUnit ?? opData.StepParams.InputUnit,
                    new GeocentricTranslation(delta));
            }

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

            // TODO: may even need to convert units while translating

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

            ITransformation transformation = new GeographicGeocentricTranslation(inputSpheroid, delta, outputSpheroid);
            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);
        }
コード例 #10
0
        private static StaticCoordinateOperationCompiler.StepCompilationResult CreateGeocentricTopocentric(TransformationCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var xParam = new KeywordNamedParameterSelector("XAXIS", "X");
            var yParam = new KeywordNamedParameterSelector("YAXIS", "Y");
            var zParam = new KeywordNamedParameterSelector("ZAXIS", "Z");
            opData.ParameterLookup.Assign(xParam, yParam, zParam);

            Point3 origin;
            if (!TryCreatePoint3(xParam.Selection, yParam.Selection, zParam.Selection, opData.StepParams.InputUnit, out origin))
                origin = Point3.Zero;

            var spheroid = opData.StepParams.ConvertRelatedInputSpheroidUnit(opData.StepParams.InputUnit);
            if (null == spheroid)
                return null;

            return new StaticCoordinateOperationCompiler.StepCompilationResult(
                opData.StepParams,
                opData.StepParams.InputUnit,
                new GeocentricTopocentricTransformation(origin, spheroid));
        }
コード例 #11
0
ファイル: Proj4Crs.cs プロジェクト: aarondandy/pigeoid
        private static void ApplyParametersDefault(ProjectionInfo result, IEnumerable<INamedParameter> parameters)
        {
            Contract.Requires(result != null);
            Contract.Requires(parameters != null);
            var lon0Param = new MultiParameterSelector(
                new CentralMeridianParameterSelector(),
                new LongitudeOfNaturalOriginParameterSelector()
            );
            var loncParam = new LongitudeOfCenterParameterSelector();
            var lat0Param = new MultiParameterSelector(
                new LatitudeOfCenterParameterSelector(),
                new LatitudeOfNaturalOriginParameterSelector());
            var lat1Param = new StandardParallelParameterSelector(1);
            var lat2Param = new StandardParallelParameterSelector(2);
            var x0Param = new FalseEastingParameterSelector();
            var y0Param = new FalseNorthingParameterSelector();
            var k0Param = new ScaleFactorParameterSelector();
            var alphaParam = new KeywordNamedParameterSelector("ALPHA", "AZIMUTH");
            var angleSkewParam = new KeywordNamedParameterSelector("SKEW", "GAMMA");
            var zoneParam = new FullMatchParameterSelector("ZONE");
            var southParam = new FullMatchParameterSelector("SOUTH");
            var standardParallel1Param = new MultiParameterSelector(
                new StandardParallelParameterSelector(),
                new StandardParallelParameterSelector(1));
            var standardParallel2Param = new StandardParallelParameterSelector(2);

            var paramLookup = new NamedParameterLookup(parameters);
            paramLookup.Assign(lon0Param, loncParam, lat0Param, lat1Param, lat2Param, x0Param, y0Param, k0Param, alphaParam, angleSkewParam, zoneParam, southParam, standardParallel1Param, standardParallel2Param);

            if (lon0Param.IsSelected)
                result.CentralMeridian = lon0Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            if (loncParam.IsSelected)
                result.LongitudeOfCenter = loncParam.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            if (lat0Param.IsSelected)
                result.LatitudeOfOrigin = lat0Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            if (lat1Param.IsSelected)
                result.StandardParallel1 = lat1Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            if (lat2Param.IsSelected)
                result.StandardParallel2 = lat2Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            if (x0Param.IsSelected)
                result.FalseEasting = x0Param.GetValueAsDouble(OgcLinearUnit.DefaultMeter);
            if (y0Param.IsSelected)
                result.FalseNorthing = y0Param.GetValueAsDouble(OgcLinearUnit.DefaultMeter);
            if (k0Param.IsSelected)
                result.ScaleFactor = k0Param.GetValueAsDouble(ScaleUnitUnity.Value) ?? 1.0;
            if (alphaParam.IsSelected)
                result.alpha = alphaParam.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            /*if (angleSkewParam.IsSelected)
                result.gamma = angleSkewParam.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);*/
            if (southParam.IsSelected)
                result.IsSouth = southParam.GetValueAsBoolean().GetValueOrDefault();
            if (standardParallel1Param.IsSelected)
                result.StandardParallel1 = standardParallel1Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            if (standardParallel2Param.IsSelected)
                result.StandardParallel2 = standardParallel2Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            if (zoneParam.IsSelected)
                result.Zone = zoneParam.GetValueAsInt32();
        }
コード例 #12
0
        private ITransformation<GeographicCoordinate, Point2> CreateLambertConicConformal(ProjectionCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var originLatParam = new KeywordNamedParameterSelector("LAT", "ORIGIN");
            var originLonParam = new KeywordNamedParameterSelector("LON", "ORIGIN", "CENTRAL", "MERIDIAN");
            var parallel1Param = new KeywordNamedParameterSelector("LAT", "1", "PARALLEL");
            var parallel2Param = new KeywordNamedParameterSelector("LAT", "2", "PARALLEL");
            var offsetXParam = new FalseEastingParameterSelector();
            var offsetYParam = new FalseNorthingParameterSelector();
            var scaleFactorParam = new ScaleFactorParameterSelector();
            opData.ParameterLookup.Assign(originLatParam, originLonParam, offsetXParam, offsetYParam, scaleFactorParam, parallel1Param, parallel2Param);

            var spheroid = opData.StepParams.ConvertRelatedOutputSpheroidUnit(opData.StepParams.RelatedOutputCrsUnit);
            if (null == spheroid)
                return null;

            GeographicCoordinate origin;
            if (!(originLatParam.IsSelected || originLonParam.IsSelected) || !TryCreateGeographicCoordinate(originLatParam.Selection, originLonParam.Selection, out origin))
                origin = GeographicCoordinate.Zero;

            Vector2 offset;
            if (!(offsetXParam.IsSelected || offsetYParam.IsSelected) || !TryCreateVector2(offsetXParam.Selection, offsetYParam.Selection, opData.StepParams.RelatedOutputCrsUnit, out offset))
                offset = Vector2.Zero;

            double parallel1, parallel2;
            if (parallel1Param.IsSelected && parallel2Param.IsSelected && TryGetDouble(parallel1Param.Selection, OgcAngularUnit.DefaultRadians, out parallel1) && TryGetDouble(parallel2Param.Selection, OgcAngularUnit.DefaultRadians, out parallel2)) {
                if (_coordinateOperationNameComparer.Normalize(opData.OperationName).EndsWith("BELGIUM"))
                    return new LambertConicConformalBelgium(origin, parallel1, parallel2, offset, spheroid);

                return new LambertConicConformal2Sp(origin, parallel1, parallel2, offset, spheroid);
            }

            if (scaleFactorParam.IsSelected){
                double scaleFactor;
                if(TryGetDouble(scaleFactorParam.Selection, ScaleUnitUnity.Value, out scaleFactor))
                    return new LambertConicConformal1Sp(origin, scaleFactor, offset, spheroid);
            }

            return null;
        }
コード例 #13
0
        private SpheroidProjectionBase CreateLabordeObliqueMercator(ProjectionCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var originLatParam = new KeywordNamedParameterSelector("LAT", "CENTER");
            var originLonParam = new KeywordNamedParameterSelector("LON", "CENTER");
            var offsetXParam = new FalseEastingParameterSelector();
            var offsetYParam = new FalseNorthingParameterSelector();
            var scaleFactorParam = new ScaleFactorParameterSelector();
            var azimuthParam = new KeywordNamedParameterSelector("AZIMUTH");
            opData.ParameterLookup.Assign(originLatParam, originLonParam, offsetXParam, offsetYParam, scaleFactorParam, azimuthParam);

            var spheroid = opData.StepParams.ConvertRelatedOutputSpheroidUnit(opData.StepParams.RelatedOutputCrsUnit);
            if (null == spheroid)
                return null;

            GeographicCoordinate origin;
            if (!(originLatParam.IsSelected || originLonParam.IsSelected) || !TryCreateGeographicCoordinate(originLatParam.Selection, originLonParam.Selection, out origin))
                origin = GeographicCoordinate.Zero;

            Vector2 offset;
            if (!(offsetXParam.IsSelected || offsetYParam.IsSelected) || !TryCreateVector2(offsetXParam.Selection, offsetYParam.Selection, opData.StepParams.RelatedOutputCrsUnit, out offset))
                offset = Vector2.Zero;

            double scaleFactor;
            if (!scaleFactorParam.IsSelected || !TryGetDouble(scaleFactorParam.Selection, ScaleUnitUnity.Value, out scaleFactor))
                scaleFactor = 1.0;

            double azimuth;
            if (!azimuthParam.IsSelected || !TryGetDouble(azimuthParam.Selection, OgcAngularUnit.DefaultRadians, out azimuth))
                azimuth = 0;

            return new LabordeObliqueMercator(origin, azimuth, scaleFactor, spheroid, offset);
        }
コード例 #14
0
        private ITransformation<GeographicCoordinate, Point2> CreateKrovak(ProjectionCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var latConeAxisParam = new KeywordNamedParameterSelector("CO", "LAT", "CONE", "AXIS"); // Co-latitude of cone axis
            var latProjectionCenterParam = new KeywordNamedParameterSelector("LAT", "CENTER"); // Latitude of projection centre
            var latPseudoParallelParam = new KeywordNamedParameterSelector("LAT", "PSEUDO", "PARALLEL"); // Latitude of pseudo standard parallel
            var scaleFactorParallelParam = new KeywordNamedParameterSelector("SCALE", "PARALLEL"); // Scale factor on pseudo standard parallel
            var originLonParam = new KeywordNamedParameterSelector("LON", "ORIGIN"); // Longitude of origin
            var offsetXParam = new FalseEastingParameterSelector();
            var offsetYParam = new FalseNorthingParameterSelector();
            var evalXParam = new KeywordNamedParameterSelector("ORDINATE1", "EVALUATION", "POINT");
            var evalYParam = new KeywordNamedParameterSelector("ORDINATE2", "EVALUATION", "POINT");
            opData.ParameterLookup.Assign(latConeAxisParam, latProjectionCenterParam, latPseudoParallelParam, scaleFactorParallelParam, originLonParam, offsetXParam, offsetYParam, evalXParam, evalYParam);

            var spheroid = opData.StepParams.ConvertRelatedOutputSpheroidUnit(opData.StepParams.RelatedOutputCrsUnit);
            if (null == spheroid)
                return null;

            GeographicCoordinate origin;
            if (!latProjectionCenterParam.IsSelected || !originLonParam.IsSelected || !TryCreateGeographicCoordinate(latProjectionCenterParam.Selection, originLonParam.Selection, out origin))
                origin = GeographicCoordinate.Zero;

            Vector2 offset;
            if (!offsetXParam.IsSelected || !offsetYParam.IsSelected || !TryCreateVector2(offsetXParam.Selection, offsetYParam.Selection, out offset))
                offset = Vector2.Zero;

            Point2 evalPoint;
            if (!evalXParam.IsSelected || !evalYParam.IsSelected || !TryCreatePoint2(evalXParam.Selection, evalYParam.Selection, out evalPoint))
                evalPoint = Point2.Zero;

            double azimuthOfInitialLine;
            if (!latConeAxisParam.IsSelected || !TryGetDouble(latConeAxisParam.Selection, OgcAngularUnit.DefaultRadians, out azimuthOfInitialLine))
                azimuthOfInitialLine = Double.NaN;

            double latitudeOfPseudoStandardParallel;
            if (!latPseudoParallelParam.IsSelected || !TryGetDouble(latPseudoParallelParam.Selection, OgcAngularUnit.DefaultRadians, out latitudeOfPseudoStandardParallel))
                latitudeOfPseudoStandardParallel = Double.NaN;

            double scaleFactor;
            if (!scaleFactorParallelParam.IsSelected || !TryGetDouble(scaleFactorParallelParam.Selection, ScaleUnitUnity.Value, out scaleFactor))
                scaleFactor = Double.NaN;

            var normalizedName = _coordinateOperationNameComparer.Normalize(opData.OperationName);

            double[] constants = null;
            if (normalizedName.StartsWith("KROVAKMODIFIED")) {
                var constantParams = new NamedParameterSelector[] {
                    new FullMatchParameterSelector("C1"),
                    new FullMatchParameterSelector("C2"),
                    new FullMatchParameterSelector("C3"),
                    new FullMatchParameterSelector("C4"),
                    new FullMatchParameterSelector("C5"),
                    new FullMatchParameterSelector("C6"),
                    new FullMatchParameterSelector("C7"),
                    new FullMatchParameterSelector("C8"),
                    new FullMatchParameterSelector("C9"),
                    new FullMatchParameterSelector("C10")
                };
                if (opData.ParameterLookup.Assign(constantParams)) {
                    constants = constantParams
                        .OrderBy(x => Int32.Parse(x.Selection.Name.Substring(1)))
                        .Select(p => {
                            double value;
                            TryGetDouble(p.Selection, ScaleUnitUnity.Value, out value);
                            return value;
                        })
                        .ToArray();
                    Contract.Assume(constants.Length == constantParams.Length);
                }
            }

            if (normalizedName.Equals("KROVAKNORTH")) {
                return new KrovakNorth(origin, latitudeOfPseudoStandardParallel, azimuthOfInitialLine, scaleFactor, offset, spheroid);
            }
            if (null != constants) {
                if (normalizedName.Equals("KROVAKMODIFIED")) {
                    return new KrovakModified(origin, latitudeOfPseudoStandardParallel, azimuthOfInitialLine, scaleFactor, offset, spheroid, evalPoint, constants);
                }
                if (normalizedName.Equals("KROVAKMODIFIEDNORTH")) {
                    return new KrovakModifiedNorth(origin, latitudeOfPseudoStandardParallel, azimuthOfInitialLine, scaleFactor, offset, spheroid, evalPoint, constants);
                }
            }

            return new Krovak(origin, latitudeOfPseudoStandardParallel, azimuthOfInitialLine, scaleFactor, offset, spheroid);
        }
コード例 #15
0
        private static StaticCoordinateOperationCompiler.StepCompilationResult CreateGeographicOffset(TransformationCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var latParam = new KeywordNamedParameterSelector("LAT");
            var lonParam = new KeywordNamedParameterSelector("LON");
            var heightParam = new KeywordNamedParameterSelector("HEIGHT");
            opData.ParameterLookup.Assign(latParam, lonParam);

            var deltaLatitude = 0.0;
            var deltaLongitude = 0.0;
            var deltaHeight = 0.0;

            if (!latParam.IsSelected && !lonParam.IsSelected && !heightParam.IsSelected)
                return null;

            if (latParam.IsSelected)
                TryGetDouble(latParam.Selection, opData.StepParams.InputUnit, out deltaLatitude);
            if (lonParam.IsSelected)
                TryGetDouble(lonParam.Selection, opData.StepParams.InputUnit, out deltaLongitude);
            if (heightParam.IsSelected)
                NamedParameter.TryGetDouble(heightParam.Selection, out deltaHeight);

            var transformation = new GeographicOffset(deltaLatitude, deltaLongitude, deltaHeight);

            return new StaticCoordinateOperationCompiler.StepCompilationResult(
                opData.StepParams,
                opData.StepParams.InputUnit,
                transformation);
        }
コード例 #16
0
ファイル: Proj4Crs.cs プロジェクト: GISwilson/pigeoid
        private static void ApplyParametersDefault(ProjectionInfo result, IEnumerable <INamedParameter> parameters)
        {
            Contract.Requires(result != null);
            Contract.Requires(parameters != null);
            var lon0Param = new MultiParameterSelector(
                new CentralMeridianParameterSelector(),
                new LongitudeOfNaturalOriginParameterSelector()
                );
            var loncParam = new LongitudeOfCenterParameterSelector();
            var lat0Param = new MultiParameterSelector(
                new LatitudeOfCenterParameterSelector(),
                new LatitudeOfNaturalOriginParameterSelector());
            var lat1Param              = new StandardParallelParameterSelector(1);
            var lat2Param              = new StandardParallelParameterSelector(2);
            var x0Param                = new FalseEastingParameterSelector();
            var y0Param                = new FalseNorthingParameterSelector();
            var k0Param                = new ScaleFactorParameterSelector();
            var alphaParam             = new KeywordNamedParameterSelector("ALPHA", "AZIMUTH");
            var angleSkewParam         = new KeywordNamedParameterSelector("SKEW", "GAMMA");
            var zoneParam              = new FullMatchParameterSelector("ZONE");
            var southParam             = new FullMatchParameterSelector("SOUTH");
            var standardParallel1Param = new MultiParameterSelector(
                new StandardParallelParameterSelector(),
                new StandardParallelParameterSelector(1));
            var standardParallel2Param = new StandardParallelParameterSelector(2);

            var paramLookup = new NamedParameterLookup(parameters);

            paramLookup.Assign(lon0Param, loncParam, lat0Param, lat1Param, lat2Param, x0Param, y0Param, k0Param, alphaParam, angleSkewParam, zoneParam, southParam, standardParallel1Param, standardParallel2Param);

            if (lon0Param.IsSelected)
            {
                result.CentralMeridian = lon0Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            }
            if (loncParam.IsSelected)
            {
                result.LongitudeOfCenter = loncParam.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            }
            if (lat0Param.IsSelected)
            {
                result.LatitudeOfOrigin = lat0Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            }
            if (lat1Param.IsSelected)
            {
                result.StandardParallel1 = lat1Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            }
            if (lat2Param.IsSelected)
            {
                result.StandardParallel2 = lat2Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            }
            if (x0Param.IsSelected)
            {
                result.FalseEasting = x0Param.GetValueAsDouble(OgcLinearUnit.DefaultMeter);
            }
            if (y0Param.IsSelected)
            {
                result.FalseNorthing = y0Param.GetValueAsDouble(OgcLinearUnit.DefaultMeter);
            }
            if (k0Param.IsSelected)
            {
                result.ScaleFactor = k0Param.GetValueAsDouble(ScaleUnitUnity.Value) ?? 1.0;
            }
            if (alphaParam.IsSelected)
            {
                result.alpha = alphaParam.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            }

            /*if (angleSkewParam.IsSelected)
             *  result.gamma = angleSkewParam.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);*/
            if (southParam.IsSelected)
            {
                result.IsSouth = southParam.GetValueAsBoolean().GetValueOrDefault();
            }
            if (standardParallel1Param.IsSelected)
            {
                result.StandardParallel1 = standardParallel1Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            }
            if (standardParallel2Param.IsSelected)
            {
                result.StandardParallel2 = standardParallel2Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees);
            }
            if (zoneParam.IsSelected)
            {
                result.Zone = zoneParam.GetValueAsInt32();
            }
        }
コード例 #17
0
        private SpheroidProjectionBase CreateEquidistantCylindrical(ProjectionCompilationParams opData)
        {
            Contract.Requires(opData != null);
            var originLatParam = new KeywordNamedParameterSelector("LAT", "PARALLEL");
            var originLonParam = new LongitudeOfNaturalOriginParameterSelector();
            var offsetXParam = new FalseEastingParameterSelector();
            var offsetYParam = new FalseNorthingParameterSelector();
            opData.ParameterLookup.Assign(originLatParam, originLonParam, offsetXParam, offsetYParam);

            var spheroid = opData.StepParams.ConvertRelatedOutputSpheroidUnit(opData.StepParams.RelatedOutputCrsUnit);
            if (null == spheroid)
                return null;

            GeographicCoordinate origin;
            if (!originLatParam.IsSelected || !originLonParam.IsSelected || !TryCreateGeographicCoordinate(originLatParam.Selection, originLonParam.Selection, out origin))
                origin = GeographicCoordinate.Zero;

            Vector2 offset;
            if (!offsetXParam.IsSelected || !offsetYParam.IsSelected || !TryCreateVector2(offsetXParam.Selection, offsetYParam.Selection, out offset))
                offset = Vector2.Zero;

            // ReSharper disable CompareOfFloatsByEqualityOperator
            var spherical = _coordinateOperationNameComparer.Normalize(opData.OperationName).EndsWith("SPHERICAL")
                || spheroid.E == 0;
            // ReSharper restore CompareOfFloatsByEqualityOperator

            return spherical
                ? (SpheroidProjectionBase)new EquidistantCylindricalSpherical(origin, offset, spheroid)
                : new EquidistantCylindrical(origin, offset, spheroid);
        }