LocationConverter.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace Hotline.Tools;
  7. public static class LocationConverter
  8. {
  9. private const double Pi = Math.PI;
  10. private const double A = 6378245.0;
  11. private const double Ee = 0.006693421622965943;
  12. public static (double lat, double lon) Wgs84ToGcj02(double lat, double lon)
  13. {
  14. double dLat = TransformLat(lon - 105.0, lat - 35.0);
  15. double dLon = TransformLon(lon - 105.0, lat - 35.0);
  16. double radLat = lat / 180.0 * Pi;
  17. double magic = Math.Sin(radLat);
  18. magic = 1.0 - Ee * magic * magic;
  19. double sqrtMagic = Math.Sqrt(magic);
  20. dLat = dLat * 180.0 / A * (1.0 - Ee) / magic * sqrtMagic * Pi;
  21. dLon = dLon * 180.0 / A / sqrtMagic * Math.Cos(radLat) * Pi;
  22. double mgLat = lat + dLat;
  23. double mgLon = lon + dLon;
  24. return (mgLat, mgLon);
  25. }
  26. public static (double lat, double lon) Gcj02ToWgs84(double lat, double lon)
  27. {
  28. var gps = Transform(lat, lon);
  29. double lontitude = lon * 2.0 - gps.lon;
  30. double latitude = lat * 2.0 - gps.lat;
  31. return (latitude, lontitude);
  32. }
  33. private static double TransformLat(double x, double y)
  34. {
  35. double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
  36. ret += (20.0 * Math.Sin(6.0 * x * Pi) + 20.0 * Math.Sin(2.0 * x * Pi)) * 2.0 / 3.0;
  37. ret += (20.0 * Math.Sin(y * Pi) + 40.0 * Math.Sin(y / 3.0 * Pi)) * 2.0 / 3.0;
  38. ret += (160.0 * Math.Sin(y / 12.0 * Pi) + 320.0 * Math.Sin(y * Pi / 30.0)) * 2.0 / 3.0;
  39. return ret;
  40. }
  41. private static double TransformLon(double x, double y)
  42. {
  43. double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
  44. ret += (20.0 * Math.Sin(6.0 * x * Pi) + 20.0 * Math.Sin(2.0 * x * Pi)) * 2.0 / 3.0;
  45. ret += (20.0 * Math.Sin(x * Pi) + 40.0 * Math.Sin(x / 3.0 * Pi)) * 2.0 / 3.0;
  46. ret += (150.0 * Math.Sin(x / 12.0 * Pi) + 300.0 * Math.Sin(x / 30.0 * Pi)) * 2.0 / 3.0;
  47. return ret;
  48. }
  49. private static (double lat, double lon) Transform(double lat, double lon)
  50. {
  51. double dLat = TransformLat(lon - 105.0, lat - 35.0);
  52. double dLon = TransformLon(lon - 105.0, lat - 35.0);
  53. double radLat = lat / 180.0 * Pi;
  54. double magic = Math.Sin(radLat);
  55. magic = 1.0 - Ee * magic * magic;
  56. double sqrtMagic = Math.Sqrt(magic);
  57. dLat = dLat * 180.0 / A * (1.0 - Ee) / magic * sqrtMagic * Pi;
  58. dLon = dLon * 180.0 / A / sqrtMagic * Math.Cos(radLat) * Pi;
  59. double mgLat = lat + dLat;
  60. double mgLon = lon + dLon;
  61. return (mgLat, mgLon);
  62. }
  63. }