public class GisPointConversionUtil { private static final double x_pi = 52.35987755982988D; private static final double pi = 3.141592653589793D; private static final double a = 6378245.0D; private static final double ee = 0.006693421622965943D; public GisPointConversionUtil() { } //原始的转偏移的 public static PointBean wgs2gcj(PointBean wgsPoint) { if(outOfChina(wgsPoint)) { return wgsPoint; } else { PointBean gcjPoint = new PointBean(); double dLat = transformLat(wgsPoint.getLng() - 105.0D, wgsPoint.getLat() - 35.0D); double dLon = transformLon(wgsPoint.getLng() - 105.0D, wgsPoint.getLat() - 35.0D); double radLat = wgsPoint.getLat() / 180.0D * 3.141592653589793D; double magic = Math.sin(radLat); magic = 1.0D - 0.006693421622965943D * magic * magic; double sqrtMagic = Math.sqrt(magic); dLat = dLat * 180.0D / (6335552.717000426D / (magic * sqrtMagic) * 3.141592653589793D); dLon = dLon * 180.0D / (6378245.0D / sqrtMagic * Math.cos(radLat) * 3.141592653589793D); double lat = wgsPoint.getLat() + dLat; double lng = wgsPoint.getLng() + dLon; gcjPoint.setLat(lat); gcjPoint.setLng(lng); return gcjPoint; } } //偏移的转原始的 public static PointBean gcj2wgs(PointBean gcjPoint) { if(outOfChina(gcjPoint)) { return gcjPoint; } else { PointBean wgsPoint = new PointBean(); double dLat = transformLat(gcjPoint.getLng() - 105.0D, gcjPoint.getLat() - 35.0D); double dLon = transformLon(gcjPoint.getLng() - 105.0D, gcjPoint.getLat() - 35.0D); double radLat = gcjPoint.getLat() / 180.0D * 3.141592653589793D; double magic = Math.sin(radLat); magic = 1.0D - 0.006693421622965943D * magic * magic; double sqrtMagic = Math.sqrt(magic); dLat = dLat * 180.0D / (6335552.717000426D / (magic * sqrtMagic) * 3.141592653589793D); dLon = dLon * 180.0D / (6378245.0D / sqrtMagic * Math.cos(radLat) * 3.141592653589793D); double mgLat = gcjPoint.getLat() + dLat; double mgLon = gcjPoint.getLng() + dLon; double lon = gcjPoint.getLng() * 2.0D - mgLon; double lat = gcjPoint.getLat() * 2.0D - mgLat; wgsPoint.setLat(lat); wgsPoint.setLng(lon); return wgsPoint; } } private static boolean outOfChina(PointBean point) { return point.getLng() >= 72.004D && point.getLng() <= 137.8347D?point.getLat() < 0.8293D || point.getLat() > 55.8271D:true; } private static double transformLat(double x, double y) { double ret = -100.0D + 2.0D * x + 3.0D * y + 0.2D * y * y + 0.1D * x * y + 0.2D * Math.sqrt(Math.abs(x)); ret += (20.0D * Math.sin(6.0D * x * 3.141592653589793D) + 20.0D * Math.sin(2.0D * x * 3.141592653589793D)) * 2.0D / 3.0D; ret += (20.0D * Math.sin(y * 3.141592653589793D) + 40.0D * Math.sin(y / 3.0D * 3.141592653589793D)) * 2.0D / 3.0D; ret += (160.0D * Math.sin(y / 12.0D * 3.141592653589793D) + 320.0D * Math.sin(y * 3.141592653589793D / 30.0D)) * 2.0D / 3.0D; return ret; } private static double transformLon(double x, double y) { double ret = 300.0D + x + 2.0D * y + 0.1D * x * x + 0.1D * x * y + 0.1D * Math.sqrt(Math.abs(x)); ret += (20.0D * Math.sin(6.0D * x * 3.141592653589793D) + 20.0D * Math.sin(2.0D * x * 3.141592653589793D)) * 2.0D / 3.0D; ret += (20.0D * Math.sin(x * 3.141592653589793D) + 40.0D * Math.sin(x / 3.0D * 3.141592653589793D)) * 2.0D / 3.0D; ret += (150.0D * Math.sin(x / 12.0D * 3.141592653589793D) + 300.0D * Math.sin(x / 30.0D * 3.141592653589793D)) * 2.0D / 3.0D; return ret; } }
高德地图纠偏
最新推荐文章于 2024-05-14 10:49:40 发布