Exemplo n.º 1
0
        public void TestNamedMeridians()
        {
            foreach (NamedMeridian nm in Enum.GetValues(typeof(NamedMeridian)))
            {
                if (nm == NamedMeridian.Unknown || nm == NamedMeridian.Undefined)
                {
                    continue;
                }

                var m = Meridian.CreateByNamedMeridian(nm);
                Assert.AreEqual((int)nm, m.Code);
                Assert.AreEqual(nm, m.Name);
                Assert.AreEqual(string.Format(" +pm={0}", nm.ToString().ToLower()), m.Proj4Description);
                var c = new GeoAPI.Geometries.Coordinate(0, 0);
                m.InverseAdjust(c);
                Assert.AreEqual(m.Longitude, c.X, 1e-7);
                m.Adjust(c);
                Assert.AreEqual(0, c.X, 1e-7);

                var m2 = Meridian.CreateByName(nm.ToString().ToLower());
                Assert.AreEqual(m, m2);

                var m3 = Meridian.CreateByDegree(Utility.ProjectionMath.ToDegrees(m.Longitude));
                Assert.AreEqual(m, m3);
            }
        }
Exemplo n.º 2
0
        public void DefaultCtor()
        {
            var target = new Meridian();

            Assert.IsNotNull(target);
            Assert.AreEqual(Proj4Meridian.Greenwich.ToString(), target.Name);
        }
Exemplo n.º 3
0
        public void WellKnownTextConverterToIdentifiedObjectTest()
        {
            for (Int32 index = 0; index < this.identifiedObjects.Length; index++)
            {
                IdentifiedObject identifiedObject = WellKnownTextConverter.ToIdentifiedObject(this.identifiedObjectsText[index], TestUtilities.ReferenceProvider);
                Assert.AreEqual(this.identifiedObjects[index], identifiedObject);
            }

            Meridian meridian = WellKnownTextConverter.ToIdentifiedObject("PRIMEM[\"Greenwich\",0.0]", TestUtilities.ReferenceProvider) as Meridian;

            Assert.AreEqual(meridian, TestUtilities.ReferenceProvider.Meridians["EPSG", 8901]);

            meridian = WellKnownTextConverter.ToIdentifiedObject("PRIMEM(\"Greenwich\",0.0)", TestUtilities.ReferenceProvider) as Meridian;
            Assert.AreEqual(meridian, TestUtilities.ReferenceProvider.Meridians["EPSG", 8901]);

            meridian = WellKnownTextConverter.ToIdentifiedObject("PRIMEM(Greenwich,0.0)", TestUtilities.ReferenceProvider) as Meridian;
            Assert.AreEqual(meridian, TestUtilities.ReferenceProvider.Meridians["EPSG", 8901]);

            meridian = WellKnownTextConverter.ToIdentifiedObject("PRIMEM[\"Greenwich\", 0.0, AUTHORITY[\"EPSG\", 8901]]", TestUtilities.ReferenceProvider) as Meridian;
            Assert.AreEqual(meridian, TestUtilities.ReferenceProvider.Meridians["EPSG", 8901]);

            meridian = WellKnownTextConverter.ToIdentifiedObject("PRIMEM [\"Greenwich\", 0.0, AUTHORITY [\"EPSG\", 8901]])", TestUtilities.ReferenceProvider) as Meridian;
            Assert.AreEqual(meridian, TestUtilities.ReferenceProvider.Meridians["EPSG", 8901]);

            meridian = WellKnownTextConverter.ToIdentifiedObject("PRIMEM[Greenwich, 0.0, AUTHORITY[EPSG, 8901]]", TestUtilities.ReferenceProvider) as Meridian;
            Assert.AreEqual(meridian, TestUtilities.ReferenceProvider.Meridians["EPSG", 8901]);

            Assert.Throws <ArgumentNullException>(() => WellKnownTextConverter.ToIdentifiedObject(null, null));
            Assert.Throws <ArgumentException>(() => WellKnownTextConverter.ToIdentifiedObject(String.Empty, TestUtilities.ReferenceProvider));
            Assert.Throws <ArgumentException>(() => WellKnownTextConverter.ToIdentifiedObject("UNDEFINED[\"something\"]", TestUtilities.ReferenceProvider));
        }
