一:代码段(高德转百度) @Slf4j public class CoordinatesConvertUtil { private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0; /** * 高德地图坐标转化为百度坐标 * @param cordinatesVo */ public static MapCordinatesVo bd_encrypt(MapCordinatesVo cordinatesVo) { if(cordinatesVo.getLat() == null || cordinatesVo.getLon() == null) { log.info("地图坐标不能为空,{}", JSON.toJSONString(cordinatesVo)); return cordinatesVo; } log.info("地图坐标转化开始---》{}", JSON.toJSONString(cordinatesVo)); double x = cordinatesVo.getLon().doubleValue(), y = cordinatesVo.getLat().doubleValue(); double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi); double theta = atan2(y, x) + 0.000003 * cos(x * x_pi); double bd_lon = z * cos(theta) + 0.0065; double bd_lat = z * sin(theta) + 0.006; MapCordinatesVo mapCordinatesVo = new MapCordinatesVo(); BigDecimal lat = new BigDecimal(bd_lat); BigDecimal lon = new BigDecimal(bd_lon); mapCordinatesVo.setLat(lat.setScale(6, BigDecimal.ROUND_HALF_DOWN)); mapCordinatesVo.setLon(lon.setScale(6, BigDecimal.ROUND_HALF_DOWN)); log.info("地图坐标转换结束----》转化之前:{};转化之后:{}", JSON.toJSONString(cordinatesVo), JSON.toJSONString(mapCordinatesVo)); return mapCordinatesVo; } }
二:vo模型 @Data public class MapCordinatesVo extends BasePo { /** * 纬度 */ private BigDecimal lat; /** * 经度 */ private BigDecimal lon; } 三:百度坐标系转高德 public static void bd_decrypt(double bd_lat, double bd_lon) { double x = bd_lon - 0.0065, y = bd_lat - 0.006; double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi); double theta = atan2(y, x) - 0.000003 * cos(x * x_pi); double gg_lon = z * cos(theta); double gg_lat = z * sin(theta); BigDecimal lat = new BigDecimal(gg_lat); BigDecimal lon = new BigDecimal(gg_lon); System.out.println(bd_lat+","+bd_lon); System.out.println(gg_lat+","+gg_lon); System.out.println(lat.setScale(6, BigDecimal.ROUND_HALF_DOWN)+","+lon.setScale(6, BigDecimal.ROUND_HALF_DOWN)); }