您的位置:首页 > 编程语言 > Java开发

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

2016-02-26 16:38 666 查看
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、测试结果



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息