文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-11-13 13:54

关注

Geotools

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

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

核心功能

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

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

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);
    }
 
    
    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);
    }
 
    
    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坐标转换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