Ejemplo n.º 1
0
        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
                       ));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 /// <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;
 }
Ejemplo n.º 4
0
        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
                   ));
        }
Ejemplo n.º 5
0
 /// <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;
 }
Ejemplo n.º 6
0
        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);
 }
Ejemplo n.º 9
0
        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, 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);
 }