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

来源:互联网 发布:淘宝商店如何开通花呗 编辑:程序博客网 时间:2024/06/05 04:41

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、测试结果

本地测试结果


谷歌地图上测量结果


1 0
原创粉丝点击