GpsUtil.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. using System;
  2. namespace SiteCore.helper
  3. {
  4. public class GpsUtil
  5. {
  6. public static double pi = 3.1415926535897932384626;
  7. public static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
  8. public static double a = 6378245.0;
  9. public static double ee = 0.00669342162296594323;
  10. public static double TransformLat(double x, double y)
  11. {
  12. double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
  13. + 0.2 * Math.Sqrt(Math.Abs(x));
  14. ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
  15. ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
  16. ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
  17. return ret;
  18. }
  19. public static double TransformLon(double x, double y)
  20. {
  21. double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1
  22. * Math.Sqrt(Math.Abs(x));
  23. ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
  24. ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
  25. ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0
  26. * pi)) * 2.0 / 3.0;
  27. return ret;
  28. }
  29. public static double[] transform(double lat, double lon)
  30. {
  31. if (OutOfChina(lat, lon))
  32. {
  33. return new double[] { lat, lon };
  34. }
  35. double dLat = TransformLat(lon - 105.0, lat - 35.0);
  36. double dLon = TransformLon(lon - 105.0, lat - 35.0);
  37. double radLat = lat / 180.0 * pi;
  38. double magic = Math.Sin(radLat);
  39. magic = 1 - ee * magic * magic;
  40. double SqrtMagic = Math.Sqrt(magic);
  41. dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * SqrtMagic) * pi);
  42. dLon = (dLon * 180.0) / (a / SqrtMagic * Math.Cos(radLat) * pi);
  43. double mgLat = lat + dLat;
  44. double mgLon = lon + dLon;
  45. return new double[] { mgLat, mgLon };
  46. }
  47. public static bool OutOfChina(double lat, double lon)
  48. {
  49. if (lon < 72.004 || lon > 137.8347)
  50. return true;
  51. if (lat < 0.8293 || lat > 55.8271)
  52. return true;
  53. return false;
  54. }
  55. /**
  56. * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System
  57. *
  58. * @param lat
  59. * @param lon
  60. * @return
  61. */
  62. public static double[] Gps84ToGcj02(double lat, double lon)
  63. {
  64. if (OutOfChina(lat, lon))
  65. {
  66. return new double[] { lat, lon };
  67. }
  68. double dLat = TransformLat(lon - 105.0, lat - 35.0);
  69. double dLon = TransformLon(lon - 105.0, lat - 35.0);
  70. double radLat = lat / 180.0 * pi;
  71. double magic = Math.Sin(radLat);
  72. magic = 1 - ee * magic * magic;
  73. double SqrtMagic = Math.Sqrt(magic);
  74. dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * SqrtMagic) * pi);
  75. dLon = (dLon * 180.0) / (a / SqrtMagic * Math.Cos(radLat) * pi);
  76. double mgLat = lat + dLat;
  77. double mgLon = lon + dLon;
  78. return new double[] { mgLat, mgLon };
  79. }
  80. /**
  81. * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return
  82. * */
  83. public static double[] Gcj02ToGps84(double lat, double lon)
  84. {
  85. double[] gps = transform(lat, lon);
  86. double lontitude = lon * 2 - gps[1];
  87. double latitude = lat * 2 - gps[0];
  88. return new double[] { latitude, lontitude };
  89. }
  90. /// <summary>
  91. /// 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标
  92. /// 高德谷歌转为百度
  93. /// </summary>
  94. /// <param name="lat"></param>
  95. /// <param name="lon"></param>
  96. /// <returns></returns>
  97. public static double[] Gcj02ToBd09(double lat, double lon)
  98. {
  99. double x = lon, y = lat;
  100. double z = Math.Sqrt(x * x + y * y) + 0.00002 * Math.Sin(y * x_pi);
  101. double theta = Math.Atan2(y, x) + 0.000003 * Math.Cos(x * x_pi);
  102. double tempLon = z * Math.Cos(theta) + 0.0065;
  103. double tempLat = z * Math.Sin(theta) + 0.006;
  104. double[] gps = { tempLat, tempLon };
  105. return gps;
  106. }
  107. /// <summary>
  108. /// 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标
  109. /// 百度坐标转为高德谷歌坐标
  110. /// </summary>
  111. /// <param name="lat"></param>
  112. /// <param name="lon"></param>
  113. /// <returns></returns>
  114. public static double[] Bd09ToGcj02(double lat, double lon)
  115. {
  116. double x = lon - 0.0065, y = lat - 0.006;
  117. double z = Math.Sqrt(x * x + y * y) - 0.00002 * Math.Sin(y * x_pi);
  118. double theta = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * x_pi);
  119. double tempLon = z * Math.Cos(theta);
  120. double tempLat = z * Math.Sin(theta);
  121. double[] gps = { tempLat, tempLon };
  122. return gps;
  123. }
  124. /// <summary>
  125. /// gps84转为bd09
  126. /// GPS坐标转为百度坐标
  127. /// </summary>
  128. /// <param name="lat"></param>
  129. /// <param name="lon"></param>
  130. /// <returns></returns>
  131. public static double[] Gps84ToBd09(double lat, double lon)
  132. {
  133. double[] gcj02 = Gps84ToGcj02(lat, lon);
  134. double[] bd09 = Gcj02ToBd09(gcj02[0], gcj02[1]);
  135. return bd09;
  136. }
  137. /// <summary>
  138. /// 百度坐标转成GPS坐标
  139. /// </summary>
  140. /// <param name="lat"></param>
  141. /// <param name="lon"></param>
  142. /// <returns></returns>
  143. public static double[] Bd09ToGps84(double lat, double lon)
  144. {
  145. double[] gcj02 = Bd09ToGcj02(lat, lon);
  146. double[] gps84 = Gcj02ToGps84(gcj02[0], gcj02[1]);
  147. //保留小数点后六位
  148. gps84[0] = Retain6(gps84[0]);
  149. gps84[1] = Retain6(gps84[1]);
  150. return gps84;
  151. }
  152. /// <summary>
  153. /// 保留小数点后六位
  154. /// </summary>
  155. /// <param name="num"></param>
  156. /// <returns></returns>
  157. private static double Retain6(double num)
  158. {
  159. String result = String.Format("%.6f", num);
  160. return Double.Parse(result);
  161. }
  162. }
  163. }