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.pswp.cn/web/24256.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24256.shtml
英文地址,請注明出處:http://en.pswp.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;本次操作基于…