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

 更新时间:2022年08月01日 10:50:38   作者:洛阳泰山  
GeoTools 是一个开源的 Java GIS 工具包,可利用它来开发符合标准的地理信息系统。本文将利用工具包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进阶教程之IO基础

    Java进阶教程之IO基础

    这篇文章主要介绍了Java进阶教程之IO基础,这里只是对Java IO的基本介绍,包含读取和写入等操作,需要的朋友可以参考下
    2014-09-09
  • SpringMVC 拦截器的使用示例

    SpringMVC 拦截器的使用示例

    这篇文章主要介绍了SpringMVC 拦截器的使用示例,帮助大家更好的理解和学习使用SpringMVC,感兴趣的朋友可以了解下
    2021-04-04
  • 浅谈Java解释器模式

    浅谈Java解释器模式

    这篇文章主要介绍了Java基于解释器模式实现定义一种简单的语言功能,简单描述了解释器模式的概念、功能及Java使用解释器模式定义一种简单语言的相关实现与使用技巧,需要的朋友可以参考下
    2021-10-10
  • 【Redis缓存机制】详解Java连接Redis_Jedis_事务

    【Redis缓存机制】详解Java连接Redis_Jedis_事务

    这篇文章主要介绍了【Redis缓存机制】详解Java连接Redis_Jedis_事务,详细的介绍了Jedis事务和实例,有兴趣的可以了解一下。
    2016-12-12
  • Zookeeper连接超时问题与拒绝连接的解决方案

    Zookeeper连接超时问题与拒绝连接的解决方案

    今天小编就为大家分享一篇关于Zookeeper连接超时问题与拒绝连接的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

    自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

    这篇文章主要介绍了自定义注解和springAOP捕获Service层异常,并处理自定义异常操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java线程中的ThreadLocal原理及源码解析

    Java线程中的ThreadLocal原理及源码解析

    这篇文章主要介绍了Java线程中的ThreadLocal原理及源码解析,ThreadLocal 的作用是为每个线程保存一份局部变量的引用,实现多线程之间的数据隔离,从而避免了线程不安全情况的发生,需要的朋友可以参考下
    2023-12-12
  • 详解使用Spring3 实现用户登录以及权限认证

    详解使用Spring3 实现用户登录以及权限认证

    这篇文章主要介绍了详解使用Spring3 实现用户登录以及权限认证,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2017-03-03
  • Java19新特性虚拟线程的具体使用

    Java19新特性虚拟线程的具体使用

    Java 19 引入了虚拟线程,这是 JDK Project Loom 项目中的重要新特性,目的是简化 Java 中的并发编程,并提高线程管理的效率和性能,下面就来具体介绍下
    2024-09-09
  • IDEA如何修改项目名称出现中括号

    IDEA如何修改项目名称出现中括号

    当项目文件夹名称与model名称不一致时,IDEA会在项目名旁显示中括号以区分,修改项目名称时出现中括号问题,通常是因为IDE中model名与文件夹名不同步,解决方法是统一model名称和文件夹名称,可通过重构功能或项目结构设置完成,重命名操作应谨慎,以避免路径等引用错误
    2024-10-10

最新评论