当前位置: 首页 > news >正文

使用Java实现度分秒坐标转十进制度的实践

目录

前言

一、度分秒的使用场景

1、表示方法

2、两者的转换方法

3、区别及使用场景

二、Java代码转换的实现

1、确定计算值的符号

2、数值的清洗

3、度分秒转换

4、转换实例

三、总结


前言

        在地理信息系统(GIS)、导航、测绘等领域,精确地表示和转换地理位置坐标是一项基本而重要的任务。地理坐标通常以经度和纬度的形式表示,它们可以采用度分秒(DMS)或十进制度(DD)两种格式。度分秒是一种传统的表示方式,它将角度分为度、分和秒,而十进制度则以小数形式直接表示角度,更便于计算机处理。随着技术的发展,十进制度因其精确性和便捷性在现代应用中越来越受到青睐。

        在实际应用中,经常需要将度分秒格式的坐标转换为十进制度,以便于进行计算和数据处理。例如,在GIS软件中,地图的坐标系统可能需要统一为十进制度以提高计算效率;在航海和航空领域,虽然传统上使用度分秒,但在与现代导航系统集成时,也需要转换为十进制度。因此,掌握度分秒到十进制度的转换方法对于相关领域的专业人士来说是一项必备技能。

        本文将介绍如何使用Java编程语言实现度分秒坐标到十进制度的转换。我们将从坐标转换的基本概念入手,详细阐述转换的数学原理,并提供一个简洁、高效的Java实现方案。通过实际代码示例,展示如何在Java中处理度分秒格式的字符串,将其分解为度、分、秒,并计算出对应的十进制度数值。此外,我们还将讨论可能遇到的一些常见问题,如精度处理和异常情况的处理,并提供解决方案。

        通过阅读本文,读者将能够理解度分秒和十进制度之间的转换原理,并掌握使用Java进行坐标转换的实用技能。这不仅有助于提高读者在GIS、导航等领域的专业能力,也为处理地理坐标数据提供了一个强有力的工具。随着地理信息技术的不断发展,掌握这些基本技能将变得越来越重要。

一、度分秒的使用场景

        在介绍度分秒的坐标向十进制度之前,我们首先来看看度分秒位置表示的使用场景。坐标位置点是用来确定地球表面上一个特定地点的地理坐标系统。这些坐标通常以经度和纬度来表示,它们可以以不同的格式表达,包括度分秒(DMS)和十进制度(DD)。

1、表示方法

        度分秒是一种传统的表示地理坐标的方式,它将角度分为度、分和秒。

  • 度(Degree):地球圆周被分为360度,每度进一步分为60分。
  • 分(Minute):每一度被分为60分,每分等于1/60度。
  • 秒(Second):每一分被分为60秒,每秒等于1/60分。

        在度分秒格式中,一个坐标点可以表示为:度°分′秒″。例如,一个坐标点可以写作 50°16′36″N(北纬50度16分36秒)和 68°1′12″W(西经68度1分12秒)。众所周知,与度分秒不同的还有经纬度的表达方式。十进制度是一种更现代的表示地理坐标的方式,它直接以小数形式表示角度。在十进制度格式中,一个坐标点可以表示为:度.分。例如,上述的50°46′36″可以表示为50.2676667°。

2、两者的转换方法

        将度分秒转换为十进制度,可以使用以下公式:

十进制度=度+分/60+秒/(60*60),将上面的50°16′36″的位置转为经纬度位置计算过程为:50+16/60+36/3600=50+0.266666+0.01=50.26766。而转换后的值就是我们可以直接在一些前端组件或者后端应用中直接使用的值。

3、区别及使用场景

        两者的区别:        

        精确度:十进制度可以提供更高的精确度,因为它可以表示到小数点后很多位。易读性:度分秒格式对于非专业人士来说可能更直观,因为它模拟了传统的测量方式。 计算:在进行地理计算时,十进制度通常更方便,因为它避免了度、分、秒之间的转换。

        应用场景
        航海和航空:由于历史原因,航海和航空领域仍然广泛使用度分秒格式。地图和GIS:现代地图制作和地理信息系统(GIS)通常使用十进制度,因为它与计算机系统兼容性更好。科学和工程:在需要高精度的科学和工程领域,十进制度是首选。在航海的应用方面,我们经常在海事局的官方网站上看到的都是度分秒的坐标形式。

新设32 HAO DUN虚拟AIS航标,位置: 24-30.88N  118-14.20E;MMSI: 994136577;航标类型:东方位标;发射模式:自主连续;播发间隔:3分钟。  新设33 HAO DUN虚拟AIS航标,位置:24-30.89N  118-14.25E;MMSI: 994126460;航标类型:西方位标;发射模式:自主连续;播发间隔:3分钟。请过往船舶注意 

