java经纬度曲线简化_JAVA 后台计算 经纬度 最短距离

该博客介绍了如何使用JAVA计算两个地理位置之间的最短距离。通过将经纬度转换为弧度,然后应用数学公式,计算出地球上的两点之间的直线距离(公里数)。提供的代码示例展示了如何实现这一功能,并附带了测试用例。
摘要由CSDN通过智能技术生成

1、 代码块

package com.ilogie.tms.util;

import java.io.IOException;

import java.math.BigDecimal;

import java.text.MessageFormat;

public class LocationUtils {

// 以下为 获得 两点之间最短距离

private static final BigDecimal EARTH_RADIUS = MathUtil.toBigDecimal(6378.137);//定义 地球半径

private static final BigDecimal MATH_PI = MathUtil.toBigDecimal(Math.PI);//定义Math.PI

/**计算弧长**/

private static BigDecimal getRed(BigDecimal big){

return big.multiply(MATH_PI).divide(MathUtil.toBigDecimal(180.0), BigDecimal.ROUND_DOWN);

}

/**

* 计算 两点 之间 的 最短距离

* 返回 数据 为 两点之间的 公里数

*/

public static BigDecimal getShortestDistance(BigDecimal lat1,BigDecimal lng1,

BigDecimal lat2,BigDecimal lng2 ){

logger.debug("lat1: " +lat1+", lng1:" + lng1);

logger.debug("lat2: " +lat2+", lng2:" + lng2);

BigDecimal radLat1 = getRed(lat1);

BigDecimal radLat2 = getRed(lat2);

BigDecimal a = radLat1.subtract(radLat2);

BigDecimal b = getRed(lng1).subtract(getRed(lng2));

Double sinA = Math.sin(a.doubleValue()/2);

Double sinB = Math.sin(b.doubleValue()/2);

Double cosA = radLat1.doubleValue();

Double cosB = radLat2.doubleValue();

Object obj = 2 * Math.asin(Math.sqrt(Math.pow(sinA,2) + Math.cos(cosA)*Math.cos(cosB)*Math.pow(sinB, 2)));

BigDecimal s = new BigDecimal(obj);

s = s.multiply(EARTH_RADIUS);

return format(s, 3);

}

public static BigDecimal format(BigDecimal big, int scale) {

scale = 0 > scale ? 0 : scale;

big = big.setScale(scale, BigDecimal.ROUND_HALF_UP);

return big;

}

public static void main(String[] args) {

// latlng 31.2147094,121.5193688 上海浦东新区社区服务中心

// latlng 31.226327,121.4969213 上海普陀区星云招商办事处、

// 地图上 2.57 测试 2.58

// latlg 28.1939842 113.0108862 长沙火车站

// latlg 22.636828 113.814606 深圳宝安国际机场

BigDecimal lat1 = MathUtil.toBigDecimal(28.1939842);

BigDecimal lng1 = MathUtil.toBigDecimal(113.0108862);

BigDecimal lat2 = MathUtil.toBigDecimal(22.636828);

BigDecimal lng2 = MathUtil.toBigDecimal(113.814606);

System.out.println("最短距离:"+getShortestDistance(lat1, lng1, lat2, lng2));

}

}

2、测试结果

67ea97e3ea92db4e9d08f4a524b7bba1.png

0eaabfba8af062dc6c9644f7479fb262.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值