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 StaticCoordinateOperationCompiler.StepCompilationResult CreateGeographicDimensionChange(TransformationCompilationParams opData) { Contract.Requires(opData != null); return(new StaticCoordinateOperationCompiler.StepCompilationResult( opData.StepParams, opData.StepParams.InputUnit, new GeographicDimensionChange())); }
private static StaticCoordinateOperationCompiler.StepCompilationResult CreateTunisiaMiningGrid(TransformationCompilationParams opData) { Contract.Requires(opData != null); ITransformation transformation = new TunisiaMiningGrid(); var conv = StaticCoordinateOperationCompiler.CreateCoordinateUnitConversion(opData.StepParams.InputUnit, OgcAngularUnit.DefaultGrads); if (null != conv) { transformation = new ConcatenatedTransformation(new[] { conv, transformation }); } return(new StaticCoordinateOperationCompiler.StepCompilationResult( opData.StepParams, OgcLinearUnit.DefaultKilometer, transformation)); }
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 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 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 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 CreateCoordinateFrameRotationTransformation(TransformationCompilationParams opData) { Contract.Requires(opData != null); Vector3 translation, rotation; double scale; if (!ExtractHelmertParams(opData, out translation, out rotation, out scale)) { return(null); } return(CreateHelmertStep(opData, Helmert7Transformation.CreateCoordinateFrameRotationFormat(translation, rotation, scale))); }
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 CreateMadridToEd50Polynomial(TransformationCompilationParams opData) { Contract.Requires(opData != null); var a0Param = new FullMatchParameterSelector("A0"); var a1Param = new FullMatchParameterSelector("A1"); var a2Param = new FullMatchParameterSelector("A2"); var a3Param = new FullMatchParameterSelector("A3"); var b00Param = new FullMatchParameterSelector("B00"); var b0Param = new FullMatchParameterSelector("B0"); var b1Param = new FullMatchParameterSelector("B1"); var b2Param = new FullMatchParameterSelector("B2"); var b3Param = new FullMatchParameterSelector("B3"); opData.ParameterLookup.Assign(a0Param, a1Param, a2Param, a3Param, b00Param, b0Param, b1Param, b2Param, b3Param); double a0, a1, a2, a3, b00, b0, b1, b2, b3; TryGetCoefficientValue(a0Param.Selection, out a0); TryGetCoefficientValue(a1Param.Selection, out a1); TryGetCoefficientValue(a2Param.Selection, out a2); TryGetCoefficientValue(a3Param.Selection, out a3); TryGetCoefficientValue(b00Param.Selection, out b00); TryGetCoefficientValue(b0Param.Selection, out b0); TryGetCoefficientValue(b1Param.Selection, out b1); TryGetCoefficientValue(b2Param.Selection, out b2); TryGetCoefficientValue(b3Param.Selection, out b3); ITransformation transformation = new MadridEd50Polynomial(a0, a1, a2, a3, b00, b0, b1, b2, b3); var conv = StaticCoordinateOperationCompiler.CreateCoordinateUnitConversion(opData.StepParams.InputUnit, OgcAngularUnit.DefaultDegrees); if (null != conv) transformation = new ConcatenatedTransformation(new[] { conv, transformation }); return new StaticCoordinateOperationCompiler.StepCompilationResult( opData.StepParams, OgcAngularUnit.DefaultDegrees, transformation); }
private static StaticCoordinateOperationCompiler.StepCompilationResult CreateHelmertStep(TransformationCompilationParams opData, Helmert7Transformation helmert) { Contract.Requires(opData != null); Contract.Requires(helmert != null); 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, helmert); var spheroidFrom = ExtractSpheroid(opData.StepParams.RelatedInputCrs) ?? ExtractSpheroid(opData.StepParams.RelatedOutputCrs); if (null == spheroidFrom) return null; var spheroidTo = ExtractSpheroid(opData.StepParams.RelatedOutputCrs) ?? spheroidFrom; ITransformation transformation = new GeocentricTransformationGeographicWrapper(spheroidFrom, spheroidTo, helmert); var unitConversion = StaticCoordinateOperationCompiler.CreateCoordinateUnitConversion(opData.StepParams.InputUnit, OgcAngularUnit.DefaultRadians); if (null != unitConversion) transformation = new ConcatenatedTransformation(new[] { unitConversion, 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 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 StaticCoordinateOperationCompiler.StepCompilationResult CreateGeographicDimensionChange(TransformationCompilationParams opData) { Contract.Requires(opData != null); return new StaticCoordinateOperationCompiler.StepCompilationResult( opData.StepParams, opData.StepParams.InputUnit, new GeographicDimensionChange()); }
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 CreateHelmertStep(TransformationCompilationParams opData, Helmert7Transformation helmert) { Contract.Requires(opData != null); Contract.Requires(helmert != null); 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, helmert)); } var spheroidFrom = ExtractSpheroid(opData.StepParams.RelatedInputCrs) ?? ExtractSpheroid(opData.StepParams.RelatedOutputCrs); if (null == spheroidFrom) { return(null); } var spheroidTo = ExtractSpheroid(opData.StepParams.RelatedOutputCrs) ?? spheroidFrom; ITransformation transformation = new GeocentricTransformationGeographicWrapper(spheroidFrom, spheroidTo, helmert); var unitConversion = StaticCoordinateOperationCompiler.CreateCoordinateUnitConversion(opData.StepParams.InputUnit, OgcAngularUnit.DefaultRadians); if (null != unitConversion) { transformation = new ConcatenatedTransformation(new[] { unitConversion, transformation }); } return(new StaticCoordinateOperationCompiler.StepCompilationResult( opData.StepParams, OgcAngularUnit.DefaultRadians, transformation)); }
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 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 StaticCoordinateOperationCompiler.StepCompilationResult CreateTunisiaMiningGrid(TransformationCompilationParams opData) { Contract.Requires(opData != null); ITransformation transformation = new TunisiaMiningGrid(); var conv = StaticCoordinateOperationCompiler.CreateCoordinateUnitConversion(opData.StepParams.InputUnit, OgcAngularUnit.DefaultGrads); if (null != conv) transformation = new ConcatenatedTransformation(new[] { conv, transformation }); return new StaticCoordinateOperationCompiler.StepCompilationResult( opData.StepParams, OgcLinearUnit.DefaultKilometer, 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 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 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 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 CreateMadridToEd50Polynomial(TransformationCompilationParams opData) { Contract.Requires(opData != null); var a0Param = new FullMatchParameterSelector("A0"); var a1Param = new FullMatchParameterSelector("A1"); var a2Param = new FullMatchParameterSelector("A2"); var a3Param = new FullMatchParameterSelector("A3"); var b00Param = new FullMatchParameterSelector("B00"); var b0Param = new FullMatchParameterSelector("B0"); var b1Param = new FullMatchParameterSelector("B1"); var b2Param = new FullMatchParameterSelector("B2"); var b3Param = new FullMatchParameterSelector("B3"); opData.ParameterLookup.Assign(a0Param, a1Param, a2Param, a3Param, b00Param, b0Param, b1Param, b2Param, b3Param); double a0, a1, a2, a3, b00, b0, b1, b2, b3; TryGetCoefficientValue(a0Param.Selection, out a0); TryGetCoefficientValue(a1Param.Selection, out a1); TryGetCoefficientValue(a2Param.Selection, out a2); TryGetCoefficientValue(a3Param.Selection, out a3); TryGetCoefficientValue(b00Param.Selection, out b00); TryGetCoefficientValue(b0Param.Selection, out b0); TryGetCoefficientValue(b1Param.Selection, out b1); TryGetCoefficientValue(b2Param.Selection, out b2); TryGetCoefficientValue(b3Param.Selection, out b3); ITransformation transformation = new MadridEd50Polynomial(a0, a1, a2, a3, b00, b0, b1, b2, b3); var conv = StaticCoordinateOperationCompiler.CreateCoordinateUnitConversion(opData.StepParams.InputUnit, OgcAngularUnit.DefaultDegrees); if (null != conv) { transformation = new ConcatenatedTransformation(new[] { conv, transformation }); } return(new StaticCoordinateOperationCompiler.StepCompilationResult( opData.StepParams, OgcAngularUnit.DefaultDegrees, transformation)); }
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 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 StaticCoordinateOperationCompiler.StepCompilationResult CompileForwardToTransform(StaticCoordinateOperationCompiler.StepCompilationParameters stepParameters) { Contract.Requires(stepParameters != null); string operationName = null; IEnumerable<INamedParameter> parameters = null; var parameterizedOperation = stepParameters.CoordinateOperationInfo as IParameterizedCoordinateOperationInfo; if (null != parameterizedOperation) { if (null != parameterizedOperation.Method) operationName = parameterizedOperation.Method.Name; parameters = parameterizedOperation.Parameters; } if (String.IsNullOrEmpty(operationName)) operationName = stepParameters.CoordinateOperationInfo.Name; if (String.IsNullOrEmpty(operationName)) return null; var parameterLookup = new NamedParameterLookup(parameters ?? Enumerable.Empty<INamedParameter>()); var compilationParams = new TransformationCompilationParams(stepParameters, parameterLookup, operationName); var normalizedName = _coordinateOperationNameComparer.Normalize(compilationParams.OperationName); if (normalizedName.StartsWith("POSITIONVECTORTRANSFORMATION")) return CreatePositionVectorTransformation(compilationParams); if (normalizedName.StartsWith("COORDINATEFRAMEROTATION")) return CreateCoordinateFrameRotationTransformation(compilationParams); if (normalizedName.StartsWith("MOLODENSKYBADEKAS")) return CreateMolodenskyBadekas(compilationParams); if (normalizedName.Equals("GEOGRAPHICOFFSET") || (normalizedName.StartsWith("GEOGRAPHIC") && normalizedName.EndsWith("OFFSET"))) return CreateGeographicOffset(compilationParams); if (normalizedName.StartsWith("GEOCENTRICTRANSLATION")) return CreateGeocentricTranslation(compilationParams); if (normalizedName.Equals("VERTICALOFFSET")) return CreateVerticalOffset(compilationParams); if (normalizedName.Equals("MADRIDTOED50POLYNOMIAL")) return CreateMadridToEd50Polynomial(compilationParams); if (normalizedName.Equals("SIMILARITYTRANSFORMATION")) return CreateSimilarityTransformation(compilationParams); if (normalizedName.Equals("AFFINEPARAMETRICTRANSFORMATION")) return CreateAffineParametricTransformation(compilationParams); if (normalizedName.Equals("GEOGRAPHIC3DTO2DCONVERSION") || normalizedName.Equals("GEOGRAPHIC2DTO3DCONVERSION")) return CreateGeographicDimensionChange(compilationParams); if (normalizedName.Equals("TUNISIAMININGGRID")) return CreateTunisiaMiningGrid(compilationParams); if (normalizedName.StartsWith("GEOCENTRICTOPOCENTRIC")) return CreateGeocentricTopocentric(compilationParams); if (normalizedName.StartsWith("GEOGRAPHICTOPOCENTRIC")) return CreateGeographicTopocentric(compilationParams); if (normalizedName.StartsWith("VERTICALPERSPECTIVE")) { return CreateVerticalPerspective(compilationParams); } return null; }
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 CreateCoordinateFrameRotationTransformation(TransformationCompilationParams opData) { Contract.Requires(opData != null); Vector3 translation, rotation; double scale; if (!ExtractHelmertParams(opData, out translation, out rotation, out scale)) return null; return CreateHelmertStep(opData, Helmert7Transformation.CreateCoordinateFrameRotationFormat(translation, rotation, scale)); }
private StaticCoordinateOperationCompiler.StepCompilationResult CompileForwardToTransform(StaticCoordinateOperationCompiler.StepCompilationParameters stepParameters) { Contract.Requires(stepParameters != null); string operationName = null; IEnumerable <INamedParameter> parameters = null; var parameterizedOperation = stepParameters.CoordinateOperationInfo as IParameterizedCoordinateOperationInfo; if (null != parameterizedOperation) { if (null != parameterizedOperation.Method) { operationName = parameterizedOperation.Method.Name; } parameters = parameterizedOperation.Parameters; } if (String.IsNullOrEmpty(operationName)) { operationName = stepParameters.CoordinateOperationInfo.Name; } if (String.IsNullOrEmpty(operationName)) { return(null); } var parameterLookup = new NamedParameterLookup(parameters ?? Enumerable.Empty <INamedParameter>()); var compilationParams = new TransformationCompilationParams(stepParameters, parameterLookup, operationName); var normalizedName = _coordinateOperationNameComparer.Normalize(compilationParams.OperationName); if (normalizedName.StartsWith("POSITIONVECTORTRANSFORMATION")) { return(CreatePositionVectorTransformation(compilationParams)); } if (normalizedName.StartsWith("COORDINATEFRAMEROTATION")) { return(CreateCoordinateFrameRotationTransformation(compilationParams)); } if (normalizedName.StartsWith("MOLODENSKYBADEKAS")) { return(CreateMolodenskyBadekas(compilationParams)); } if (normalizedName.Equals("GEOGRAPHICOFFSET") || (normalizedName.StartsWith("GEOGRAPHIC") && normalizedName.EndsWith("OFFSET"))) { return(CreateGeographicOffset(compilationParams)); } if (normalizedName.StartsWith("GEOCENTRICTRANSLATION")) { return(CreateGeocentricTranslation(compilationParams)); } if (normalizedName.Equals("VERTICALOFFSET")) { return(CreateVerticalOffset(compilationParams)); } if (normalizedName.Equals("MADRIDTOED50POLYNOMIAL")) { return(CreateMadridToEd50Polynomial(compilationParams)); } if (normalizedName.Equals("SIMILARITYTRANSFORMATION")) { return(CreateSimilarityTransformation(compilationParams)); } if (normalizedName.Equals("AFFINEPARAMETRICTRANSFORMATION")) { return(CreateAffineParametricTransformation(compilationParams)); } if (normalizedName.Equals("GEOGRAPHIC3DTO2DCONVERSION") || normalizedName.Equals("GEOGRAPHIC2DTO3DCONVERSION")) { return(CreateGeographicDimensionChange(compilationParams)); } if (normalizedName.Equals("TUNISIAMININGGRID")) { return(CreateTunisiaMiningGrid(compilationParams)); } if (normalizedName.StartsWith("GEOCENTRICTOPOCENTRIC")) { return(CreateGeocentricTopocentric(compilationParams)); } if (normalizedName.StartsWith("GEOGRAPHICTOPOCENTRIC")) { return(CreateGeographicTopocentric(compilationParams)); } if (normalizedName.StartsWith("VERTICALPERSPECTIVE")) { return(CreateVerticalPerspective(compilationParams)); } return(null); }
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)); }