Spring Boot集成geodesy实现距离计算

1.什么是geodesy?

浩瀚的宇宙中,地球是我们赖以生存的家园。自古以来,人类一直对星球上的位置和彼此的距离着迷。无论是航海探险、贸易往来还是科学研究,精确计算两个地点之间的距离都是至关重要的。 Geodesy:大地测量学的神奇力量 Geodesy,又称大地测量学,是一门研究地球形状、大小及其重力场的学科。在地球距离计算中,它扮演着至关重要的角色。Geodesy 的原理基于球面几何。 首先,Geodesy 将地球近似为一个光滑的球体。然后,根据经纬度坐标,将两个地点视为球面上的两点。最后,使用球面距离公式:

d = R * arccos(sin(φ1) * sin(φ2) + cos(φ1) * cos(φ2) * cos(λ1 - λ2))

其中,R 是地球半径,φ1 和 φ2 分别是两个地点的纬度,λ1 和 λ2 是两个地点的经度,d 是两点之间的距离。 通过这个公式,Geodesy 能够快速准确地计算出地球上两个经纬度坐标之间的距离。

2.代码工程

实验目标

  • 1.利用数学公式计算
  • 2.利用Java库包Geodesy

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springboot-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>geodesy</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.gavaghan</groupId><artifactId>geodesy</artifactId><version>1.1.3</version></dependency></dependencies>
</project>

数学公式计算类

package com.et.geodesy.util;import lombok.experimental.UtilityClass;import java.math.BigDecimal;/***** <p>formula:S=R·arccos[cosβ1·cosβ·2cos(α1-α2)+sinβ1·sinβ2]*/
@UtilityClass
public class MathDistanceUtil {private static final double EARTH_RADIUS = 6371393;private static final double DEGREES_TO_RADIANS = 0.017453292519943295;/*** Calculate according to formula** @param longitude1* @param latitude1* @param longitude2* @param latitude2* @return*/public static double getDistance(Double longitude1, Double latitude1, Double longitude2, Double latitude2) {double radiansLongitude1 = toRadians(longitude1);double radiansLatitude1 = toRadians(latitude1);double radiansLongitude2 = toRadians(longitude2);double radiansLatitude2 = Math.toRadians(latitude2);final double cos =BigDecimal.valueOf(Math.cos(radiansLatitude1)).multiply(BigDecimal.valueOf(Math.cos(radiansLatitude2))).multiply(BigDecimal.valueOf(Math.cos(BigDecimal.valueOf(radiansLongitude1).subtract(BigDecimal.valueOf(radiansLongitude2)).doubleValue()))).add(BigDecimal.valueOf(Math.sin(radiansLatitude1)).multiply(BigDecimal.valueOf(Math.sin(radiansLatitude2)))).doubleValue();double acos = Math.acos(cos);return BigDecimal.valueOf(EARTH_RADIUS).multiply(BigDecimal.valueOf(acos)).doubleValue();}/*** refer:{@link Math#toRadians(double)}** @param value value* @return {double}*/private static double toRadians(double value) {return BigDecimal.valueOf(value).multiply(BigDecimal.valueOf(DEGREES_TO_RADIANS)).doubleValue();}}

库包调用

底层原理也是基于公式计算,方便大家使用才封装成包

package com.et.geodesy.util;import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GeodeticCurve;
import org.gavaghan.geodesy.GlobalCoordinates;import java.math.BigDecimal;
import java.math.RoundingMode;public class GeodsyDistanceUtils {/***** @param lonA A longitude* @param latA A latitude* @param lonB B longitude* @param latB B latitude* @param newScale The result is kept to decimal places* @return distant (m)*/public static double getDistance(Double lonA, Double latA, Double lonB, Double latB,int newScale) {GlobalCoordinates source = new GlobalCoordinates(latA, lonA);GlobalCoordinates target = new GlobalCoordinates(latB, lonB);GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target);double distance = geoCurve.getEllipsoidalDistance();BigDecimal distanceBig = new BigDecimal(distance).setScale(newScale, RoundingMode.UP);return distanceBig.doubleValue();}}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo

3.测试

编写测试类

