当前位置: 首页 > 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…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...