public static Meridian Create(IPrimeMeridianInfo primeMeridian)
        {
            if(primeMeridian == null) throw new ArgumentNullException("primeMeridian");
            Contract.Ensures(Contract.Result<Meridian>() != null);

            var lon = primeMeridian.Longitude;
            if (primeMeridian.Unit.Name != "degrees") {
                var conversion = SimpleUnitConversionGenerator.FindConversion(primeMeridian.Unit, OgcAngularUnit.DefaultDegrees);
                if (conversion != null) {
                    lon = conversion.TransformValue(lon);
                }
                else {
                    throw new InvalidOperationException("Could not convert meridian unit.");
                }
            }

            var result = new Meridian(lon, primeMeridian.Name);

            if (primeMeridian.Authority != null) {
                int epsgCode;
                if (primeMeridian.Authority.Name == "EPSG" && Int32.TryParse(primeMeridian.Authority.Code, out epsgCode))
                    result.Code = epsgCode;
            }

            return result;
        }
Example #2
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
                       ));
        }
Example #3
0
        private bool ComputationallyEqual(IPrimeMeridianInfo a, IPrimeMeridianInfo b)
        {
            if (a == b)
            {
                return(true);
            }
            if (a == null || b == null)
            {
                return(false);
            }

            return(a.Longitude == b.Longitude &&
                   ComputationallyEqual(a.Unit, b.Unit));
        }
Example #4
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;
 }
Example #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;
 }
Example #6
0
        public void Write(IPrimeMeridianInfo entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }
            Contract.EndContractBlock();
            Write(WktKeyword.PrimeMeridian);
            WriteOpenParenthesis();
            Indent();
            WriteQuoted(entity.Name);
            WriteComma();
            WriteValue(entity.Longitude);
            var authorityTag = Options.GetAuthorityTag(entity);

            if (null != authorityTag)
            {
                WriteComma();
                Write(authorityTag);
            }
            UnIndent();
            WriteCloseParenthesis();
        }
        public static Meridian Create(IPrimeMeridianInfo primeMeridian)
        {
            if (primeMeridian == null)
            {
                throw new ArgumentNullException("primeMeridian");
            }
            Contract.Ensures(Contract.Result <Meridian>() != null);

            var lon = primeMeridian.Longitude;

            if (primeMeridian.Unit.Name != "degrees")
            {
                var conversion = SimpleUnitConversionGenerator.FindConversion(primeMeridian.Unit, OgcAngularUnit.DefaultDegrees);
                if (conversion != null)
                {
                    lon = conversion.TransformValue(lon);
                }
                else
                {
                    throw new InvalidOperationException("Could not convert meridian unit.");
                }
            }

            var result = new Meridian(lon, primeMeridian.Name);

            if (primeMeridian.Authority != null)
            {
                int epsgCode;
                if (primeMeridian.Authority.Name == "EPSG" && Int32.TryParse(primeMeridian.Authority.Code, out epsgCode))
                {
                    result.Code = epsgCode;
                }
            }

            return(result);
        }
Example #8
0
        private ICrsGeographic ReadGeographicCsFromParams()
        {
            Contract.Ensures(Contract.Result <ICrsGeographic>() != null);
            IAuthorityTag      authority     = null;
            var                name          = String.Empty;
            IDatumGeodetic     datum         = null;
            IPrimeMeridianInfo primeMeridian = null;
            IUnit              unit          = OgcAngularUnit.DefaultDegrees;
            var                axes          = new List <IAxis>();

            foreach (var parameter in ReadParams())
            {
                if (parameter is string)
                {
                    name = (string)parameter;
                }
                else if (parameter is IAuthorityTag)
                {
                    authority = (IAuthorityTag)parameter;
                }
                else if (parameter is IDatumGeodetic)
                {
                    datum = (IDatumGeodetic)parameter;
                }
                else if (parameter is IPrimeMeridianInfo)
                {
                    primeMeridian = (IPrimeMeridianInfo)parameter;
                }
                else if (parameter is IUnit)
                {
                    unit = (IUnit)parameter;
                }
                else if (parameter is IAxis)
                {
                    axes.Add((IAxis)parameter);
                }
            }

            if (null != authority)
            {
                var crs = Options.GetCrs(authority) as ICrsGeographic;
                if (null != crs)
                {
                    return(crs);
                }
            }

            if (null != datum && datum.PrimeMeridian == null && null != primeMeridian)
            {
                // in this case the datum must have NOT been created from an authority source so we should remake it with a prime meridian
                datum = new OgcDatumHorizontal(
                    datum.Name,
                    datum.Spheroid,
                    primeMeridian,
                    datum.BasicWgs84Transformation,
                    datum.Authority
                    );
            }

            if (datum == null)
            {
                if (Options.ThrowOnError)
                {
                    throw new WktParseExceptioncs("Geographic CRS", "No datum.");
                }
                datum = OgcDatumHorizontal.DefaultWgs84;
            }

            return(new OgcCrsGeographic(
                       name,
                       datum,
                       unit,
                       axes,
                       authority
                       ));
        }