Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换

2023-11-18

场景

Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示:

Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示_霸道流氓气质的博客-CSDN博客

在上面实现Java中集成Geotools之后,需求是将WKT数据转换成其他坐标系的WKT。

比如说将EPSG:4524的坐标系转换成EPSG:2334的坐标系数据。

当然如果是数据量较少,可以直接从WKT中复制出来单个点的数据在EPSG的官网进行转换。

EPSG.io: Coordinate Systems Worldwide

但是如果数据量较大,需要通过代码遍历的方式去转换大量数据。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

实现

1、用到ESPG的转换需要添加依赖

        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>24-SNAPSHOT</version>
        </dependency>

否则会提示:

No code "EPSG:4524" from authority "EPSG" found for object of type "EngineeringCRS"

上面也讲过需要设置geotools的仓库,所以完整的pom需要添加的内容

        <!-- GeoTools begin-->
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-shapefile</artifactId>
            <version>24-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-swing</artifactId>
            <version>24-SNAPSHOT</version>
        </dependency>
        <!-- GeoTools epsg  need -->
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>24-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <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>

    <!-- GeoTools end-->

2、然后新建类

import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.WKTWriter;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CRSAuthorityFactory;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;

public class WKTTransform {
    public static void main(String[] args) throws ParseException, FactoryException, TransformException {

        //要转换的wkt
        String oldWKT = "LINESTRING (37360817.569479 5127237.510467304, 37360830.13825466 5127118.315033647)";
        WKTReader wktReader = new WKTReader();
        //读取wkt为Geometry 几何对象
        Geometry oldGeometry = wktReader.read(oldWKT);
        //获取CRS权威工厂
        CRSAuthorityFactory crsAuthorityFactory = CRS.getAuthorityFactory(true);
        //创建sourceCRS
        CoordinateReferenceSystem sourceCRS = crsAuthorityFactory.createCoordinateReferenceSystem("EPSG:4524");
        //创建targetCRS
        CoordinateReferenceSystem targetCRS = crsAuthorityFactory.createCoordinateReferenceSystem("EPSG:2334");
        //获取MathTransform
        MathTransform mathTransform = CRS.findMathTransform(sourceCRS, targetCRS, true);
        //转换
        Geometry transform = JTS.transform(oldGeometry, mathTransform);
        //Geometry几何对象转换为WKT
        String newWKT = new WKTWriter().write(transform);
        System.out.println(newWKT);

    }
}

详细说明见代码实现。

相关api参考官方api文档

Overview (Geotools modules 30-SNAPSHOT API)

运行代码输出结果

注意这里转换的数据,将同样的坐标在EPSG网站上转换后对比

发现会存在0.00级别的误差数据。

3、如果以上0.00级别的误差都不能容忍的话,可以采用以下方式。

看一下epsg.io官网坐标系转换的接口,发现是无需任何鉴权,比如上面的转换对应的是get请求。

https://epsg.io/srs/transform/37360817.569479,5127237.510467304.json?key=default&s_srs=4524&t_srs=2334

所以另一种方式就是从WKT获取所有坐标,然后调用上面espg.io的接口进行转换,然后再将转换后的数据转成WKT。

