public TransformationCompilationParams( StaticCoordinateOperationCompiler.StepCompilationParameters stepParams, NamedParameterLookup parameterLookup, string operationName ) { Contract.Requires(stepParams != null); Contract.Requires(parameterLookup != null); Contract.Requires(!String.IsNullOrEmpty(operationName)); StepParams = stepParams; ParameterLookup = parameterLookup; OperationName = operationName; }
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 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 void ApplyParametersStere(ProjectionInfo result, IEnumerable<INamedParameter> parameters) { Contract.Requires(result != null); Contract.Requires(parameters != null); var lon0Param = new MultiParameterSelector( new CentralMeridianParameterSelector(), new LongitudeOfNaturalOriginParameterSelector(), new LongitudeOfCenterParameterSelector()); var spParam = new MultiParameterSelector( new LatitudeOfTrueScaleParameterSelector(), new StandardParallelParameterSelector(), new LatitudeOfNaturalOriginParameterSelector(), new LatitudeOfCenterParameterSelector()); var k0Param = new ScaleFactorParameterSelector(); var x0Param = new FalseEastingParameterSelector(); var y0Param = new FalseNorthingParameterSelector(); var paramLookup = new NamedParameterLookup(parameters); paramLookup.Assign(lon0Param, spParam, k0Param, x0Param, y0Param); if (lon0Param.IsSelected) result.CentralMeridian = lon0Param.GetValueAsDouble(OgcAngularUnit.DefaultDegrees); if (spParam.IsSelected) result.StandardParallel1 = spParam.GetValueAsDouble(OgcAngularUnit.DefaultDegrees); if (k0Param.IsSelected) result.ScaleFactor = k0Param.GetValueAsDouble(ScaleUnitUnity.Value) ?? 1.0; if (x0Param.IsSelected) result.FalseEasting = x0Param.GetValueAsDouble(OgcLinearUnit.DefaultMeter); if (y0Param.IsSelected) result.FalseNorthing = y0Param.GetValueAsDouble(OgcLinearUnit.DefaultMeter); if (!result.LatitudeOfOrigin.HasValue && result.StandardParallel1.HasValue) result.LatitudeOfOrigin = result.StandardParallel1.GetValueOrDefault() >= 0 ? 90.0 : -90.0; }
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(); }
public static ProjectionInfo CreateProjection(ICrsProjected crsProjected) { if (crsProjected == null) throw new ArgumentNullException("crsProjected"); Contract.Ensures(Contract.Result<ProjectionInfo>() != null); var result = ProjectionInfo.FromProj4String(String.Empty); result.Name = crsProjected.Name; if (crsProjected.Authority != null) { int epsgCode; if (crsProjected.Authority.Name == "EPSG" && Int32.TryParse(crsProjected.Authority.Code, out epsgCode)) result.EpsgCode = epsgCode; result.Authority = crsProjected.Authority.Name; } var geographicBase = (crsProjected.BaseCrs as ICrsGeodetic) ?? (crsProjected as ICrsGeodetic); if (geographicBase != null) result.GeographicInfo = Proj4CrsGeographic.CreateGeographic(geographicBase); var projectionInfo = crsProjected.Projection as IParameterizedCoordinateOperationInfo; if (projectionInfo == null) return result; var projectionMethod = projectionInfo.Method; if(projectionMethod == null) throw new InvalidOperationException("No projection method."); var proj4Name = ToProj4MethodName(projectionMethod.Name); IUnit geographicUnit = geographicBase == null ? null : geographicBase.Unit; IUnit projectionUnit = crsProjected.Unit; if (projectionUnit != null) result.Unit = Proj4LinearUnit.ConvertToProj4(projectionUnit); switch (proj4Name) { case "stere": ApplyParametersStere(result, projectionInfo.Parameters); break; default: ApplyParametersDefault(result, projectionInfo.Parameters); break; } if (result.Zone.HasValue && proj4Name == "tmerc") proj4Name = "utm"; if (!TransformManager.Transforms.Exists(x => x.Proj4Name == proj4Name)) { if (GeodeticOperationNameRegex.IsMatch(proj4Name)) { proj4Name = "longlat"; } else { throw new InvalidOperationException(); } } switch (proj4Name) { case "omerc": { var offsetXParam = new FalseEastingParameterSelector(); var offsetYParam = new FalseNorthingParameterSelector(); var xAtOriginParam = new EastingAtCenterParameterSelector(); var yAtOriginParam = new NorthingAtCenterParameterSelector(); var paramLookup = new NamedParameterLookup(projectionInfo.Parameters); paramLookup.Assign(offsetXParam, offsetYParam, xAtOriginParam, yAtOriginParam); if (offsetXParam.IsSelected || offsetYParam.IsSelected) result.Transform = TransformManager.GetProjection("Hotine_Oblique_Mercator_Azimuth_Center"); else if(xAtOriginParam.IsSelected || yAtOriginParam.IsSelected) result.Transform = TransformManager.GetProjection("Hotine_Oblique_Mercator_Azimuth_Natural_Origin"); else result.Transform = TransformManager.GetProj4(proj4Name); break; } default: result.Transform = TransformManager.GetProj4(proj4Name); break; } var finalResult = ProjectionInfo.FromProj4String(result.ToProj4String()); // TODO: fix this hack /*finalResult.CentralMeridian = result.CentralMeridian; finalResult.LongitudeOfCenter = result.LongitudeOfCenter; finalResult.LatitudeOfOrigin = result.LatitudeOfOrigin; finalResult.StandardParallel1 = result.StandardParallel1; finalResult.StandardParallel2 = result.StandardParallel2; finalResult.FalseEasting = result.FalseEasting; finalResult.FalseNorthing = result.FalseNorthing; finalResult.ScaleFactor = result.ScaleFactor; finalResult.alpha = result.alpha; finalResult.IsSouth = result.IsSouth; finalResult.Zone = result.Zone; finalResult.Unit = result.Unit; if (result.GeographicInfo == null) { // NOTE: this is all so terrible finalResult.GeographicInfo = null; } else { if (finalResult.GeographicInfo == null) { finalResult.GeographicInfo = result.GeographicInfo; } else { finalResult.GeographicInfo.Datum.Spheroid = result.GeographicInfo.Datum.Spheroid; } }*/ return finalResult; }
private ITransformation<GeographicCoordinate, Point2> 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 (null == operationName) operationName = stepParameters.CoordinateOperationInfo.Name; Func<ProjectionCompilationParams, ITransformation<GeographicCoordinate, Point2>> projectionCompiler; if (String.IsNullOrEmpty(operationName) || !_transformationCreatorLookup.TryGetValue(operationName, out projectionCompiler) || null == projectionCompiler) return null; var parameterLookup = new NamedParameterLookup(parameters ?? Enumerable.Empty<INamedParameter>()); var projectionCompilationParams = new ProjectionCompilationParams(stepParameters, parameterLookup, operationName); return projectionCompiler(projectionCompilationParams); }