二、Java代码转换的实现

         Java作为一种广泛使用的编程语言,以其跨平台性、高性能和丰富的库支持,在处理地理坐标转换方面具有天然优势。通过Java实现度分秒到十进制度的转换,不仅可以提高开发效率,还可以保证转换过程的准确性和可靠性。此外,Java的面向对象特性使得转换程序易于维护和扩展,便于集成到更复杂的系统中。因此本小节将重点介绍如何使用Java来实现度分秒和十进制度的转换。

1、确定计算值的符号

        众所周知,在地理系统中,纬度有南纬和北纬;经度有东经和西经的区别。这是一个360度组成的球形。因此我们在进行坐标计算的时候,要考虑这种天然的位置符号关系。比如在表示西经100度时,用十进制数表达时就需要添加一个负号。而东经是不需要的。然而,可能用来表示东经和北纬的除了用英文的模式,还可能使用英文的模式,即N、W、E、S等。由于标注习惯的不同,有的用户或者系统喜欢把标注符号放在前面,也有喜欢标注在后面。这些都是可以的。但是要想实现统一的坐标转换,我们要可以识别上述的标志,能在最终的结果中进行符号的添加。

        为了实现上面的需求,我们先来定义两个字符串数字。一个是正数的经纬度标识字符串,另外一个是负数的经纬度标识字符串。代码如下所示:

private static final String [] LAT_LON = {"E","N","东经","北纬"};//正常经纬度单位private static final String [] NEGATIVE_LAT_LON = {"W","S","西经","南纬"}; // 需要转为负数的经纬度单位

        在进行字符转换时,尤其是负号的数值转换时,我们首先需要判断在传入的坐标位置中包含了标识符,代码如下:

/*** - 检查经纬度字符串中是否包含负数的坐标* @param jwd* @return*/public static boolean checkFlag(String jwd) {if(StringUtils.isEmpty(jwd)) {return false;}boolean result = false;for(String sign : NEGATIVE_LAT_LON) {int index = jwd.trim().indexOf(sign);if(index >= 0) {result = true;break;}}return result;
}

2、数值的清洗

        在经过经纬度的数值符号计算之后,就可以将这些标记字符串去掉,只保留下来需要分割计算的具体度分秒值。数据清洗的方法简单,循环我们的正常经纬度标记数组和负数经纬度数组,最后再替换标准的冒号和非标准的冒号。得到最终清洗之后的字符串就是我们清洗之后的值。

