public IDatumGeodetic ReadHorizontalDatumFromParams() { Contract.Ensures(Contract.Result <IDatumGeodetic>() != null); IAuthorityTag authority = null; var name = String.Empty; ISpheroidInfo spheroid = null; Helmert7Transformation toWgs84 = null; IPrimeMeridianInfo primeMeridian = null; foreach (var parameter in ReadParams()) { if (parameter is IAuthorityTag) { authority = (IAuthorityTag)parameter; } else if (parameter is string) { name = (string)parameter; } else if (parameter is ISpheroidInfo) { spheroid = (ISpheroidInfo)parameter; } else if (parameter is Helmert7Transformation) { toWgs84 = (Helmert7Transformation)parameter; } else if (parameter is IPrimeMeridianInfo) { primeMeridian = (IPrimeMeridianInfo)parameter; // NOTE: this may not happen due to the spec... but just in case? } } if (null != authority) { var datum = Options.GetDatum(authority) as IDatumGeodetic; if (null != datum) { return(datum); } } if (spheroid == null) { if (Options.ThrowOnError) { throw new WktParseExceptioncs("Horizontal Datum", "No spheroid."); } spheroid = OgcSpheroid.DefaultWgs84; } return(new OgcDatumHorizontal( name, spheroid, primeMeridian, toWgs84, authority )); }
public static Spheroid Create(ISpheroidInfo spheroidInfo) { if (spheroidInfo == null) { throw new ArgumentNullException("spheroidInfo"); } Contract.Ensures(Contract.Result <Spheroid>() != null); var aMeters = spheroidInfo.A; var bMeters = spheroidInfo.B; if (spheroidInfo.AxisUnit != null) { var conversion = SimpleUnitConversionGenerator.FindConversion(spheroidInfo.AxisUnit, Proj4LinearUnit.Meter); if (conversion != null && !(conversion is UnitUnityConversion)) { aMeters = conversion.TransformValue(aMeters); bMeters = conversion.TransformValue(bMeters); } } Spheroid result; if (aMeters == bMeters) { var knownMatch = AllKnownSpheroids .Where(k => k.PolarRadius == aMeters) .OrderByDescending(k => SpheroidNameNormalizedComparer.Default.Equals(k.Name, spheroidInfo.Name)) .FirstOrDefault(); if (knownMatch != null) { return(knownMatch); } result = new Spheroid(Proj4Ellipsoid.Custom); result.PolarRadius = aMeters; } else { var knownMatch = AllKnownSpheroids .Where(k => k.EquatorialRadius == aMeters && (k.InverseFlattening == spheroidInfo.InvF || k.PolarRadius == bMeters)) .OrderByDescending(k => SpheroidNameNormalizedComparer.Default.Equals(k.Name, spheroidInfo.Name)) .FirstOrDefault(); if (knownMatch != null) { return(knownMatch); } result = new Spheroid(Proj4Ellipsoid.Custom); result.EquatorialRadius = aMeters; // NOTE: do not directly set the InverseFlattening as it is stored as PolarRadius result.PolarRadius = bMeters; } result.Name = spheroidInfo.Name; return(result); }
/// <summary> /// Constructs a horizontal datum. /// </summary> /// <param name="name">The name.</param> /// <param name="spheroid">The spheroid of the datum.</param> /// <param name="primeMeridian">The prime meridian of the datum.</param> /// <param name="transform">The transformation for conversions to WGS84.</param> /// <param name="authority">The authority.</param> public OgcDatumHorizontal( string name, ISpheroidInfo spheroid, IPrimeMeridianInfo primeMeridian, Helmert7Transformation transform, IAuthorityTag authority = null ) : base(name, OgcDatumType.None, authority) { if (null == spheroid) throw new ArgumentNullException("spheroid"); Contract.Requires(name != null); Spheroid = spheroid; PrimeMeridian = primeMeridian; BasicWgs84Transformation = transform; }
private bool ComputationallyEqual(ISpheroidInfo a, ISpheroidInfo b) { if (a == b) { return(true); } if (a == null || b == null) { return(false); } return(a.A == b.A && ( a.B == b.B || a.InvF == b.InvF )); }
/// <summary> /// Constructs a horizontal datum. /// </summary> /// <param name="name">The name.</param> /// <param name="spheroid">The spheroid of the datum.</param> /// <param name="primeMeridian">The prime meridian of the datum.</param> /// <param name="transform">The transformation for conversions to WGS84.</param> /// <param name="authority">The authority.</param> public OgcDatumHorizontal( string name, ISpheroidInfo spheroid, IPrimeMeridianInfo primeMeridian, Helmert7Transformation transform, IAuthorityTag authority = null ) : base(name, OgcDatumType.None, authority) { if (null == spheroid) { throw new ArgumentNullException("spheroid"); } Contract.Requires(name != null); Spheroid = spheroid; PrimeMeridian = primeMeridian; BasicWgs84Transformation = transform; }
public void Write(ISpheroidInfo entity) { if (entity == null) { throw new ArgumentNullException("entity"); } Contract.EndContractBlock(); Write(WktKeyword.Spheroid); WriteOpenParenthesis(); Indent(); WriteQuoted(entity.Name); WriteComma(); // the axis value must be in meters var a = entity.A; if (entity.AxisUnit != null) { var conversion = SimpleUnitConversionGenerator.FindConversion(entity.AxisUnit, OgcLinearUnit.DefaultMeter); if (null != conversion) { a = conversion.TransformValue(a); } } WriteValue(a); WriteComma(); WriteValue(entity.InvF); if (null != entity.Authority) { WriteComma(); Write(entity.Authority); } UnIndent(); WriteCloseParenthesis(); }
public SpheroidLinearUnitConversionWrapper(ISpheroidInfo spheroid, IUnit unit, double a, double b) : this(spheroid.Name, unit, spheroid, a, b) { Contract.Requires(spheroid != null); Contract.Requires(unit != null); }
public SpheroidLinearUnitConversionWrapper(ISpheroidInfo spheroid, IUnitConversion<double> conversion) : this(spheroid, conversion.To, conversion.TransformValue(spheroid.A), conversion.TransformValue(spheroid.B)) { Contract.Requires(spheroid != null); Contract.Requires(conversion != null); }
public static Spheroid Create(ISpheroidInfo spheroidInfo) { if(spheroidInfo == null) throw new ArgumentNullException("spheroidInfo"); Contract.Ensures(Contract.Result<Spheroid>() != null); var aMeters = spheroidInfo.A; var bMeters = spheroidInfo.B; if (spheroidInfo.AxisUnit != null) { var conversion = SimpleUnitConversionGenerator.FindConversion(spheroidInfo.AxisUnit, Proj4LinearUnit.Meter); if (conversion != null && !(conversion is UnitUnityConversion)) { aMeters = conversion.TransformValue(aMeters); bMeters = conversion.TransformValue(bMeters); } } Spheroid result; if (aMeters == bMeters) { var knownMatch = AllKnownSpheroids .Where(k => k.PolarRadius == aMeters) .OrderByDescending(k => SpheroidNameNormalizedComparer.Default.Equals(k.Name, spheroidInfo.Name)) .FirstOrDefault(); if (knownMatch != null) return knownMatch; result = new Spheroid(Proj4Ellipsoid.Custom); result.PolarRadius = aMeters; } else{ var knownMatch = AllKnownSpheroids .Where(k => k.EquatorialRadius == aMeters && (k.InverseFlattening == spheroidInfo.InvF || k.PolarRadius == bMeters)) .OrderByDescending(k => SpheroidNameNormalizedComparer.Default.Equals(k.Name, spheroidInfo.Name)) .FirstOrDefault(); if (knownMatch != null) return knownMatch; result = new Spheroid(Proj4Ellipsoid.Custom); result.EquatorialRadius = aMeters; // NOTE: do not directly set the InverseFlattening as it is stored as PolarRadius result.PolarRadius = bMeters; } result.Name = spheroidInfo.Name; return result; }
public SpheroidLinearUnitConversionWrapper(ISpheroidInfo spheroid, IUnitConversion <double> conversion) : this(spheroid, conversion.To, conversion.TransformValue(spheroid.A), conversion.TransformValue(spheroid.B)) { Contract.Requires(spheroid != null); Contract.Requires(conversion != null); }