JAVA 后台计算 经纬度 最短距离

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);
    }
    
    /**
     * 计算 两点 之间  的 最短距离 <br/>
     * 返回 数据 为 两点之间的 公里数
     */
    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、测试结果

本地测试结果


谷歌地图上测量结果


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值