/*** - 经纬度数据清洗* @param jwd* @return*/public static String jwdClearn(String jwd) {if(StringUtils.isEmpty(jwd)) {return jwd;}String result = jwd;//循环进行正数据处理for(String sign : LAT_LON) {result = result.replace(sign, "");}//循环进行负数据处理for(String sign : NEGATIVE_LAT_LON) {result = result.replace(sign, "");}result = result.replace(":", "").replace(":", "");return result;}

3、度分秒转换

        掌握了数值符号的判定和数据清洗之后,下面就可以对清洗之后的数值进行坐标转换。转换的计算方法就是第一节中提到的计算方法。本身没有很难的实现逻辑,因此在这里不进行详细的介绍。直接贴出实现的代码,最后返回的值之前,需要根据符号的判断,返回对应的值。

/*** -经纬度转化,度分秒转度.* -如:108°13′21″= 108.2225* @param jwd* @return*/public static String DmsTurnDD(String jwd) {boolean negativeSign = false;if (Strings.isNotEmpty(jwd) && (jwd.contains("°"))) {//如果不为空并且存在度单位//负数标记negativeSign = checkFlag(jwd);//计算前进行数据处理//jwd = jwd.replace("E", "").replace("N", "").replace(":", "").replace(":", "");jwd = jwdClearn(jwd);double d = 0, m = 0, s = 0;d = Double.parseDouble(jwd.split("°")[0]);//不同单位的分,可扩展if (jwd.contains("′")) {//正常的′m = Double.parseDouble(jwd.split("°")[1].split("′")[0]);} else if (jwd.contains("'")) {//特殊的'm = Double.parseDouble(jwd.split("°")[1].split("'")[0]);}//不同单位的秒,可扩展if (jwd.contains("″")) {//正常的″//有时候没有分 如:112°10.25″s = jwd.contains("′") ? Double.parseDouble(jwd.split("′")[1].split("″")[0]) : Double.parseDouble(jwd.split("°")[1].split("″")[0]);} else if (jwd.contains("''")) {//特殊的''//有时候没有分 如:112°10.25''s = jwd.contains("'") ? Double.parseDouble(jwd.split("'")[1].split("''")[0]) : Double.parseDouble(jwd.split("°")[1].split("''")[0]);}jwd = String.valueOf(d + m / 60 + s / 60 / 60);//计算并转换为string}return negativeSign ? "-" + jwd : jwd;}

4、转换实例

        为了验证上述的度分秒坐标是否正确的进行了转换,下面我们来编写测试代码。测试不同的度分秒坐标转为十进制坐标的方法。我们分别将经纬度的标记写成中文和英文的都有,同时在具体的度分秒值的前面和后面都有。以此来测试程序的稳定性和可靠性。

public static void main(String[] args) {List<String> latlonList = new ArrayList<String>();latlonList.add("北纬15°08.1′");latlonList.add("东经117°50.9′");latlonList.add("北纬15°07.4′");latlonList.add("东经117°50.8′");latlonList.add("33°25'4.68\"S");latlonList.add("15°08.1′南纬");latlonList.add("117°50.9′西经");latlonList.add("东经117°50.8′");latlonList.add("南纬15°08.1′");latlonList.add("W15°08.1′");latlonList.add("E15°08.1′");latlonList.add("65°08.1′N");latlonList.add("68°08.1′");latlonList.add("115°51.9′");latlonList.add("25°15′26\"N");latlonList.add("120°29′20\"E");latlonList.add("24°50′30\"N");latlonList.add("E120°05′45\"");latlonList.add("25°04′32\"N");latlonList.add("119°51′22\"E");latlonList.add("S25°28′12\"");latlonList.add("W120°14′30\"");latlonList.add("50°16′36″");for(String latlon : latlonList) {System.out.println(latlon + "\t===>\t" +CoordinateUtil.DmsTurnDD(latlon));}}

        接下来在程序控制台中看一下转换的输出结果。

        可以看到所有的度分秒坐标均已经正常的进行转换,同时你可以使用计算机进行验证计算结果是否正确。 

三、总结

        以上就是本文的主要内容,本文将介绍如何使用Java编程语言实现度分秒坐标到十进制度的转换。我们将从坐标转换的基本概念入手,详细阐述转换的数学原理,并提供一个简洁、高效的Java实现方案。通过实际代码示例,展示如何在Java中处理度分秒格式的字符串,将其分解为度、分、秒,并计算出对应的十进制度数值。行文仓促,难免有许多不足之处,如有不足,还恳请各位专家朋友在评论区不吝赐教,不胜感激。

相关文章:

使用Java实现度分秒坐标转十进制度的实践

目录 前言 一、度分秒的使用场景 1、表示方法 2、两者的转换方法 3、区别及使用场景 二、Java代码转换的实现 1、确定计算值的符号 2、数值的清洗 3、度分秒转换 4、转换实例 三、总结 前言 在地理信息系统&#xff08;GIS&#xff09;、导航、测绘等领域&#xff0c…...

根据后台数据结构,构建搜索目录树

效果图&#xff1a; 数据源 const data [{"categoryidf": "761525000288210944","categoryids": "766314364226637824","menunamef": "经济运行","menunames": "经济运行总览","tempn…...

食品计算—FoodSAM: Any Food Segmentation

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

2411rust,1.83

原文 1.83.0稳定版 新的常能力 此版本包括几个说明在常环境中运行代码可干的活的大型扩展.这是指编译器在编译时必须计算的所有代码:常和静项的初值,数组长度,枚举判定值,常模板参数及可从(constfn)此类环境调用的函数. 引用静.当前,除了静项的初化器式外,禁止常环境引用静…...

tomcat加载三方包顺序

共享库 tomcat支持多个webapp共享一个三方库&#xff0c;而不需要每个webapp都引入该三方库 tomcat加载类顺序 bootstrap&#xff1a;加载jvm提供的类system&#xff1a;加载$CATALINA_HOME/bin下的bootstrap.jar,commons-daemon.jar,tomcat-juli.jar三个包//加载$CLASSPATH…...

计算机的错误计算(一百七十一)

摘要 探讨 MATLAB 中秦九韶&#xff08;Horner&#xff09;多项式的错误计算。 例1. 用秦九韶&#xff08;Horner&#xff09;算法计算&#xff08;一百零七&#xff09;例1中多项式 直接贴图吧&#xff1a; 这样&#xff0c;MATLAB 给出的仍然是错误结果&#xff0c;因为准…...

js对于json的序列化、反序列化有哪几种方法

在JavaScript中&#xff0c;对JSON&#xff08;JavaScript Object Notation&#xff09;进行序列化&#xff08;将对象转换为JSON字符串&#xff09;和反序列化&#xff08;将JSON字符串转换为对象&#xff09;是常见的操作。以下是一些常用的方法&#xff1a; 序列化&#xf…...

Linux——基础命令(2) 文件内容操作

目录 ​编辑 文件内容操作 1.Vim &#xff08;1&#xff09;移动光标 &#xff08;2&#xff09;复制 &#xff08;3&#xff09;剪切 &#xff08;4&#xff09;删除 &#xff08;5&#xff09;粘贴 &#xff08;6&#xff09;替换,撤销,查找 &#xff08;7&#xff…...

简单搭建qiankun的主应用和子应用并且用Docker进行服务器部署

在node18环境下&#xff0c;用react18创建qiankun主应用和两个子应用&#xff0c;react路由用V6版本&#xff0c;都在/main路由下访问子应用&#xff0c;用Dockerfile部署到腾讯云CentOS7.6服务器的8000端口进行访问&#xff0c;且在部署过程中进行nginx配置以进行合理的路由访…...

Python知识分享第十六天

“”" 故事7: 小明把煎饼果子技术传给徒弟的同时, 不想把独创配方传给他, 我们就要加私有. 问: 既然不想让子类用, 为什么要加私有? 答: 私有的目的不是不让子类用, 而是不让子类直接用, 而必须通过特定的 途径或者方式才能使用. 大白话: ATM机为啥要设计那么繁琐, 直接…...

管家婆财贸ERP BR045.大类存货库存数量明细表

最低适用版本&#xff1a; C系列 23.8 插件简要功能说明&#xff1a; 库存数量明细表支持按存货展示数据更多细节描述见下方详细文档 插件操作视频&#xff1a; 进销存类定制插件--大类存货库存数量明细表 插件详细功能文档&#xff1a; 应用中心增加菜单【大类存货库存数…...

Pytorch-GPU版本离线安装

最近在复现一项深度学习的工作&#xff0c;发现自己的pytorch是装的cpu版的(好像当时是直接加清华源&#xff0c;默认是cpu版本&#xff09;。从官网在线下载速度太慢&#xff0c;还时不时断开连接&#xff0c;我们可以配置conda的清华源去这个问题&#xff0c;但是考虑到是在用…...

k8s 1.28 二进制安装与部署

第一步 &#xff1a;配置Linux服务器 #借助梯子工具 192.168.196.100 1C8G kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubectl、haproxy、keepalived 192.168.196.101 1C8G kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubectl、…...

【C语言】扫雷游戏(一)

我们先设计一个简单的9*9棋盘并有10个雷的扫雷游戏。 1&#xff0c;可以用数组存放&#xff0c;如果有雷就用1表示&#xff0c;没雷就用0表示。 2&#xff0c;排查(2,5)这个坐标时&#xff0c;我们访问周围的⼀圈8个位置黄色统计周围雷的个数是1。排查(8,6)这个坐标时&#xf…...

二分法篇——于上下边界的扭转压缩间,窥见正解辉映之光(1)

前言 二分法&#xff0c;这一看似简单却又充满哲理的算法&#xff0c;犹如一道精巧的数学之门&#xff0c;带领我们在问题的迷雾中找到清晰的道路。它的名字虽简单&#xff0c;却深藏着智慧的光辉。在科学的浩瀚星空中&#xff0c;二分法如一颗璀璨的星辰&#xff0c;指引着我们…...

# 01_Python基础到实战一飞冲天(三)--python面向对象(一)--简单类

01_Python基础到实战一飞冲天&#xff08;三&#xff09;–python面向对象&#xff08;一&#xff09;–简单类 一、面向对象-01-基本概念 1、面向对象(OOP) 面向对象编程 —— Object Oriented Programming 简写 OOP。 2、面向对象(OOP) 学习目标 了解 面向对象 基本概念…...

sentinel使用手册

1.引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>2.yaml spring:cloud:sentinel:transport:dashboard: localhost:8090 #sentinel控制台地址…...

搜索二维矩阵 II(java)

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 代码思路&#xff1a; 用暴力算法&#xff1a; class Solution {public boolean searchMatrix(…...

Python语法基础(四)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 高阶函数之map 高阶函数就是说&#xff0c;A函数作为B函数的参数&#xff0c;B函数就是高阶函数 map&#xff1a;映射 map(func,iterable) 这个是map的基本语法&#xff0c;…...

03_Django视图

三、Django模板 模板Templates 在Django框架中&#xff0c;模板是可以帮助开发者快速生成呈现给用户页面的工具 模板的设计方式实现了我们MVT中VT的解耦(M:Model&#xff0c;V:View&#xff0c;T:Template)&#xff0c;VT有着N:M的关系&#xff0c;一个V可以调用任意T&#xf…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...