@Test
public void getDistance() {// source (113.324553,23.106414)// target (121.499718, 31.239703)double distance1 = GeodsyDistanceUtils.getDistance(113.324553,23.106414,121.499718, 31.239703,2);System.out.println("distant1(m):" + distance1);double distance2 = MathDistanceUtil.getDistance(113.324553, 23.106414, 121.499718, 31.239703);System.out.println("distant2(m):" + distance2);
}

运行单元测试,发现2种计算方式误差不大

distant1(m):1212316.48
distant2(m):1212391.2574948743

4.引用

  • 探索地球两点间距离奥秘:深入剖析Geodesy和Geotools实现方法 - ByteZoneX社区
  • Spring Boot集成geodesy实现距离计算 | Harries Blog™

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

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

相关文章

Qt实现麦克风音频输入保存wav文件

一.本文目的 实现在Qt中接收麦克风数据并保存为WAV文件&#xff0c;使用QAudioInput来录音&#xff0c;并使用QFile来保存数据到WAV文件。 开发环境&#xff1a;QT5.12 本文用极简代码实现&#xff0c;核心代码只需不到100行。 完整工程代码文末链接可以直接下载。 二.代码实…

51单片机STC89C52RC——创建Keil项目

一&#xff0c;打开Keil5 菜单---project--New uVision Project... 二&#xff0c;新建项目文件夹 弹出选择文件夹对话框后&#xff0c;可以右键新建一个项目文件夹【文件夹名字可以随便取&#xff0c;自己看得懂就行&#xff0c;建议不要有特殊字符】&#xff0c;这样该项目…

MATLAB算法实战应用案例精讲-【数模应用】因子分析(附MATLAB和python代码实现)

目录 前言 算法原理 SPSS因子分析 操作步骤 结果分析 SPSSAU 因子分析案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果 5、文字分析 6、剖析 疑难解惑 同源方差或共同方法变异偏差,Harman单因子检验? 提示出现奇异矩阵? 因子得分和综合得分? 因子分析计…

品牌策划:不只是工作,是一场创意与学习的旅程

你是否认为只有那些经验丰富、手握无数成功案例的高手才能在品牌策划界崭露头角&#xff1f; 今天&#xff0c;我要悄悄告诉你一个行业内的秘密&#xff1a;在品牌策划的世界里&#xff0c;经验虽重要&#xff0c;但绝非唯一。 1️、无止境的学习欲望 品牌策划&#xff0c;这…

rtl8723DU移植 android4.4 4418 (第二部分蓝牙部分)

使用的代码&#xff1a; HMI &#xff08;8723bu&#xff09;源码 567_RTL8723DU_WiFi_linux_v5.6.5.3_35502_COEX20181130-2e2e.20191025.zip 由于之前写的所有笔记没有保存&#xff0c;这里只能是部分。 0、 前置知识 1 、kernel 的移植 2、hardwire的移植 将 驱动中的 h…

流水线报错:[Error: ENOENT: no such file or directory, stat ‘/application/bin‘]

报错信息&#xff1a; #18 10.37 > Build error occurred #18 10.38 [Error: ENOENT: no such file or directory, stat /application/bin] { #18 10.38 errno: -2, #18 10.38 code: ENOENT, #18 10.38 syscall: stat, #18 10.38 path: /application/bin #18 10.38 } #18 12…

腾讯开源人像照片生成视频模型V-Express

网址 https://github.com/tencent-ailab/V-Express 下面是github里的翻译&#xff1a; 在人像视频生成领域&#xff0c;使用单张图像生成人像视频变得越来越普遍。一种常见的方法是利用生成模型来增强受控发电的适配器。 但是&#xff0c;控制信号的强度可能会有所不同&…

系统思考—啤酒游戏沙盘

10个智商120的‮组人‬成‮团的‬队&#xff0c;大‮的家‬集体智‮是商‬多少&#xff1f; 在‮期长‬辅‮各导‬种‮业企‬的‮程过‬中&#xff0c;我‮经们‬常‮察观‬到&#xff0c;虽‮每然‬个‮门部‬都‮力努‬解决‮己自‬的问题&#xff0c;但‮司公‬整体的‮收应…

Rust 标记一个属性或函数为废弃

如题&#xff0c;演示Rust 标记一个属性或函数为废弃的基本使用方法&#xff1a; 示例&#xff1a; use serde::{Deserialize, Serialize};#[derive(Clone, Debug, Serialize, Deserialize, Default)] pub struct GrpcOptions {pub addr: String,pub max_recv_message_size: u…

