Java利用Geotools实现不同坐标系之间坐标转换

GeoTools是一个开源的JavaGIS工具包,可利用它来开发符合标准的地理信息系统。本文将利用工具包Geotools实现不同坐标系之间坐标转换,感兴趣的可以了解一下

Geotools

GeoTools 是一个开源的 Java GIS 工具包,可利用它来开发符合标准的地理信息系统。GeoTools 提供了 OGC (Open Geospatial Consortium) 规范的一个实现来作为他们的开发。

GeoTools 被许多项目使用,包括 Web 服务,命令行工具和桌面应用程序。

核心功能

1.定义关键空间概念和数据结构的接口

  • Java 拓扑套件(JTS)提供的集成几何支持
  • 使用 OGC 过滤器编码规范的属性和空间过滤器

2.干净的数据访问 API,支持功能访问,事务支持和线程之间的锁定

  • 以多种文件格式和空间数据库访问 GIS 数据
  • 坐标参考系统和转换支持
  • 处理广泛的地图投影
  • 根据空间和非空间属性过滤和分析数据

4.无状态的低内存渲染器,在服务器端环境中特别有用。

  • 撰写和显示样式复杂的地图
  • 供应商扩展,可以更好地控制文本标签和颜色混合

5.使用 XML 模式绑定到 GML 内容的强大模式辅助解析技术

解析 / 编码技术提供了许多 OGC 标准的绑定,包括 GML,Filter,KML,SLD 和 SE。

6.GeoTools 插件:开放式插件系统,可让您教授库其他格式

用于 ImageIO-EXT 项目的插件,允许 GeoTools 从 GDAL 读取其他栅格格式

7.GeoTools 扩展

提供使用核心库的空间设施构建的其他功能。

扩展提供图形和网络支持(用于查找最短路径),验证,Web 地图服务器客户端,用于 XML 解析和编码的绑定以及颜色调制器!

8.不支持 GeoTools

GeoTools 也是更广泛的社区的一部分,其工作区用于培养新人才和促进实验。

一些重点包括摇摆支持(在我们的教程中使用!),SWT,本地和 Web 流程支持,附加符号,附加数据格式,网格的生成以及 ISO Geometry 的一些实现。

maven配置

我们将首先定义我们希望使用的 GeoTools 的版本号。本工作手册是为 28-SNAPSHOT 编写的,尽管您可能希望尝试不同的版本。

对于生产, geotools.version应该使用 28 的稳定版本:

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <geotools.version>28-SNAPSHOT</geotools.version>
    <maven.deploy.skip>true</maven.deploy.skip>
  </properties>

我们指定以下依赖项(您的应用程序需要的 GeoTools 模块):

        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-main</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>${geotools.version}</version>
        </dependency>

我们告诉 maven 从哪些存储库下载 jars:

  <repositories>
    <repository>
    <id>osgeo</id>
    <name>OSGeo Release Repository</name>
    <url>https://repo.osgeo.org/repository/release/</url>
    <snapshots><enabled>false</enabled></snapshots>
    <releases><enabled>true</enabled></releases>
    </repository>
    <repository>
    <id>osgeo-snapshot</id>
    <name>OSGeo Snapshot Repository</name>
    <url>https://repo.osgeo.org/repository/snapshot/</url>
    <snapshots><enabled>true</enabled></snapshots>
    <releases><enabled>false</enabled></releases>
    </repository>
  </repositories>

代码工具

import lombok.extern.slf4j.Slf4j;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.locationtech.jts.geom.Coordinate;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
 
import java.math.BigDecimal;
 
@Slf4j
public class GisUtil {
 
    public static void main(String[] args) throws FactoryException, TransformException {
        bjz54ToCgcs2000( 39440999.301,3631381.649);
    //    bjz54ToCgcs2000( 39446227.146,3626791.679);
    }
 
    /**
     * @param x 源坐标x
     * @param y 源坐标y
     * @Description: 坐标系转换-北京54投影转国家2000投影
     */
    public static Coordinate bjz54ToCgcs2000(double x ,double y){
        Coordinate tgtCoordinate= coordinateTransform(2415,4527, y, x);
        double tx=new BigDecimal(tgtCoordinate.x).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
        double ty=new BigDecimal(tgtCoordinate.y).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
        log.info(ty+","+tx);
        tgtCoordinate.setX(ty);
        tgtCoordinate.setY(tx);
        return tgtCoordinate;
    }
 
    public static Coordinate bjz54ToCgcs2000(Coordinate p){
        return bjz54ToCgcs2000(p.x, p.y);
    }
 
    /**
     * @param srcNo 源坐标系EPSG代号
     * @param targetNo 目标坐标系EPSG代号
     * @param x 源坐标x
     * @param y 源坐标y
     * @Description: 坐标系转换 
     */
    public static Coordinate coordinateTransform(int srcNo, int targetNo, double x , double y){
        Coordinate tar=new Coordinate();
        try {
            CoordinateReferenceSystem src = CRS.decode("EPSG:"+srcNo);
            CoordinateReferenceSystem target = CRS.decode("EPSG:"+targetNo);
            MathTransform transform = CRS.findMathTransform(src, target, true);
            Coordinate sour= new Coordinate(x, y);
           return JTS.transform(sour, tar, transform);
        } catch (FactoryException | TransformException  e) {
            log.error(e.getMessage());
        }
        return tar;
 
    }
}

注:计算结果和测量软件的结果有2米的误差,用org.locationtech.proj4j工具包 计算的结果误差更大,有几十米。后续突出用pgis转换的办法误差在1毫米之间。

使用示例

    @ApiOperation(value = "坐标系转换北京54-国家2000")
    @GetMapping(value = "/bjz54ToCgcs2000")
    public ResponseDTO<Coordinate> bjz54ToCgcs2000(@RequestBody Coordinate dto){
        return ResponseDTO.succData(GisUtil.bjz54ToCgcs2000(dto));
    }

到此这篇关于Java利用Geotools实现不同坐标系之间坐标转换的文章就介绍到这了,更多相关Java Geotools坐标转换内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!

本文标题为:Java利用Geotools实现不同坐标系之间坐标转换

基础教程推荐