From ed5bbe716e4b4cc15714a016fd1eafadd45d66cf Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 27 Dec 2022 22:26:11 +0800 Subject: [PATCH] fix bug --- .../cn/hutool/core/util/CoordinateUtil.java | 26 ++++++------------ .../hutool/core/util/CoordinateUtilTest.java | 27 ++++++++++--------- 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/CoordinateUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/CoordinateUtil.java index ee35e6c0c..6760e50a1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/CoordinateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/CoordinateUtil.java @@ -135,19 +135,6 @@ public class CoordinateUtil { //----------------------------------------------------------------------------------- Private methods begin - /** - * 转换坐标公共核心 - * - * @param lng 经度坐标 - * @param lat 维度坐标 - * @return 返回结果 - */ - private static double transCore(final double lng, final double lat) { - double 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; - return ret; - } - /** * WGS84 与 火星坐标系 (GCJ-02)转换的偏移算法(非精确) * @@ -179,12 +166,13 @@ public class CoordinateUtil { * 计算经度坐标 * * @param lng 经度坐标 - * @param lat 维度坐标 + * @param lat 纬度坐标 * @return ret 计算完成后的 */ private static double transLng(final double lng, final 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 += transCore(lng, lat); + 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; } @@ -193,12 +181,14 @@ public class CoordinateUtil { * 计算纬度坐标 * * @param lng 经度 - * @param lat 维度 + * @param lat 纬度 * @return ret 计算完成后的 */ private static double transLat(final double lng, final 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 += transCore(lng, 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; } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/CoordinateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/CoordinateUtilTest.java index 8fa4e5ec3..f034b70dc 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/CoordinateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/CoordinateUtilTest.java @@ -12,37 +12,38 @@ import org.junit.Test; public class CoordinateUtilTest { @Test - public void wgs84ToGcj02Test(){ + public void wgs84ToGcj02Test() { final CoordinateUtil.Coordinate coordinate = CoordinateUtil.wgs84ToGcj02(116.404, 39.915); - Assert.assertEquals(116.41033392216508D, coordinate.getLng(), 0); + Assert.assertEquals(116.41024449916938D, coordinate.getLng(), 0); Assert.assertEquals(39.91640428150164D, coordinate.getLat(), 0); } @Test - public void gcj02ToWgs84Test(){ + public void gcj02ToWgs84Test() { final CoordinateUtil.Coordinate coordinate = CoordinateUtil.gcj02ToWgs84(116.404, 39.915); - Assert.assertEquals(116.39766607783491D, coordinate.getLng(), 0); + Assert.assertEquals(116.39775550083061D, coordinate.getLng(), 0); Assert.assertEquals(39.91359571849836D, coordinate.getLat(), 0); } @Test - public void wgs84toBd09Test(){ + public void wgs84toBd09Test() { final CoordinateUtil.Coordinate coordinate = CoordinateUtil.wgs84ToBd09(116.404, 39.915); - Assert.assertEquals(116.41671695444782D, coordinate.getLng(), 0); - Assert.assertEquals(39.922698713521726D, coordinate.getLat(), 0); + Assert.assertEquals(116.41662724378733D, coordinate.getLng(), 0); + Assert.assertEquals(39.922699552216216D, coordinate.getLat(), 0); } @Test - public void wgs84toBd09Test2(){ - final CoordinateUtil.Coordinate coordinate = CoordinateUtil.wgs84ToBd09(122.99395597, 44.99804071); + public void wgs84toBd09Test2() { + // https://tool.lu/coordinate/ + final CoordinateUtil.Coordinate coordinate = CoordinateUtil.wgs84ToBd09(122.99395597D, 44.99804071D); Assert.assertEquals(123.00636516028885D, coordinate.getLng(), 0); - Assert.assertEquals(45.00636909189589D, coordinate.getLat(), 0); + Assert.assertEquals(45.0063690918959D, coordinate.getLat(), 0); } @Test - public void bd09toWgs84Test(){ + public void bd09toWgs84Test() { final CoordinateUtil.Coordinate coordinate = CoordinateUtil.bd09toWgs84(116.404, 39.915); - Assert.assertEquals(116.39129143419822D, coordinate.getLng(), 0); + Assert.assertEquals(116.3913836995125D, coordinate.getLng(), 0); Assert.assertEquals(39.907253214522164D, coordinate.getLat(), 0); } @@ -54,7 +55,7 @@ public class CoordinateUtilTest { } @Test - public void bd09toGcj02Test(){ + public void bd09toGcj02Test() { final CoordinateUtil.Coordinate coordinate = CoordinateUtil.bd09ToGcj02(116.404, 39.915); Assert.assertEquals(116.39762729119315D, coordinate.getLng(), 0); Assert.assertEquals(39.90865673957631D, coordinate.getLat(), 0);