5d0abc884836c42c0c96fac51f63650812787ef3.svn-base 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package cn.com.goldenwater.dcproj.utils;
  2. import java.math.BigDecimal;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. /**
  6. * Created by guangyyh on 2019/1/28.
  7. */
  8. public class GeoUtil {
  9. /**
  10. * 经纬度转高德
  11. * */
  12. public static Map<String, Double> wgs84togcj02(double lng, double lat) {
  13. double dlat = transformlat(lng - 105.0, lat - 35.0);
  14. double dlng = transformlng(lng - 105.0, lat - 35.0);
  15. double radlat = lat / 180.0 * PI;
  16. double magic = Math.sin(radlat);
  17. magic = 1 - ee * magic * magic;
  18. double sqrtmagic = Math.sqrt(magic);
  19. dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
  20. dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
  21. double mglat = lat + dlat;
  22. double mglng = lng + dlng;
  23. Map<String, Double> d = new HashMap<>();
  24. BigDecimal declng = new BigDecimal(mglng);
  25. BigDecimal declat = new BigDecimal(mglat);
  26. mglng = declng.setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue();
  27. mglat = declat.setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue();
  28. d.put("lon", mglng);
  29. d.put("lat", mglat);
  30. return d;
  31. }
  32. public static Map<String, Double> gcj02towgs84(double lng, double lat) {
  33. double dlat = transformlat(lng - 105.0, lat - 35.0);
  34. double dlng = transformlng(lng - 105.0, lat - 35.0);
  35. double radlat = lat / 180.0 * PI;
  36. double magic = Math.sin(radlat);
  37. magic = 1 - ee * magic * magic;
  38. double sqrtmagic = Math.sqrt(magic);
  39. dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
  40. dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
  41. double mglat = lat + dlat;
  42. double mglng = lng + dlng;
  43. Map<String, Double> d = new HashMap<>(2);
  44. mglng = new BigDecimal(lng * 2 - mglng).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
  45. mglat = new BigDecimal(lat * 2 - mglat).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
  46. d.put("lon", mglng);
  47. d.put("lat", mglat);
  48. return d;
  49. }
  50. //定义一些常量
  51. private double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
  52. private static double PI = 3.1415926535897932384626;
  53. private static double a = 6378245.0;
  54. private static double ee = 0.00669342162296594323;
  55. public static double transformlng(double lng, double lat) {
  56. double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
  57. ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
  58. ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
  59. ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
  60. return ret;
  61. }
  62. public static double transformlat(double lng, double lat) {
  63. double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
  64. ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
  65. ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
  66. ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
  67. return ret;
  68. }
  69. }