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)); }
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; }
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 ); }
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)); }
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)); }
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 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) ); }
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); } }
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); }
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)); }
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(); }
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; }
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); }
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); }
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); }
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(); } }
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); }