Exemplo n.º 4
0
        public void CtorLongitudeName(Tuple <Proj4Meridian, double, int> meridian)
        {
            var target = new Meridian(meridian.Item2, meridian.Item1.ToString());

            Assert.IsNotNull(target);
            Assert.AreEqual(meridian.Item2, target.Longitude);
            Assert.AreEqual(meridian.Item1.ToString(), target.Name);
        }
        private void CmbMeridianSelectedIndexChanged(object sender, EventArgs e)
        {
            Proj4Meridian mer = (Proj4Meridian)Enum.Parse(typeof(Proj4Meridian), (string)cmbMeridian.SelectedItem);
            Meridian      m   = new Meridian(mer);

            SelectedProjectionInfo.GeographicInfo.Meridian = m;
            dbMeridian.Value = m.Longitude;
        }
Exemplo n.º 6
0
        public void TestCustomMeridian()
        {
            var degree = 5.7;
            var m      = Meridian.CreateByDegree(degree);

            Assert.AreEqual(NamedMeridian.Unknown, m.Name);
            Assert.AreEqual(Utility.ProjectionMath.ToDegrees(m.Longitude), degree);
            Assert.AreEqual(string.Format(System.Globalization.NumberFormatInfo.InvariantInfo, " +pm={0}", degree), m.Proj4Description);
        }
Exemplo n.º 7
0
 /// <summary>
 /// Returns a hash code for this instance.
 /// </summary>
 /// <returns>
 /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
 /// </returns>
 public override int GetHashCode()
 {
     return(Direction.GetHashCode() ^
            LegalSubdivision.GetHashCode() ^
            Meridian.GetHashCode() ^
            Range.GetHashCode() ^
            Section.GetHashCode() ^
            Township.GetHashCode());
 }
Exemplo n.º 8
0
        public void AssignMeridian(Tuple <Proj4Meridian, double, int> meridian)
        {
            var target = new Meridian();

            target.AssignMeridian(meridian.Item1);
            Assert.AreEqual(meridian.Item3, target.Code);
            Assert.AreEqual(meridian.Item2, target.Longitude);
            Assert.AreEqual(meridian.Item1.ToString(), target.Name);
        }
Exemplo n.º 9
0
        public void PmDoubleValue(Tuple <Proj4Meridian, double, int> meridian)
        {
            var target = new Meridian {
                pm = meridian.Item2.ToString(CultureInfo.InvariantCulture)
            };

            Assert.AreEqual(meridian.Item3, target.Code);
            Assert.AreEqual(meridian.Item2, target.Longitude);
            Assert.AreEqual(meridian.Item1.ToString(), target.Name);
        }
Exemplo n.º 10
0
        public void PmStringValue(Tuple <Proj4Meridian, double, int> meridian)
        {
            var target = new Meridian {
                pm = meridian.Item1.ToString()
            };

            Assert.AreEqual(meridian.Item3, target.Code);
            Assert.AreEqual(meridian.Item2, target.Longitude);
            Assert.AreEqual(meridian.Item1.ToString(), target.Name);
        }
Exemplo n.º 11
0
        public Meridian GetMeridianById(int id)
        {
            Meridian meridian = null;

            if (!this.id_MeridianMap.TryGetValue(id, out meridian))
            {
                Logger.Warn("Invalid Meridian Id : {0:X}", new object[] { id });
                return(null);
            }
            return(meridian);
        }
Exemplo n.º 12
0
        private MeridianGroup LoadMeridianGroupFromXml(SecurityElement element)
        {
            MeridianGroup group = new MeridianGroup {
                type = TypeNameContainer <_MeridianType> .Parse(element.Attribute("Type"), 0)
            };

            if (element.Children != null)
            {
                foreach (SecurityElement element2 in element.Children)
                {
                    string str;
                    if (((str = element2.Tag) != null) && (str == "Meridian"))
                    {
                        Meridian item = this.LoadMeridianFromXml(element2);
                        group.meridians.Add(item);
                    }
                }
            }
            return(group);
        }
Exemplo n.º 13
0
        /// <summary>
        /// Computes the geodetic datum.
        /// </summary>
        /// <returns>The geodetic datum.</returns>
        /// <exception cref="System.IO.InvalidDataException">Geodetic Datum code is invalid.</exception>
        private GeodeticDatum ComputeGeodeticDatum()
        {
            Int32 code = Convert.ToInt32(_currentGeoKeys[GeoKey.GeodeticDatum]);

            // EPSG geodetic datum codes
            if (code >= 6000 && code <= 6999)
            {
                return(GeodeticDatums.FromIdentifier("EPSG::" + code).FirstOrDefault());
            }
            // user-defined geodetic datum
            if (code == Int16.MaxValue)
            {
                Ellipsoid ellipsoid     = ComputeEllipsoid();
                Meridian  primeMeridian = ComputePrimeMeridian();

                return(new GeodeticDatum(GeodeticDatum.UserDefinedIdentifier, GeodeticDatum.UserDefinedName, null, null, null, ellipsoid, primeMeridian));
            }

            throw new InvalidDataException("Geodetic datum code is invalid.");
        }
