Java Geotools坐标转换
洛阳泰山 人气:0Geotools
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)); }
加载全部内容