什么网站可以做翻译兼职,徐州市建设局网站首页,建设局网站作用,网站注册网站违法吗1.什么是geodesy#xff1f;
浩瀚的宇宙中#xff0c;地球是我们赖以生存的家园。自古以来#xff0c;人类一直对星球上的位置和彼此的距离着迷。无论是航海探险、贸易往来还是科学研究#xff0c;精确计算两个地点之间的距离都是至关重要的。 Geodesy#xff1a;大地测量…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 version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdspringboot-demo/artifactIdgroupIdcom.et/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdgeodesy/artifactIdpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.target/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-autoconfigure/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdorg.gavaghan/groupIdartifactIdgeodesy/artifactIdversion1.1.3/version/dependency/dependencies
/project
数学公式计算类
package com.et.geodesy.util;import lombok.experimental.UtilityClass;import java.math.BigDecimal;/***** pformulaSR·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.239703double distance1 GeodsyDistanceUtils.getDistance(113.324553,23.106414,121.499718, 31.239703,2);System.out.println(distant1m distance1);double distance2 MathDistanceUtil.getDistance(113.324553, 23.106414, 121.499718, 31.239703);System.out.println(distant2m distance2);
}
运行单元测试发现2种计算方式误差不大
distant1m1212316.48
distant2m1212391.2574948743
4.引用
探索地球两点间距离奥秘深入剖析Geodesy和Geotools实现方法 - ByteZoneX社区Spring Boot集成geodesy实现距离计算 | Harries Blog™