Exemplo n.º 14
0
        private Meridian LoadMeridianFromXml(SecurityElement element)
        {
            Meridian meridian = new Meridian {
                id            = StrParser.ParseHexInt(element.Attribute("Id"), 0),
                name          = StrParser.ParseStr(element.Attribute("Name"), ""),
                level         = StrParser.ParseDecInt(element.Attribute("Level"), 1),
                preMeridianId = StrParser.ParseHexInt(element.Attribute("PreMeridianId"), 0),
                buffAddition  = StrParser.ParseFloat(element.Attribute("BuffAddition"), 0f)
            };

            if (element.Children != null)
            {
                foreach (SecurityElement element2 in element.Children)
                {
                    MeridianBuff buff;
                    string       tag = element2.Tag;
                    if (tag != null)
                    {
                        if (tag == "IncreaseCost")
                        {
                            meridian.increaseCosts.Add(IncreaseCost.LoadFromXml(element2));
                        }
                        else if (tag == "Buff")
                        {
                            goto Label_00E5;
                        }
                    }
                    continue;
Label_00E5:
                    buff        = new MeridianBuff();
                    buff.id     = StrParser.ParseHexInt(element2.Attribute("BuffId"), 0);
                    buff.weight = StrParser.ParseDecInt(element2.Attribute("Weight"), 1);
                    meridian.meridianBuffs.Add(buff);
                }
            }
            return(meridian);
        }
Exemplo n.º 15
0
        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);
        }
