【Java】WGS84转2000国家大地坐标系(CGCS2000)

引用Eclipse在github上的一个开源项目https://github.com/locationtech/proj4j

1. pom.xml引入依赖

<!-- https://mvnrepository.com/artifact/org.locationtech.proj4j/proj4j -->
<dependency><groupId>org.locationtech.proj4j</groupId><artifactId>proj4j</artifactId><version>1.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.locationtech.proj4j/proj4j-epsg -->
<dependency><groupId>org.locationtech.proj4j</groupId><artifactId>proj4j-epsg</artifactId><version>1.3.0</version>
</dependency>

2. 转换工具类定义

// 导包
import org.locationtech.proj4j.*;// 工具类定义
public class CoordinatesUtil {/*** WGS84->2000国家大地坐标系(CGCS2000)** @param longitude WGS84经度值* @param latitude WGS84纬度值* @return x,y CGCS2000经度值,CGCS2000纬度值*/public static String WGS84ToCGCS2000(double longitude, double latitude) {CRSFactory crsFactory = new CRSFactory();CoordinateReferenceSystem WGS84 = crsFactory.createFromName("epsg:4326");// 根据经度范围确定转换标准,具体EPSG定义参考https://epsg.ioString degree3EPSG = "epsg:4528";if (longitude < 76.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 25degree3EPSG = "epsg:4513";} else if (longitude >= 76.3 && longitude < 79.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 26degree3EPSG = "epsg:4514";} else if (longitude >= 79.3 && longitude < 82.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 27degree3EPSG = "epsg:4515";} else if (longitude >= 82.3 && longitude < 85.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 28degree3EPSG = "epsg:4516";} else if (longitude >= 85.3 && longitude < 88.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 29degree3EPSG = "epsg:4517";} else if (longitude >= 88.3 && longitude < 91.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 30degree3EPSG = "epsg:4518";} else if (longitude >= 91.3 && longitude < 94.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 31degree3EPSG = "epsg:4519";} else if (longitude >= 94.3 && longitude < 97.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 32degree3EPSG = "epsg:4520";} else if (longitude >= 97.3 && longitude < 100.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 33degree3EPSG = "epsg:4521";} else if (longitude >= 100.3 && longitude < 103.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 34degree3EPSG = "epsg:4522";} else if (longitude >= 103.3 && longitude < 106.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 35degree3EPSG = "epsg:4523";} else if (longitude >= 106.3 && longitude < 109.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 36degree3EPSG = "epsg:4524";} else if (longitude >= 109.3 && longitude < 112.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 37degree3EPSG = "epsg:4525";} else if (longitude >= 112.3 && longitude < 115.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 38degree3EPSG = "epsg:4526";} else if (longitude >= 115.3 && longitude < 118.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 39degree3EPSG = "epsg:4527";} else if (longitude >= 118.3 && longitude < 121.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 40degree3EPSG = "epsg:4528";} else if (longitude >= 121.3 && longitude < 124.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 41degree3EPSG = "epsg:4529";} else if (longitude >= 124.3 && longitude < 127.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 42degree3EPSG = "epsg:4530";} else if (longitude >= 127.3 && longitude < 130.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 43degree3EPSG = "epsg:4531";} else if (longitude >= 130.3 && longitude < 133.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 44degree3EPSG = "epsg:4532";} else if (longitude >= 133.3) {// CGCS2000 / 3-degree Gauss-Kruger zone 45degree3EPSG = "epsg:4533";}CoordinateReferenceSystem CGCS2000 = crsFactory.createFromName(degree3EPSG);// 定义转换FactoryCoordinateTransformFactory ctFactory = new CoordinateTransformFactory();CoordinateTransform wgs84ToCGCS2000 = ctFactory.createTransform(WGS84, CGCS2000);// 转换结果数据定义ProjCoordinate result = new ProjCoordinate();// 转换方法调用wgs84ToCGCS2000.transform(new ProjCoordinate(longitude, latitude), result);// 输出转换值: x前俩位表示的3度经度分带的中国区域内编号, x->longitude, y->latitudereturn BigDecimal.valueOf(result.x) + "," + BigDecimal.valueOf(result.y);}/*** 2000国家大地坐标系(CGCS2000)->WGS84* @param longitudeX CGCS2000经度值* @param latitudeY CGCS2000纬度值* @return x,y WGS84经度值,WGS84纬度值*/public static String CGCS2000ToWGS84(double longitudeX, double latitudeY) {String degree3No = String.valueOf(BigDecimal.valueOf(longitudeX)).substring(0, 2);CRSFactory crsFactory = new CRSFactory();CoordinateReferenceSystem WGS84 = crsFactory.createFromName("epsg:4326");// 根据精度范围换算使用坐标标准String degree3EPSG = "epsg:4528";switch (degree3No) {case "25":degree3EPSG = "epsg:4513";break;case "26":degree3EPSG = "epsg:4514";break;case "27":degree3EPSG = "epsg:4515";break;case "28":degree3EPSG = "epsg:4516";break;case "29":degree3EPSG = "epsg:4517";break;case "30":degree3EPSG = "epsg:4518";break;case "31":degree3EPSG = "epsg:4519";break;case "32":degree3EPSG = "epsg:4520";break;case "33":degree3EPSG = "epsg:4521";break;case "34":degree3EPSG = "epsg:4522";break;case "35":degree3EPSG = "epsg:4523";break;case "36":degree3EPSG = "epsg:4524";break;case "37":degree3EPSG = "epsg:4525";break;case "38":degree3EPSG = "epsg:4526";break;case "39":degree3EPSG = "epsg:4527";break;case "40":degree3EPSG = "epsg:4528";break;case "41":degree3EPSG = "epsg:4529";break;case "42":degree3EPSG = "epsg:4530";break;case "43":degree3EPSG = "epsg:4531";break;case "44":degree3EPSG = "epsg:4532";break;case "45":degree3EPSG = "epsg:4533";break;}CoordinateReferenceSystem CGCS2000 = crsFactory.createFromName(degree3EPSG);CoordinateTransformFactory ctFactory = new CoordinateTransformFactory();// 转换区别实际就这一行创建转换器的代码,前后顺序变了CoordinateTransform cgcs2000ToWGS84 = ctFactory.createTransform(CGCS2000, WGS84);ProjCoordinate result = new ProjCoordinate();cgcs2000ToWGS84.transform(new ProjCoordinate(longitudeX, latitudeY), result);return BigDecimal.valueOf(result.x) + "," + BigDecimal.valueOf(result.y);}// 转换测试, 实际作为工具类使用main方法直接删掉public static void main(String[] args) {System.out.println("Start Coordinate: ");System.out.println(WGS84ToCGCS2000(119.422295,31.71889));System.out.println(WGS84ToCGCS2000(113.974988,22.563086));System.out.println(CGCS2000ToWGS84(40445244.52773628,3510826.8681515823));System.out.println(CGCS2000ToWGS84(38497427.52755689,2496153.513361627));System.out.println("Coordinated.");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/630018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3的使用

一 Vue3的变化 1.性能的提升 打包大小减少41% 初次渲染快55%, 更新渲染快133% 内存减少54% 2.源码的升级 使用Proxy代替defineProperty实现响应式 重写虚拟DOM的实现和Tree-Shaking 3.拥抱TypeScript Vue3可以更好的支持TypeScript 4.新的特性 Composition API&#…

【UE 材质】简单的纹理失真、溶解效果

目录 1. 失真效果 2. 溶解效果 3. 失真溶解 我们一开始有这样一个纹理 1. 失真效果 其中纹理节点“DistortTexture”的纹理为引擎自带的纹理“T_Noise01”&#xff0c;我们可以通过控制参数“失真度”来控制纹理的失真程度 2. 溶解效果 3. 失真溶解

GoZero微服务微服务个人探究之路(五)部署微服务到k8s的一种最佳实践

需做工作 在每个微服务下面新建一个Dockerfile文件根据Dockerfile文件使用docker build指令&#xff0c;打包为具体的镜像&#xff08;根据自己需求选择&#xff09;将docker镜像上传到私人docker仓库或者是公共仓库&#xff0c;如果没有上传&#xff0c;则自动保存在本地编写…

openssl3.2 - 官方demo学习 - guide - quic-client-block.c

文章目录 openssl3.2 - 官方demo学习 - guide - quic-client-block.c概述笔记END openssl3.2 - 官方demo学习 - guide - quic-client-block.c 概述 在程序运行时, 要指定环境变量 SSL_CERT_FILErootcert.pem, 同时将rootcert.pem拷贝到工程目录下, 否则不好使 吐槽啊, 为啥不…

Centos7 安装Jenkins2.440

首先&#xff0c;确保您的CentOS 7系统已经安装了Java 11。您可以使用以下命令来安装Java 11&#xff1a; bash 从官网下载jdk11&#xff0c;例如&#xff1a;jdk-11.0.21_linux-x64_bin.tar.gz&#xff0c;使用命令tar -zxvf jdk-11.0.21_linux-x64_bin.tar.gz -C / 直接解压…

kafka简单介绍和代码示例

“这是一篇理论文章&#xff0c;给大家讲一讲kafka” 简介 在大数据领域开发者常常会听到MQ这个术语&#xff0c;该术语便是消息队列的意思&#xff0c; Kafka是分布式的发布—订阅消息系统。它最初由LinkedIn(领英)公司发布&#xff0c;使用Scala语言编写&#xff0c;与2010年…

HTML---Jquery选择器

文章目录 目录 文章目录 本章目标 一.Jquery选择器概述 二.Jquery选择器分类 基本选择器 层次选择器 属性选择器 三.基本过滤选择器 练习 本章目标 会使用基本选择器获取元素会使用层次选择器获取元素会使用属性选择器获取元素会使用过滤选择器获取元素 …

Mysql单行函数

文章目录 数值函数基本函数角度与弧度转化三角函数指数与对数进制间转换 字符串函数日期和时间函数获取日期、时间日期与时间戳的转换获取月份、星期、星期数、天数等函数日期的操作函数 时间和秒钟转换的函数计算日期和时间的函数日期的格式化与解析 流程控制函数加密与解密函…

SQL Server 数据类型

文章目录 一、文本类型&#xff08;字母、符号或数字字符的组合&#xff09;二、整数类型三、精确数字类型四、近似数字&#xff08;浮点&#xff09;类型五、日期类型六、货币类型七、位类型八、二进制类型 一、文本类型&#xff08;字母、符号或数字字符的组合&#xff09; 在…

【物联网】物联网设备和应用程序涉及协议的概述

物联网设备和应用程序涉及协议的概述。帮助澄清IoT层技术栈和头对头比较。 物联网涵盖了广泛的行业和用例&#xff0c;从单一受限制的设备扩展到大量跨平台部署嵌入式技术和实时连接的云系统。 将它们捆绑在一起是许多传统和新兴的通信协议&#xff0c;允许设备和服务器以新的…

奥伦德光电耦合器5G通信领域及其相关领域推荐

光电耦合器是以光为媒介传输电信号的一种电-光-电转换器件。由于该器件使用寿命长、工作温度范围宽&#xff0c;所以在过程控制、工业通信、家用电器、医疗设备、通信设备、计算机以及精密仪器等方面有着广泛应用在当前工艺技术持续发展与提升的过程中&#xff0c;其工作速度、…

java常见面试题:如何使用Java进行MyBatis框架开发?

MyBatis是一个优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息&#xff0c;将接口和Java的POJOs(Plain Old Java Objects,普通的Java…

新能源汽车智慧充电桩方案:如何实现充电停车智慧化管理?

一、方案概述 基于新能源汽车充电桩的监管运营等需求&#xff0c;安徽旭帆科技携手合作伙伴触角云共同打造“智能充电设备&#xff0b;云平台&#xff0b;APP小程序”一体化完整的解决方案&#xff0c;为充电桩车位场所提供精细化管理车位的解决办法&#xff0c;解决燃油车恶意…

用时序数据库 DolphinDB 搭建一套轻量化工业试验平台解决方案

DolphinDB 作为集成了高容量高速度流数据分析系统和强大编程语言的一站式解决方案&#xff0c;旨在为用户提供快速存储、检索、分析和计算庞大的结构化数据服务。本文将提供一个轻量化的工业试验平台数据处理解决方案&#xff0c;快速简单地实现海量数据采集、存储、处理和分析…

Spring MVC学习之——Controller类中方法的返回值

Controller类中方法的返回值 1.返回ModelAndView RequestMapping("/hello")public ModelAndView hello(){//封装了页面和数据ModelAndView view new ModelAndView();//对这个请求的页面添加属性&#xff08;数据&#xff09;view.addObject("hello",&quo…

HTML 列表 iframe

文章目录 列表无序列表有序列表自定义列表 iframe 引入外部页面 列表 列表 是 装载 结构 , 样式 一致的 文字 或 图表 的容器 ; 列表 由于其 整齐 , 整洁 , 有序 的特征 , 类似于表格 , 但是其 组合的自由程度高于表格 , 经常用来进行布局 ; HTML 列表包括如下类型 : 无序列…

【IAP】核心开发流程

最近做了IAP U盘升级模块开发&#xff0c;总结下IAP基本开发流程&#xff0c;不深入讨论原理。 详细原理参考 首先需要知道我们需要把之前的APP区域拆一块出来做BOOT升级程序区域。 以STM32F103为例&#xff0c;0x08000000到0x0807FFFF为FLASH空间&#xff0c;即上图代码区域…

Unity解决Udp客户端无法接收数据的问题

Unity解决Udp客户端无法接收数据的问题 在我之前做过的项目中&#xff0c;其中不少涉及Udp客户端的项目。在这些项目中&#xff0c;一般只需要实现客户端向服务器端发送数据的功能就可以了&#xff0c;一般都不用接收服务器端发送的数据&#xff0c;但是也有同学使用了我分享的…

vue-router之路由钩子函数应用解析

vue-router是vue开发中不可或缺的一部分&#xff0c;也是vue全家桶生态的重要部分&#xff0c;平时开发vue时会高频率使用&#xff0c;那么它除了在routes上的应用外&#xff0c;还有一些钩子函数具体可以应用在哪些地方呢 路由的钩子函数共有6个 全局的路由钩子函数&#xff…

DOM 的 diff 算法

经典面试题&#xff1a; 1&#xff09;react/vue中的 key 有什么作用&#xff1f;&#xff08;key的内部原理是什么&#xff1f;&#xff09; 2&#xff09;为什么遍历列表时&#xff0c;key 最好不用 index&#xff1f; 1、虚拟dom中key的作用&#xff1a; 1&#xff09; 简…