概述
经纬度在地图应用中常见,一般结合路网信息库,进行地图应用开发(流量、路况等),此次从理计算两点经纬度的直线距及最短运行时间预研,实现下述表达式:
![](http://dl2.iteye.com/upload/attachment/0120/0019/2372658f-10fc-365b-becb-688e7c91d3fc.jpg)
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(); } } }