This commit is contained in:
Looly 2022-12-27 22:26:11 +08:00
parent 73da439198
commit ed5bbe716e
2 changed files with 22 additions and 31 deletions

View File

@ -135,19 +135,6 @@ public class CoordinateUtil {
//----------------------------------------------------------------------------------- Private methods begin //----------------------------------------------------------------------------------- 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)转换的偏移算法非精确 * WGS84 火星坐标系 (GCJ-02)转换的偏移算法非精确
* *
@ -179,12 +166,13 @@ public class CoordinateUtil {
* 计算经度坐标 * 计算经度坐标
* *
* @param lng 经度坐标 * @param lng 经度坐标
* @param lat 度坐标 * @param lat 度坐标
* @return ret 计算完成后的 * @return ret 计算完成后的
*/ */
private static double transLng(final double lng, final double lat) { 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)); 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; ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
return ret; return ret;
} }
@ -193,12 +181,14 @@ public class CoordinateUtil {
* 计算纬度坐标 * 计算纬度坐标
* *
* @param lng 经度 * @param lng 经度
* @param lat * @param lat
* @return ret 计算完成后的 * @return ret 计算完成后的
*/ */
private static double transLat(final double lng, final double lat) { 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)); double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat
ret += transCore(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; ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
return ret; return ret;
} }

View File

@ -14,35 +14,36 @@ public class CoordinateUtilTest {
@Test @Test
public void wgs84ToGcj02Test() { public void wgs84ToGcj02Test() {
final CoordinateUtil.Coordinate coordinate = CoordinateUtil.wgs84ToGcj02(116.404, 39.915); 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); Assert.assertEquals(39.91640428150164D, coordinate.getLat(), 0);
} }
@Test @Test
public void gcj02ToWgs84Test() { public void gcj02ToWgs84Test() {
final CoordinateUtil.Coordinate coordinate = CoordinateUtil.gcj02ToWgs84(116.404, 39.915); 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); Assert.assertEquals(39.91359571849836D, coordinate.getLat(), 0);
} }
@Test @Test
public void wgs84toBd09Test() { public void wgs84toBd09Test() {
final CoordinateUtil.Coordinate coordinate = CoordinateUtil.wgs84ToBd09(116.404, 39.915); final CoordinateUtil.Coordinate coordinate = CoordinateUtil.wgs84ToBd09(116.404, 39.915);
Assert.assertEquals(116.41671695444782D, coordinate.getLng(), 0); Assert.assertEquals(116.41662724378733D, coordinate.getLng(), 0);
Assert.assertEquals(39.922698713521726D, coordinate.getLat(), 0); Assert.assertEquals(39.922699552216216D, coordinate.getLat(), 0);
} }
@Test @Test
public void wgs84toBd09Test2() { public void wgs84toBd09Test2() {
final CoordinateUtil.Coordinate coordinate = CoordinateUtil.wgs84ToBd09(122.99395597, 44.99804071); // https://tool.lu/coordinate/
final CoordinateUtil.Coordinate coordinate = CoordinateUtil.wgs84ToBd09(122.99395597D, 44.99804071D);
Assert.assertEquals(123.00636516028885D, coordinate.getLng(), 0); Assert.assertEquals(123.00636516028885D, coordinate.getLng(), 0);
Assert.assertEquals(45.00636909189589D, coordinate.getLat(), 0); Assert.assertEquals(45.0063690918959D, coordinate.getLat(), 0);
} }
@Test @Test
public void bd09toWgs84Test() { public void bd09toWgs84Test() {
final CoordinateUtil.Coordinate coordinate = CoordinateUtil.bd09toWgs84(116.404, 39.915); 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); Assert.assertEquals(39.907253214522164D, coordinate.getLat(), 0);
} }