具体流程自行实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换 的相关文章

  • 使用不同的组合器和累加器进行流缩减的示例

    问题是关于java util stream Stream reduce U identity BiFunction
  • Spring MVC 中的 CSRF(跨站请求伪造)保护

    我对春季的 CSRF 跨站请求伪造 保护有点困惑 不 我有我的 jsp 我的控制器和一个 Web 服务 我想要做的是在 Web 服务级别验证令牌 如果令牌匹配 则运行 Web 服务 在我的例子中执行数据库插入 JSP file
  • Spring boot 404错误自定义错误响应ReST

    我正在使用 Spring boot 来托管 REST API 即使浏览器正在访问 URL 以及自定义数据结构 我也希望始终发送 JSON 响应 而不是使用标准错误响应 我可以使用 ControllerAdvice 和 ExceptionHa
  • ORMLite - join where 子句中的括号

    我想使用连接三个表QueryBuilder join and QueryBuilder joinor但我想在 where 子句中添加括号 如下所示 WHERE first table where AND second table where
  • BigDecimal 中 Divide 方法的 Scale()

    new BigDecimal 37146555 53880000 divide new BigDecimal 1000000 scale 这返回10 但根据API divide method 返回一个 BigDecimal 其值为 这个 除
  • 使用用户名进行 Java LDAP 身份验证

    好吧 这让我发疯 我正在尝试使用 Java 创建 LDAP 身份验证 如果我在 SECURITY PRINCIPAL 中使用我的名字和姓氏 一切都很好 这是我的代码 try Hashtable
  • IntelliJ Idea,如何从控制台删除java文件目录?

    当您运行文件时 它会打开控制台窗口 并且一直在顶部显示该文件所在的目录 这非常令人恼火 因为现在 为了将其他行与目录混合分开 我必须在启动任何 System out println 命令之前使用 n C Program FILEs 我想摆脱
  • JSF 错误 - IllegalStateException:PWC3999:提交响应后无法创建会话[重复]

    这个问题在这里已经有答案了 我是 JSF 新手 正在构建一个使用 Facelet 创建的应用程序 这是我的模板master xhtml
  • 在Tomcat中设置环境变量TESSDATA_PREFIX

    我们正在使用名为 Tess4J 的 Tesseract OCR Java 库 如果作为独立应用程序运行 它可以正常工作 它需要一个名为 TESSDATA PREFIX 的变量 其中包含 tessdata 配置和其他字符集相关文件 它也可以与
  • Android 防火墙与 VpnService

    我正在尝试使用 BS 项目的 VpnService 为 Android 实现一个简单的防火墙 我选择 VpnService 因为它将在非 root 设备上运行 它将记录连接并让您过滤连接 基于IP 有一个应用程序可以做到这一点 因此这是可能
  • JavaFX 动画使用循环?

    我正在尝试制作一款类似太空侵略者的游戏 我画了一个正方形 我想通过使用循环逐步向下移动它thread sleep 然而 正方形立即被绘制出来 我知道有可以使用的动画路径 但我想保持低水平并仅使用坐标系 有没有办法使用这样的循环来制作时间轴动
  • Java Timer 类:如果其中一个任务抛出异常,则计时器任务停止执行

    new Timer scheduleAtFixedRate new TimerTask Override public void run System out println run throw new SomeRandomExceptio
  • 在 Java/GWT 中解析用户时间输入

    解析用户在 GWT 中的文本字段中键入的时间的最佳方法是什么 默认时间格式要求用户完全按照区域设置指定的时间格式输入时间 我想要更加灵活 因为用户可以通过多种不同的方式输入时间 例如 8 8p 8pm 8 15pm 13 15 1315 1
  • 在 Spring 和 SPeL 中使用 @Value 注释

    我正在尝试找到一种方法在我的 Spring Boot 1 5 应用程序中执行以下操作 我有一个变量 其值是动态的 这意味着它来自外部系统 String name abc gets set externally 我想尝试使用名称的值来查找我的
  • SecurityContextHolder.getContext().getAuthentication() 返回 null

    我想使用以下代码手动绕过 spring Security 的用户 User localeUser new User UsernamePasswordAuthenticationToken auth new UsernamePasswordA
  • 在SPRING BOOT中配置多个数据库

    我正在尝试为我的 Spring Boot 应用程序连接 2 个不同的数据库 但出现此错误 应用程序无法启动 描述 com SyncFibertToolSpring SyncFibertTool MydbDB Config MydbDbCon
  • 为什么我的 Java 路径中添加了“L”?

    我在我的类路径中加载了一个 jar 在 iReport 中 如果重要的话 我确信它具有所需的方法 但是当我尝试测试连接 从而调用该 jar 时 我得到一个 java lang NoSuchMethodError 说它正在引用班上 Lorg
  • 需要同步仅增量计数器吗?

    我使用整数作为计数器 该整数只会增加 并且肯定有多个线程会同时增加它 当没有其他线程尝试访问其值时 在程序执行结束时读取该计数器的值 我假设我不必为这种仅增量计数器使用锁或任何类型的同步 这是正确的吗 如果这有什么区别的话 我用 Java
  • 丰富:数据表行跨度问题

    我需要创建一个 rich dataTable 甚至扩展 具有以下功能 我有一个公司类 其中包含产品对象的集合 我想展示下表 我仍然没有弄清楚如何使用子表执行此操作 在所有示例中 我发现子表具有与主表完全相同的列 据推测 我需要在前两列中使用
  • 如何获取 res.drawable 文件夹的路径来复制文件?

    我正在编写我的应用程序AndroidStudio 我的里面有gif文件drawable gifs文件夹 我希望将该文件复制到MediaStore Images Media单击按钮后的文件夹 目前 即使使用发布的一些答案 我也无法获取我的 g

随机推荐