空间数据坐标系转换(GIS坐标系转换)

602 阅读4分钟

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

SRIDSRTEXTPROJ4
3857PROJCS["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
4326GEOGCS["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
4490GEOGCS["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
4528PROJCS["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

image.png

2、基于网站 网站地址:epsg.io/4326

注:如果想看其他坐标系 讲网站地址4326改为对应的SRID

例如:4528坐标系:epsg.io/4528

image.png