1、基于GeoTool实现空间坐标系转换
需要导入的包
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-swing</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
</dependency>
gt-swing JTS工具 gt-epsg-hsql 数据库用于获取proj4 jts-core geometry工具
详细代码
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.WKTReader;
import org.opengis.referencing.crs.CRSAuthorityFactory;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
public class GeomTransform {
/**
* 创建原Geo对象
* @param wkt 数据
* @param srid 坐标系
* @return {@link Geometry }
*/
public static Geometry createGeometry(String wkt, int srid){
if ("".equals(wkt)||null==wkt){
return null;
}
try {
WKTReader reader = new WKTReader();
Geometry geometry = reader.read(wkt);
geometry.setSRID(srid);
return geometry;
} catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 坐标系转换
* @param sourceGeometry 原数据
* @param targetSrid 目标坐标系
* @return {@link String }
*/
public static String coordinateTransform(Geometry sourceGeometry,int targetSrid){
if (sourceGeometry == null || sourceGeometry.getSRID() == 0 || targetSrid == 0){
return null;
}
try {
CRSAuthorityFactory factory = CRS.getAuthorityFactory(true);
CoordinateReferenceSystem source = factory.createCoordinateReferenceSystem("EPSG:" + sourceGeometry.getSRID());
CoordinateReferenceSystem target = factory.createCoordinateReferenceSystem("EPSG:" + targetSrid);
MathTransform transform = CRS.findMathTransform(source, target,true);
Geometry res = JTS.transform(sourceGeometry, transform);
if (res != null){
res.setSRID(targetSrid);
return res.toText();
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
Geometry geometry = createGeometry("point(120.1 30.1)", 4326);
System.out.println(coordinateTransform(geometry,4528));
}
}
结果
POINT (40509638.9420844 3331202.9450006895)
Process finished with exit code 0
注:该方法基于hsql数据库,实现了点、线、面等空间数据的坐标系转换
2、基于Proj4坐标系转换
导入包
<dependency>
<groupId>org.locationtech.proj4j</groupId>
<artifactId>proj4j</artifactId>
<version>1.3.0</version>
</dependency>
代码
import org.locationtech.proj4j.*;
public class HelloProj4J {
public static void main(String[] args) {
CRSFactory crsFactory = new CRSFactory();
//源坐标系统
//根据投影字符串参数获取坐标系统
String SourceCRS= "4524";
String SourceCRS_params="+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=GRS80 +units=m +no_defs";
CoordinateReferenceSystem source = crsFactory.createFromParameters(SourceCRS, SourceCRS_params);
//根据名称获取坐标系统
//CoordinateReferenceSystem source = crsFactory.createFromName("epsg:4524");
//目标坐标系统
//根据投影字符串参数获取坐标系统
String TargetCRS= "2334";
String TargetCRS_params="+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=IAU76 +units=m +no_defs";
CoordinateReferenceSystem target = crsFactory.createFromParameters(TargetCRS, TargetCRS_params);
//根据名称获取坐标系统
//CoordinateReferenceSystem target = crsFactory.createFromName("epsg:2334");
//定义转换类
CoordinateTransformFactory ctf = new CoordinateTransformFactory();
CoordinateTransform transform = ctf.createTransform(source, target);
//坐标系转换
ProjCoordinate projCoordinate = new ProjCoordinate(37360817.569479, 5127237.510467304);
//ProjCoordinate projCoordinate = new ProjCoordinate(119.0632442, 45.7414338);
transform.transform(projCoordinate, projCoordinate);
System.out.println("转换后x:"+projCoordinate.x);
System.out.println("转换后y:"+projCoordinate.y);
}
}
结果
转换后x:2.0660567671583917E7
转换后y:5069419.988666518
Process finished with exit code 0
该方法只能转换点坐标,线与面坐标转换需自己实现
3、基于GDAL
略
4、proj4与Wkid
| SRID | SRTEXT | PROJ4 |
|---|---|---|
| 3857 | PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",EAST],AXIS["Y",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] | +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs |
| 4326 | GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]] | +proj=longlat +datum=WGS84 +no_defs |
| 4490 | GEOGCS["China Geodetic Coordinate System 2000",DATUM["China_2000",SPHEROID["CGCS2000",6378137,298.257222101,AUTHORITY["EPSG","1024"]],AUTHORITY["EPSG","1043"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4490"]] | +proj=longlat +ellps=GRS80 +no_defs |
| 4528 | PROJCS["CGCS2000 / 3-degree Gauss-Kruger zone 40",GEOGCS["China Geodetic Coordinate System 2000",DATUM["China_2000",SPHEROID["CGCS2000",6378137,298.257222101,AUTHORITY["EPSG","1024"]],AUTHORITY["EPSG","1043"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4490"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",120],PARAMETER["scale_factor",1],PARAMETER["false_easting",40500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","4528"]] | +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=GRS80 +units=m +no_defs |
注:
- 1、坐标系太多不一 一展示
- 2、
PROJ4后面有空格复制时需要注意
proj4查找办法
1、基于Postgis数据库
SELECT * FROM spatial_ref_sys WHERE srid = 4326
2、基于网站 网站地址:epsg.io/4326
注:如果想看其他坐标系 讲网站地址4326改为对应的SRID
例如:4528坐标系:epsg.io/4528