Exemplo n.º 16
0
        /// <summary>
        /// Inverse solution of geodetic problem from start point, end point to the distance and azimuth.
        /// </summary>
        /// <param name="start">start point of geodesic</param>
        /// <param name="end">end point of geodesic</param>
        /// <param name="distance">distance of geodesic</param>
        /// <param name="bearing">azimuth of geodesic</param>
        /// <param name="ivBearing">inverse azimuth of geodesic</param>
        protected override void Inverse(GeoPoint start, GeoPoint end, out double distance, out Angle bearing, out Angle ivBearing)
        {
            double lat1 = start.Latitude.Radians;
            double lng1 = start.Longitude.Radians;
            double lat2 = end.Latitude.Radians;
            double lng2 = end.Longitude.Radians;

            // If the two point on the same meridian
            if (Math.Abs(lng1 - lng2) < double.Epsilon)
            {
                Meridian meridian = new Meridian(start.Longitude, start.Latitude, end.Latitude, start.Ellipsoid);
                distance  = meridian.Length;
                bearing   = meridian.Azimuth;
                ivBearing = meridian.InverseAzimuth;
                return;
            }

            double a   = start.Ellipsoid.a;
            double es  = start.Ellipsoid.ee;
            double ses = start.Ellipsoid._ee;

            double u1 = Math.Atan(Math.Sqrt(1 - es) * Math.Tan(lat1));
            double u2 = Math.Atan(Math.Sqrt(1 - es) * Math.Tan(lat2));
            double dL = lng2 - lng1;

            double sigma = Math.Sin(u1) * Math.Sin(u2) + Math.Cos(u1) * Math.Cos(u2) * Math.Cos(dL);     //Cos(sigma)

            sigma = Math.Atan(Math.Sqrt(1 - sigma * sigma) / sigma);
            if (sigma < 0)
            {
                sigma += Math.PI;
            }

            double m = Math.Cos(u1) * Math.Cos(u2) * Math.Sin(dL) / Math.Sin(sigma);                     //Sin(m)

            m = Math.Atan(m / Math.Sqrt(1 - m * m));

            double KK, alpha, beta, gamma;
            double temp  = dL;
            double lamda = dL + 0.003351 * sigma * Math.Sin(m);
            double M     = Math.PI / 2;

            while (Math.Abs(lamda - temp) > Settings.Epsilon5)                                         //精度0.00001秒
            {
                temp = lamda;

                m = Math.Cos(u1) * Math.Cos(u2) * Math.Sin(lamda) / Math.Sin(sigma);                     //Sin(m)
                m = Math.Atan(m / Math.Sqrt(1 - m * m));

                double tanA = Math.Sin(lamda) / (Math.Cos(u1) * Math.Tan(u2) - Math.Sin(u1) * Math.Cos(lamda));

                M = Math.Atan(Math.Sin(u1) * tanA / Math.Sin(m));
                if (M < 0)
                {
                    M += Math.PI;
                }

                KK    = es * Math.Pow(Math.Cos(m), 2);
                alpha = es / 2 + es * es / 8 + Math.Pow(es, 3) / 16 - es * (1 + es) * KK / 16 + 3 * es * KK * KK / 128;
                beta  = es * (1 + es) * KK / 16 - es * KK * KK / 32;
                gamma = es * KK * KK / 256;

                lamda = dL + Math.Sin(m) * (alpha * sigma + beta * Math.Sin(sigma) * Math.Cos(2 * M + sigma) + gamma * Math.Sin(2 * sigma) * Math.Cos(4 * M + 2 * sigma));

                sigma = Math.Sin(u1) * Math.Sin(u2) + Math.Cos(u1) * Math.Cos(u2) * Math.Cos(lamda);     //Cos(sigma)
                sigma = Math.Atan(Math.Sqrt(1 - sigma * sigma) / sigma);
                if (sigma < 0)
                {
                    sigma += Math.PI;
                }
            }

            double A1 = Math.Atan(Math.Sin(lamda) / (Math.Cos(u1) * Math.Tan(u2) - Math.Sin(u1) * Math.Cos(lamda)));

            if (A1 < 0)
            {
                A1 += Math.PI;
            }
            if (m < 0)
            {
                A1 += Math.PI;
            }
            bearing = Angle.FromRadians(A1);

            double A2 = Math.Atan(Math.Sin(lamda) / (Math.Sin(u2) * Math.Cos(lamda) - Math.Tan(u1) * Math.Cos(u2)));

            if (A2 < 0)
            {
                A2 += Math.PI;
            }
            if (m > 0)
            {
                A2 += Math.PI;
            }
            ivBearing = Angle.FromRadians(A2);

            KK    = ses * Math.Pow(Math.Cos(m), 2);
            alpha = Math.Sqrt(1 + ses) * (1 - KK / 4 + 7 * KK * KK / 64 - 15 * Math.Pow(KK, 3) / 256) / a;
            beta  = KK / 4 - KK * KK / 8 + 37 * Math.Pow(KK, 3) / 512;
            gamma = KK * KK * (1 - KK) / 128;

            distance = (sigma - beta * Math.Sin(sigma) * Math.Cos(2 * M + sigma) - gamma * Math.Sin(2 * sigma) * Math.Cos(4 * M + 2 * sigma)) / alpha;
        }
Exemplo n.º 17
0
 public Proj4MeridianWrapper(Meridian meridian)
     : base(meridian.Name ?? "Unknown", new AuthorityTag("PROJ4", meridian.Code.ToString(CultureInfo.InvariantCulture)))
 {
     Contract.Requires(meridian != null);
     Core = meridian;
 }
Exemplo n.º 18
0
        /// <summary>
        /// Returns a collection with items with the specified prime meridian.
        /// </summary>
        /// <param name="collection">The geodetic datum collection.</param>
        /// <param name="primeMeridian">The prime meridian.</param>
        /// <returns>A collection containing the items that are with the specified prime meridian.</returns>
        /// <exception cref="System.ArgumentNullException">
        /// The collection is null.
        /// or
        /// The prime meridian is null.
        /// </exception>
        public static IEnumerable <GeodeticDatum> WithPrimeMeridian(this IEnumerable <GeodeticDatum> collection, Meridian primeMeridian)
        {
            if (collection == null)
            {
                throw new ArgumentNullException(nameof(collection));
            }
            if (primeMeridian == null)
            {
                throw new ArgumentNullException(nameof(primeMeridian));
            }

            return(collection.Where(item => item.PrimeMeridian.Equals(primeMeridian)));
        }
Exemplo n.º 19
0
 private void cmbMeridian_SelectedIndexChanged(object sender, EventArgs e)
 {
     Proj4Meridian mer = (Proj4Meridian)Enum.Parse(typeof(Proj4Meridian), (string)cmbMeridian.SelectedItem);
     Meridian m = new Meridian(mer);
     _selectedProjectionInfo.GeographicInfo.Meridian = m;
     dbMeridian.Value = m.Longitude;
 }
