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、测试结果
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、测试结果
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树