概述
经纬度在地图应用中常见,一般结合路网信息库,进行地图应用开发(流量、路况等),此次从理计算两点经纬度的直线距及最短运行时间预研,实现下述表达式:
![](https://i-blog.csdnimg.cn/blog_migrate/b9aab3c4a3a202faedd311559f43de5f.jpeg)
package com.sunshine.app.utils;
import java.text.SimpleDateFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class DeckUtils {
public static final String TYPE = "yyyy-MM-dd HH:mm:ss";
/**
* 地球半径
*/
public static double EARTH_RADIUS = 6378.137;
private static Logger log = LoggerFactory.getLogger(DeckUtils.class);
/**
* 两时间之差(小时)
* @param dateStr1
* @param dateStr2
* @return
* @throws Exception
*/
public static float diffHours(String dateStr1, String dateStr2)
throws Exception {
SimpleDateFormat sd = new SimpleDateFormat(TYPE);
long l1 = sd.parse(dateStr1).getTime();
long l2 = sd.parse(dateStr2).getTime();
long diff = Math.abs(l1 - l2);
float result = (float) diff / 1000 * 60 * 60;
return Float.valueOf(new java.text.DecimalFormat("0.0").format(result));
}
/**
* 两时间之差(分钟)
*
* @param dateStr1
* @param dateStr2
* @return
* @throws Exception
*/
public static float diffMinute(String dateStr1, String dateStr2)
throws Exception {
SimpleDateFormat sd = new SimpleDateFormat(TYPE);
long l1 = sd.parse(dateStr1).getTime();
long l2 = sd.parse(dateStr2).getTime();
long diff = Math.abs(l1 - l2);
float result = (float) diff / 1000 * 60;
return Float.valueOf(new java.text.DecimalFormat("0.0").format(result));
}
/**
* 两点经纬度之间距离(米)
* @param lat1Str
* @param lng1Str
* @param lat2Str
* @param lng2Str
* @return
*/
public static double getDistance(String lat1Str, String lng1Str,
String lat2Str, String lng2Str) {
Double lat1 = Double.parseDouble(lat1Str);
Double lng1 = Double.parseDouble(lng1Str);
Double lat2 = Double.parseDouble(lat2Str);
Double lng2 = Double.parseDouble(lng2Str);
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
+ Math.cos(radLat1) * Math.cos(radLat2)
* Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = Math.round(s * 10000) / 10000;
return s;
}
private static double rad(double d) {
return d * Math.PI / 180.0;
}
public static float getMinElapsetime(double meter, int speed) {
float km = (float) meter / 1000;
float elapse = (float) km / speed;
return Float.valueOf(new java.text.DecimalFormat("0.0").format(elapse));
}
public static void main(String[] args) {
try {
System.out.println(DeckUtils.diffHours("2016-09-11 12:00:00",
"2016-09-11 12:10:00"));
double meter = getDistance("129.0043", "28.0344", "129.1234",
"28.7008");
float elapse = getMinElapsetime(meter, 120);
System.out.println("运行时间:" + elapse);
} catch (Exception e) {
e.printStackTrace();
}
}
}