首页 > 其他分享 >Spring Boot集成 Geodesy讲解

Spring Boot集成 Geodesy讲解

时间:2024-06-09 11:45:43浏览次数:12  
标签:cos BigDecimal 1.2 double valueOf Boot Geodesy Spring import

目录

1 Geodesy

1.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 能够快速准确地计算出地球上两个经纬度坐标之间的距离。

1.2 操作实践

1.2.1 pom.xml

<dependency>
    <groupId>org.gavaghan</groupId>
    <artifactId>geodesy</artifactId>
    <version>1.1.3</version>
</dependency>

1.2.2 数学公式计算类

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;


  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();
  }

 
  private static double toRadians(double value) {
    return BigDecimal.valueOf(value).multiply(BigDecimal.valueOf(DEGREES_TO_RADIANS)).doubleValue();
  }
}

1.2.3 库包调用

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

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 {

    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();
    }

}

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

1.2.4 测试

编写测试类

@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

标签:cos,BigDecimal,1.2,double,valueOf,Boot,Geodesy,Spring,import
From: https://www.cnblogs.com/jingzh/p/18239390

相关文章

  • zz Spring 是一种反模式
    Java将会消亡–MartinVysny–第一性原理思考原文标题“Java将会消亡”,我并不认可Java会消亡一说,作者还处于FP亢奋期,而我已经从FP回归OO,这个话题有机会再展开。”Spring是一种反模式”是第二节的标题。让我们引用一下原文:Spring是一种反模式正如上面演示的......
  • spring和Mybatis的各种查询
    目录六、MyBatis的各种查询功能6.1、查询一个实体类的对象6.2、查询一个list集合6.3、查询单个数据6.4、查询一条数据为Map集合6.5、查询多条数据为Map集合七、特殊SQL的执行7.1、模糊查询7.2、批量删除7.3、动态设置表名7.4、添加功能获取自增的主键八、自定义映射resultMap一......
  • springboot启动过程、自动装配原理、内置Tomcat启动原理
    一、springboot的启动原理springboot的启动通过在main方法的SpringApplication.run()方法启动@SpringBootApplicationpublicclassShuaApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ShuaApplication.class,args);}}......
  • SpringBoot架构图
    文章目录前言一、SpringBoot架构模块二、SpringBoot架构图总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案......
  • Java项目-基于springboot+vue的音乐网站与分享平台 (源码+数据库+文档)​
    如需完整项目,请私信博主基于SpringBoot+Vue的音乐网站与分享平台开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven音乐网站与分享平台的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、音乐资讯管理、音乐......
  • Java项目-基于springboot+vue的影城管理系统 (源码+数据库+文档)​
    如需完整项目,请私信博主基于SpringBoot+Vue的影城管理系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven影城管理系统的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、电影类型管理、放映厅管理、电影......
  • Springboot计算机毕业设计疫情下的社区居民管理系统小程序【附源码】开题+论文+mysql+
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在新冠疫情的影响下,社区管理面临着前所未有的挑战。疫情的快速传播要求社区具备更高效、更精准的管理手段,以保障居民的健康与安全。传统的社区管理方......
  • Springboot计算机毕业设计疫情下社区资源分配小程序【附源码】开题+论文+mysql+程序+
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在全球新冠疫情的背景下,社区作为防控疫情的重要阵地,面临着巨大的挑战。随着疫情的持续,社区资源的分配和管理变得尤为重要。然而,传统的资源分配方式往......
  • 基于SpringBoot+Vue的学院党员管理系统设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示项目运行截图技术框架后端采用SpringBoot框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • 基于SpringBoot+Vue的小型企业办公自动化系统设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示项目运行截图技术框架后端采用SpringBoot框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......