conntrack如何限制您的k8s网关

1.1 conntrack 介绍 对于那些不熟悉的人来说,conntrack简单来说是Linux内核的一个子系统,它跟踪所有进入、出去或通过系统的网络连接,允许它监控和管理每个连接的状态,这对于诸如NAT(网络地址转换)、防火墙和保持会话连续性等任务至关重要。它作为Netfilter的一部分运行,…

解决福昕风腾PDF套装无法打印在线电子签章的方法

使用福昕风腾PDF套装打印在线电子签章文件时发现&#xff0c;在线盖的电子印章和签名却打印不出来&#xff0c;后现发现&#xff0c;按图中选项选择“文档”&#xff0c;即可完整打印文件内容及电子签章。留印。

(求一个整数各位数的和)编写程序,读取一个在0和1000之间的整数,并将该整数的各位数字相加。例如:整数是 932,各位数字之和为14。

(求一个整数各位数的和)编写程序&#xff0c;读取一个在0和1000之间的整数&#xff0c;并将该整数 的各位数字相加。例如:整数是 932&#xff0c;各位数字之和为14。 提示:利用操作符%分解数字,然后使用操作符/去掉分解出来的数字。例如: 932%10-2 932/10-93。下面是一个运行示…

nginx-变量

变量也是nginx的一大亮点&#xff0c;这也使得nginx更加灵活了&#xff0c;变量的语法格式为 $XXX 或 ${xxxx} 首先说下变量的分类&#xff0c;变量分为内置和自定义&#xff0c;网络不少对变量的描述都不太准确&#xff0c;他们认为但凡不是nginx原生的变量都是属于自定义&am…

iOS中常用的一些宏以及用法

目录 1.NS_UNAVAILABLE 2.__kindof 前言 这里博客主要介绍iOS中常用的一些宏以及用法。 1.NS_UNAVAILABLE NS_UNAVAILABLE是一个宏&#xff0c;通常用于指示某个方法不可用&#xff0c;无法被调用。 当一个方法被标记为NS_UNAVAILABLE时&…

【uniapp】带圆角渐变边框实现

1. 效果图 2. 代码实现 <image class"item-left-img" :src"url" mode"aspectFill" />.item-left-img {width: 240rpx;height: 320rpx;border: 6rpx solid transparent;background-clip: padding-box, border-box;background-origin: padd…

校验参数个数工具类

项目中有个需求&#xff1a;前后端参数一致性校验&#xff0c;在某业务场景下后端代码需要校验参数个数&#xff0c;因此设计了1个工具类方便大伙使用&#xff0c;特此简单记录下。 校验参数个数工具类 一、校验工具类CheckNumInsideParamters二、单元测试ParameterSizeTest三…

数据挖掘--挖掘频繁模式、关联和相关性:基本概念和方法

频繁项集、闭项集和关联规则 频繁项集&#xff1a;出现的次数超过最小支持度计数阈值 闭频繁项集&#xff1a;一个集合他的超集(包含这个集合的集合)在数据库里面的数量和这个集合在这个数据库里面的数量不一样,这个集合就是闭项集 如果这个集合还是频繁的,那么他就是极大频…

关于json文件的保存

在nodejs中&#xff0c;通常用fs.writeFileSync(filepath,JSON.stringify(jsonvar))这样的调用&#xff0c;将json或者json数组转换成字符串写入到文件中&#xff0c;这时json的数据是紧凑的&#xff0c;没有空格、制表符和换行来分隔&#xff0c;优点是可以省存储空间&#xf…

SpringCache和SpringTask

SpringCache 在启动类上加EnableCaching注解 我们只要在Controller上写一个SpringCache相应的注解 我们就能实现缓存了 简化缓存操作代码&#xff0c;提高我们的效率 我们默认是我们的spring做缓存 但我们还可以替换我们的缓存技术 例如 EhCache Google Redis 来作为…

MAVEN:自定义模板Archetype的创建

目录 一、简介 二、具体步骤 三、 vscode通过模板创建项目 四、通过IDEA创建 一、简介 有时候MAVEN自带的模板库并不能满足我们创建项目的需求&#xff0c;为了能够快速创建项目&#xff0c;免去每次复杂的配置&#xff0c;所以我们需要自定义模板库&#xff0c;本次操作基于…