Java根據兩點的經緯度來計算之間的距離

dwd4 9年前發布 | 19K 次閱讀 Java

import java.util.HashMap;
import java.util.Map;

public class MapDistance {

private static double EARTH_RADIUS = 6378.137; 

private static double rad(double d) { 
    return d * Math.PI / 180.0; 
}

/**
 * 根據兩個位置的經緯度,來計算兩地的距離(單位為KM)
 * 參數為String類型
 * @param lat1 用戶經度
 * @param lng1 用戶緯度
 * @param lat2 商家經度
 * @param lng2 商家緯度
 * @return
 */
public static String 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 difference = radLat1 - radLat2;
    double mdifference = rad(lng1) - rad(lng2);
    double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(difference / 2), 2)
            + Math.cos(radLat1) * Math.cos(radLat2)
            * Math.pow(Math.sin(mdifference / 2), 2)));
    distance = distance * EARTH_RADIUS;
    distance = Math.round(distance * 10000) / 10000;
    String distanceStr = distance+"";
    distanceStr = distanceStr.
        substring(0, distanceStr.indexOf("."));

    return distanceStr;
}

/**
 * 獲取當前用戶一定距離以內的經緯度值
 * 單位米 return minLat
 * 最小經度 minLng
 * 最小緯度 maxLat
 * 最大經度 maxLng
 * 最大緯度 minLat
 */
public static Map getAround(String latStr, String lngStr, String raidus) {
    Map map = new HashMap();

    Double latitude = Double.parseDouble(latStr);// 傳值給經度
    Double longitude = Double.parseDouble(lngStr);// 傳值給緯度

    Double degree = (24901 * 1609) / 360.0; // 獲取每度
    double raidusMile = Double.parseDouble(raidus);

    Double mpdLng = Double.parseDouble((degree * Math.cos(latitude * (Math.PI / 180))+"").replace("-", ""));
    Double dpmLng = 1 / mpdLng;
    Double radiusLng = dpmLng * raidusMile;
    //獲取最小經度
    Double minLat = longitude - radiusLng;
    // 獲取最大經度
    Double maxLat = longitude + radiusLng;

    Double dpmLat = 1 / degree;
    Double radiusLat = dpmLat * raidusMile;
    // 獲取最小緯度
    Double minLng = latitude - radiusLat;
    // 獲取最大緯度
    Double maxLng = latitude + radiusLat;

    map.put("minLat", minLat+"");
    map.put("maxLat", maxLat+"");
    map.put("minLng", minLng+"");
    map.put("maxLng", maxLng+"");

    return map;
}

public static void main(String[] args) {
    //濟南國際會展中心經緯度:117.11811  36.68484
    //趵突泉:117.00999000000002  36.66123
    //System.out.println(getDistance("117.11811","36.68484","117.00999000000002","36.66123"));

    System.out.println(getAround("117.11811", "36.68484", "13000"));
    //117.01028712333508(Double), 117.22593287666493(Double),
    //36.44829619896034(Double), 36.92138380103966(Double)

}

}</pre>

 本文由用戶 dwd4 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!