package com.zy.bms.utils; /** * 坐标转换工具类 * 同芯片厂家提供一致 * * @author yang xiao kun * create on 2021/2/3 */ public class CoordTransformUtil { //定义一些常量 private static final double x_PI = 52.359877559829887;//3.14159265358979324 * 3000.0 / 180.0 private static final double PI = 3.1415926535897932384626; private static final double a = 6378245.0; private static final double ee = 0.00669342162296594323; /** * WGS84转GCj02 * * @param lng 经度 dd.dddd * @param lat 纬度 dd.dddd */ public static double[] wgs84toGcj02(double lng, double lat) { double dLat = transformLat(lng - 105.0, lat - 35.0); double dLng = transformLng(lng - 105.0, lat - 35.0); double radLat = lat / 180.0 * PI; double magic = Math.sin(radLat); magic = 1 - ee * magic * magic; double sqrtMagic = Math.sqrt(magic); dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI); dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * PI); double mgLat = lat + dLat; double mgLng = lng + dLng; return new double[]{mgLng, mgLat}; } /** * GCJ02 转换为 WGS84 * * @param lng 经度 dd.dddd * @param lat 纬度 dd.dddd */ public static double[] gcj02toWgs84(double lng, double lat) { double dLat = transformLat(lng - 105.0, lat - 35.0); double dLng = transformLng(lng - 105.0, lat - 35.0); double radLat = lat / 180.0 * PI; double magic = Math.sin(radLat); magic = 1 - ee * magic * magic; double sqrtMagic = Math.sqrt(magic); dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI); dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * PI); double mgLat = lat + dLat; double mgLng = lng + dLng; return new double[]{lng * 2 - mgLng, lat * 2 - mgLat}; } /** * 坐标格式转换 * ddmm.mmmm -> dd.dddd * * @param val 经纬度 */ public static String dm2dd(String val) { String[] varArr = String.valueOf(Double.parseDouble(val) / 100).split("\\."); double num1 = Double.parseDouble(varArr[0]); double num2 = Double.parseDouble("0." + varArr[1]) * 100 / 60; return String.valueOf(num1 + num2); } /** * 坐标格式转换 * dd.dddd -> ddmm.mmmm * * @param val 经纬度 */ public static String dd2dm(String val) { String[] varArr = val.split("\\."); double num1 = Double.parseDouble("0." + varArr[1]) * 60; double num2 = Double.parseDouble(varArr[0]) * 100 + num1; return String.valueOf(num2); } /** * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 * 即 百度 转 谷歌、高德 * * @param bd_lon 百度坐标系 经度 * @param bd_lat 百度坐标系 纬度 */ public static double[] bd09ToGcj02(double bd_lon, double bd_lat) { double x = bd_lon - 0.0065; double y = bd_lat - 0.006; double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI); double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI); double gg_lng = z * Math.cos(theta); double gg_lat = z * Math.sin(theta); return new double[]{gg_lng, gg_lat}; } /** * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 * 即谷歌、高德 转 百度 * * @param lng 经度 * @param lat 纬度 */ public static double[] gcj02toBd09(double lng, double lat) { double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI); double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI); double bd_lng = z * Math.cos(theta) + 0.0065; double bd_lat = z * Math.sin(theta) + 0.006; return new double[]{bd_lng, bd_lat}; } /** * 转换纬度 * * @param lng 经度 * @param lat 纬度 */ private static double transformLat(double lng, double lat) { 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)); ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; return ret; } /** * 转换经度 * * @param lng 经度 * @param lat 纬度 */ private static double transformLng(double lng, double lat) { double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; return ret; } }