引用Eclipse在github上的一个开源项目https://github.com/locationtech/proj4j
1. pom.xml引入依赖
<!-- https://mvnrepository.com/artifact/org.locationtech.proj4j/proj4j -->
<dependency><groupId>org.locationtech.proj4j</groupId><artifactId>proj4j</artifactId><version>1.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.locationtech.proj4j/proj4j-epsg -->
<dependency><groupId>org.locationtech.proj4j</groupId><artifactId>proj4j-epsg</artifactId><version>1.3.0</version>
</dependency>
2. 转换工具类定义
// 导包
import org.locationtech.proj4j.*;// 工具类定义
public class CoordinatesUtil {/*** WGS84->2000国家大地坐标系(CGCS2000)** @param longitude WGS84经度值* @param latitude WGS84纬度值* @return x,y CGCS2000经度值,CGCS2000纬度值*/public static String WGS84ToCGCS2000(double longitude, double latitude) {CRSFactory crsFactory = new CRSFactory();CoordinateReferenceSystem WGS84 = crsFactory.createFromName("epsg:4326");// 根据经度范围确定转换标准,具体EPSG定义参考https://epsg.ioString degree3EPSG = "epsg:4528";if (longitude < 76.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 25degree3EPSG = "epsg:4513";} else if (longitude >= 76.3 && longitude < 79.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 26degree3EPSG = "epsg:4514";} else if (longitude >= 79.3 && longitude < 82.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 27degree3EPSG = "epsg:4515";} else if (longitude >= 82.3 && longitude < 85.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 28degree3EPSG = "epsg:4516";} else if (longitude >= 85.3 && longitude < 88.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 29degree3EPSG = "epsg:4517";} else if (longitude >= 88.3 && longitude < 91.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 30degree3EPSG = "epsg:4518";} else if (longitude >= 91.3 && longitude < 94.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 31degree3EPSG = "epsg:4519";} else if (longitude >= 94.3 && longitude < 97.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 32degree3EPSG = "epsg:4520";} else if (longitude >= 97.3 && longitude < 100.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 33degree3EPSG = "epsg:4521";} else if (longitude >= 100.3 && longitude < 103.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 34degree3EPSG = "epsg:4522";} else if (longitude >= 103.3 && longitude < 106.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 35degree3EPSG = "epsg:4523";} else if (longitude >= 106.3 && longitude < 109.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 36degree3EPSG = "epsg:4524";} else if (longitude >= 109.3 && longitude < 112.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 37degree3EPSG = "epsg:4525";} else if (longitude >= 112.3 && longitude < 115.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 38degree3EPSG = "epsg:4526";} else if (longitude >= 115.3 && longitude < 118.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 39degree3EPSG = "epsg:4527";} else if (longitude >= 118.3 && longitude < 121.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 40degree3EPSG = "epsg:4528";} else if (longitude >= 121.3 && longitude < 124.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 41degree3EPSG = "epsg:4529";} else if (longitude >= 124.3 && longitude < 127.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 42degree3EPSG = "epsg:4530";} else if (longitude >= 127.3 && longitude < 130.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 43degree3EPSG = "epsg:4531";} else if (longitude >= 130.3 && longitude < 133.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 44degree3EPSG = "epsg:4532";} else if (longitude >= 133.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 45degree3EPSG = "epsg:4533";}CoordinateReferenceSystem CGCS2000 = crsFactory.createFromName(degree3EPSG);// 定义转换FactoryCoordinateTransformFactory ctFactory = new CoordinateTransformFactory();CoordinateTransform wgs84ToCGCS2000 = ctFactory.createTransform(WGS84, CGCS2000);// 转换结果数据定义ProjCoordinate result = new ProjCoordinate();// 转换方法调用wgs84ToCGCS2000.transform(new ProjCoordinate(longitude, latitude), result);// 输出转换值: x前俩位表示的3度经度分带的中国区域内编号, x->longitude, y->latitudereturn BigDecimal.valueOf(result.x) + "," + BigDecimal.valueOf(result.y);}/*** 2000国家大地坐标系(CGCS2000)->WGS84* @param longitudeX CGCS2000经度值* @param latitudeY CGCS2000纬度值* @return x,y WGS84经度值,WGS84纬度值*/public static String CGCS2000ToWGS84(double longitudeX, double latitudeY) {String degree3No = String.valueOf(BigDecimal.valueOf(longitudeX)).substring(0, 2);CRSFactory crsFactory = new CRSFactory();CoordinateReferenceSystem WGS84 = crsFactory.createFromName("epsg:4326");// 根据精度范围换算使用坐标标准String degree3EPSG = "epsg:4528";switch (degree3No) {case "25":degree3EPSG = "epsg:4513";break;case "26":degree3EPSG = "epsg:4514";break;case "27":degree3EPSG = "epsg:4515";break;case "28":degree3EPSG = "epsg:4516";break;case "29":degree3EPSG = "epsg:4517";break;case "30":degree3EPSG = "epsg:4518";break;case "31":degree3EPSG = "epsg:4519";break;case "32":degree3EPSG = "epsg:4520";break;case "33":degree3EPSG = "epsg:4521";break;case "34":degree3EPSG = "epsg:4522";break;case "35":degree3EPSG = "epsg:4523";break;case "36":degree3EPSG = "epsg:4524";break;case "37":degree3EPSG = "epsg:4525";break;case "38":degree3EPSG = "epsg:4526";break;case "39":degree3EPSG = "epsg:4527";break;case "40":degree3EPSG = "epsg:4528";break;case "41":degree3EPSG = "epsg:4529";break;case "42":degree3EPSG = "epsg:4530";break;case "43":degree3EPSG = "epsg:4531";break;case "44":degree3EPSG = "epsg:4532";break;case "45":degree3EPSG = "epsg:4533";break;}CoordinateReferenceSystem CGCS2000 = crsFactory.createFromName(degree3EPSG);CoordinateTransformFactory ctFactory = new CoordinateTransformFactory();// 转换区别实际就这一行创建转换器的代码,前后顺序变了CoordinateTransform cgcs2000ToWGS84 = ctFactory.createTransform(CGCS2000, WGS84);ProjCoordinate result = new ProjCoordinate();cgcs2000ToWGS84.transform(new ProjCoordinate(longitudeX, latitudeY), result);return BigDecimal.valueOf(result.x) + "," + BigDecimal.valueOf(result.y);}// 转换测试, 实际作为工具类使用main方法直接删掉public static void main(String[] args) {System.out.println("Start Coordinate: ");System.out.println(WGS84ToCGCS2000(119.422295,31.71889));System.out.println(WGS84ToCGCS2000(113.974988,22.563086));System.out.println(CGCS2000ToWGS84(40445244.52773628,3510826.8681515823));System.out.println(CGCS2000ToWGS84(38497427.52755689,2496153.513361627));System.out.println("Coordinated.");}
}