GeoPosition.cs
上传用户:huazai0421
上传日期:2008-05-30
资源大小:405k
文件大小:4k
源码类别:

SilverLight

开发平台:

C#

  1. // Silver.Globe, version 0.11 for Silverlight 1.1 Alpha
  2. // Copyright © Florian Krüsch (xaml-kru.com)
  3. // xaml-kru.com/silverglobe
  4. // This source is subject to the Microsoft Public License (Ms-PL).
  5. // See http://www.microsoft.com/resources/sharedsource/licensingbasics/publiclicense.mspx.
  6. // All other rights reserved.
  7. using System;
  8. using SilverGlobe.Math3D;
  9. namespace SilverGlobe.Data
  10. {
  11.     /// <summary>
  12.     /// Represents a geographical position with latitude and longitude.
  13.     /// </summary>
  14.     public struct GeoPosition
  15.     {
  16.         #region Members
  17.         private Double _longitude;
  18.         private  Double _latitude;
  19.         #endregion
  20.         #region Properties
  21.         public Double Longitude
  22.         {
  23.             get { return _longitude; }
  24.             set { _longitude = value; }
  25.         }
  26.         public Double Latitude
  27.         {
  28.             get { return _latitude; }
  29.             set { _latitude = value; }
  30.         }
  31.         public String LongitudeString
  32.         {
  33.             get
  34.             {
  35.                 Double absLong = Math.Abs(_longitude);
  36.                 Double deg = Math.Floor(absLong);
  37.                 Double min = Math.Floor(60 * (absLong - deg));
  38.                 return String.Format("{0:00}°{1:00}' {2}", deg, min, _longitude > 0 ? 'E' : 'W' );
  39.             }
  40.         }
  41.         public String LatitudeString
  42.         {
  43.             get
  44.             {
  45.                 Double absLat = Math.Abs(_latitude);
  46.                 Double deg = Math.Floor(absLat);
  47.                 Double min = Math.Floor(60 * (absLat - deg));
  48.                 return String.Format("{0:00}°{1:00}' {2}", deg, min, _latitude > 0 ? 'N' : 'S');
  49.             }
  50.         }
  51.         public Quaternion GetQuaternion()
  52.         {
  53.             Quaternion q1 = Quaternion.ForRotation(Vector3D.XAxis, _latitude);
  54.             Quaternion q2 = Quaternion.ForRotation(Vector3D.YAxis, _longitude - 90);
  55.             return q2 * q1;
  56.         }
  57.         #endregion
  58.         #region Constructor
  59.         public GeoPosition(Double latitude, Double longitude)
  60.         {
  61.             _longitude = longitude;
  62.             _latitude = latitude;
  63.         }
  64.         #endregion
  65.         #region Methods
  66.         /// <summary>
  67.         /// Convert a geographical position to a point on a 3D sphere with radius 1.
  68.         /// </summary>
  69.         public Point3D ToSphere()
  70.         {
  71.             return ToSphere(1);
  72.         }
  73.         /// <summary>
  74.         /// Convert a geographical position to a point on a 3D sphere with given radius.
  75.         /// </summary>
  76.         public Point3D ToSphere(Double radius)
  77.         {
  78.             Double longitudeRad = Longitude * Math.PI / 180d;
  79.             Double latitudeRad = Latitude * Math.PI / 180d;
  80.             Double y = radius * Math.Sin(latitudeRad);
  81.             Double r2 = radius * Math.Cos(latitudeRad);
  82.             Double x = r2 * Math.Cos(longitudeRad);
  83.             Double z = r2 * Math.Sin(longitudeRad);
  84.             return new Point3D(x, y, z);                                
  85.         }
  86.         #endregion
  87.         #region Equality
  88.         public override Boolean Equals(object obj)
  89.         {
  90.             if (!(obj is GeoPosition)) return false;
  91.             
  92.             return Equals((GeoPosition)obj);
  93.         }
  94.         public Boolean Equals(GeoPosition pos2)
  95.         {
  96.             return _longitude == pos2._longitude && _latitude == pos2._latitude;
  97.         }
  98.         public static Boolean operator ==(GeoPosition a, GeoPosition b)
  99.         {
  100.             return a._latitude == b._latitude && a._longitude == b._longitude;
  101.         }
  102.         public static Boolean operator !=(GeoPosition a, GeoPosition b)
  103.         {
  104.             return !(a == b);
  105.         }
  106.         public override Int32 GetHashCode()
  107.         {
  108.             return Longitude.GetHashCode() ^ Latitude.GetHashCode();
  109.         }
  110.         #endregion
  111.     }
  112. }