亲宝软件园·资讯

展开

Java Geotools坐标转换

洛阳泰山 人气:0

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);
    }
 
    /**
     * @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));
    }

加载全部内容

相关教程
猜你喜欢
用户评论