diff --git a/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/dto/LocateInfo.java b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/dto/LocateInfo.java new file mode 100644 index 0000000..63efaa8 --- /dev/null +++ b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/dto/LocateInfo.java @@ -0,0 +1,46 @@ +package com.elink.esua.epdc.commons.tools.dto; + +/** + * Created by wangmh on 2018/2/7. + * 定位的几个基本信息 + */ + +public class LocateInfo { + private double longitude; + private double Latitude; + private boolean isChina; + + public LocateInfo() { + + } + + public LocateInfo(double longitude, double latitude) { + this.longitude = longitude; + Latitude = latitude; + } + + public double getLongitude() { + return longitude; + } + + public void setLongitude(double longitude) { + this.longitude = longitude; + } + + public double getLatitude() { + return Latitude; + } + + public void setLatitude(double latitude) { + Latitude = latitude; + } + + public boolean isChina() { + return isChina; + } + + public void setChina(boolean china) { + isChina = china; + } +} + diff --git a/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/GCJ02_WGS84.java b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/GCJ02_WGS84.java new file mode 100644 index 0000000..83a0bab --- /dev/null +++ b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/GCJ02_WGS84.java @@ -0,0 +1,111 @@ +package com.elink.esua.epdc.commons.tools.utils; + +import com.alibaba.fastjson.JSON; +import com.elink.esua.epdc.commons.tools.dto.LocateInfo; + +/** + * @Description + * @Author yzm + * @Date 2023/6/2 11:03 + */ +public class GCJ02_WGS84 { + + public static double pi = 3.1415926535897932384626; + public static double a = 6378245.0; + public static double ee = 0.00669342162296594323; + + public static LocateInfo wgs84_To_Gcj02(double lat, double lon) { + LocateInfo info = new LocateInfo(); + if (outOfChina(lat, lon)) { + info.setChina(false); + info.setLatitude(lat); + info.setLongitude(lon); + }else { + double dLat = transformLat(lon - 105.0, lat - 35.0); + double dLon = transformLon(lon - 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); + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi); + double mgLat = lat + dLat; + double mgLon = lon + dLon; + info.setChina(true); + info.setLatitude(mgLat); + info.setLongitude(mgLon); + } + return info; + } + + public static LocateInfo gcj02_To_Wgs84(double lat, double lon) { + LocateInfo info = new LocateInfo(); + LocateInfo gps = transform(lat, lon); + double lontitude = lon * 2 - gps.getLongitude(); + double latitude = lat * 2 - gps.getLatitude(); + info.setChina(gps.isChina()); + info.setLatitude(latitude); + info.setLongitude(lontitude); + return info; + } + + private static boolean outOfChina(double lat, double lon) { + if (lon < 72.004 || lon > 137.8347) + return true; + if (lat < 0.8293 || lat > 55.8271) + return true; + return false; + } + + private static double transformLat(double x, double y) { + 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)); + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0; + return ret; + } + + private static double transformLon(double x, double y) { + double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 + * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0; + return ret; + } + + private static LocateInfo transform(double lat, double lon) { + LocateInfo info = new LocateInfo(); + if (outOfChina(lat, lon)) { + info.setChina(false); + info.setLatitude(lat); + info.setLongitude(lon); + return info; + } + double dLat = transformLat(lon - 105.0, lat - 35.0); + double dLon = transformLon(lon - 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); + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi); + double mgLat = lat + dLat; + double mgLon = lon + dLon; + info.setChina(true); + info.setLatitude(mgLat); + info.setLongitude(mgLon); + + return info; + } + + public static void main(String[] args) { + // 纬度 + double lat=36.1241380000; + // 经度 + double lon=120.4004700000; + LocateInfo locateInfo=gcj02_To_Wgs84(lat,lon); + System.out.println(JSON.toJSONString(locateInfo)); + } +}