Exemplo n.º 20
0
        ///<summary>
        /// Creates a <see cref="Projection"/> initialized from a PROJ.4 argument list.
        ///</summary>
        private Projection.Projection ParseProjection(IDictionary <String, String> parameters, Ellipsoid ellipsoid)
        {
            Projection.Projection projection = null;

            String s;

            if (parameters.TryGetValue(Proj4Keyword.proj, out s))
            {
                projection = registry.GetProjection(s, parameters);
            }

            if (projection == null)
            {
                throw new ArgumentException("Unknown projection: " + s);
            }

            projection.Ellipsoid = ellipsoid;

            // not sure what CSes use this??

            /*
             * s = (String)parameters.TryGetValue( "init" );
             * if ( s != null ) {
             * projection = CreateFromName( s ).getProjection();
             * if ( projection == null )
             *  throw new ProjectionException( "Unknown projection: "+s );
             *      a = projection.getEquatorRadius();
             *      es = projection.getEllipsoid().getEccentricitySquared();
             * }
             */


            //TODO: better error handling for things like bad number syntax.
            // Should be able to report the original param string in the error message
            // Also should the exception be lib specific?  (Say ParseException)

            // Other parameters
            //   projection.ProjectionLatitudeDegrees = 0;
            //   projection.ProjectionLatitude1Degrees = 0;
            //   projection.ProjectionLatitude2Degrees = 0;
            if (parameters.TryGetValue(Proj4Keyword.alpha, out s))
            {
                projection.AlphaDegrees = Double.Parse(s, CultureInfo.InvariantCulture);
            }

            if (parameters.TryGetValue(Proj4Keyword.lonc, out s))
            {
                projection.LonCDegrees = Double.Parse(s, CultureInfo.InvariantCulture);
            }

            if (parameters.TryGetValue(Proj4Keyword.lat_0, out s))
            {
                projection.ProjectionLatitudeDegrees = ParseAngle(s);
            }

            if (parameters.TryGetValue(Proj4Keyword.lon_0, out s))
            {
                projection.ProjectionLongitudeDegrees = ParseAngle(s);
            }

            if (parameters.TryGetValue(Proj4Keyword.lat_1, out s))
            {
                projection.ProjectionLatitude1Degrees = ParseAngle(s);
            }

            if (parameters.TryGetValue(Proj4Keyword.lat_2, out s))
            {
                projection.ProjectionLatitude2Degrees = ParseAngle(s);
            }

            if (parameters.TryGetValue(Proj4Keyword.lat_ts, out s))
            {
                projection.TrueScaleLatitudeDegrees = ParseAngle(s);
            }

            if (parameters.TryGetValue(Proj4Keyword.x_0, out s))
            {
                projection.FalseEasting = Double.Parse(s, CultureInfo.InvariantCulture);
            }

            if (parameters.TryGetValue(Proj4Keyword.y_0, out s))
            {
                projection.FalseNorthing = Double.Parse(s, CultureInfo.InvariantCulture);
            }

            if (!parameters.TryGetValue(Proj4Keyword.k_0, out s))
            {
                if (!parameters.TryGetValue(Proj4Keyword.k, out s))
                {
                    s = null;
                }
            }
            if (s != null)
            {
                projection.ScaleFactor = Double.Parse(s, CultureInfo.InvariantCulture);
            }

            if (parameters.TryGetValue(Proj4Keyword.units, out s))
            {
                Unit unit = Units.Units.FindUnit(s);
                // TODO: report unknown units name as error
                if (unit != null)
                {
                    projection.FromMetres = (1.0 / unit.Value);
                    projection.Unit       = unit;
                }
            }

            if (parameters.TryGetValue(Proj4Keyword.to_meter, out s))
            {
                projection.FromMetres = (1.0 / Double.Parse(s, CultureInfo.InvariantCulture));
            }

            if (parameters.ContainsKey(Proj4Keyword.south))
            {
                projection.SouthernHemisphere = true;
            }

            if (parameters.TryGetValue(Proj4Keyword.pm, out s))
            {
                double pm;
                projection.PrimeMeridian = double.TryParse(s, out pm)
                    ? Meridian.CreateByDegree(pm)
                    : Meridian.CreateByName(s);
            }

            //TODO: implement some of these parameters ?

            // this must be done last, since behaviour depends on other parameters being set (eg +south)
            if (projection is TransverseMercatorProjection)
            {
                if (parameters.TryGetValue("zone", out s))
                {
                    ((TransverseMercatorProjection)projection).UTMZone = int.Parse(s);
                }
            }

            projection.Initialize();

            return(projection);
        }