经纬度获取距离范围

158 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

` com.itsoft.property.commons.utils;

import com.alibaba.fastjson.JSONArray;

public class LatLonUtil { private static double PI = 3.14159265; private static double EARTH_RADIUS = 6378137; private static double RAD = Math.PI / 180.0;

/** * @Description: 获取四至信息(最大最小经纬度) * @param lat * @param lng */ public static double[] getFourBounds(String lng, String lat, String[] pointArr) throws Exception { if (pointArr.length>1) { return getPolygonAround(pointArr); } return getCircleAround(Double.parseDouble(lng), Double.parseDouble(lat), Double.parseDouble(pointArr[0]));

}
/**
 * @Description:  获取多边形四至信息
 */

public static double[] getPolygonAround(String[] pointArr) { // 获取中心点 double maxLat = 0.0; double maxLng = 0.0; double minLat = 1000.0; double minLng = 1000.0; for (String str : pointArr) { double lng = Double.parseDouble(str.split(",")[0]); double lat = Double.parseDouble(str.split(",")[1]); if (lat > maxLat) { maxLat = lat; } if (lng > maxLng) { maxLng = lng; } if (lat < minLat) { minLat = lat; } if (lng < minLng) { minLng = lng; } } return new double[] { minLat, minLng, maxLat, maxLng }; } ///

/// 根据提供的经度和纬度、以及半径,取得此半径内的最大最小经纬度 /// /// 纬度 /// 经度 /// 半径(米) /// public static double[] getCircleAround(double lon, double lat, double raidusMile) {

    Double latitude = lat;
    Double longitude = lon;

    Double degree = (24901 * 1609) / 360.0;

    Double dpmLat = 1 / degree;
    Double radiusLat = dpmLat * raidusMile;
    Double minLat = latitude - radiusLat;
    Double maxLat = latitude + radiusLat;

    Double mpdLng = degree * Math.cos(latitude * (PI / 180));
    Double dpmLng = 1 / mpdLng;
    Double radiusLng = dpmLng * raidusMile;
    Double minLng = longitude - radiusLng;
    Double maxLng = longitude + radiusLng;
    return new double[] { minLat, minLng, maxLat, maxLng };
}

/// <summary>
/// 根据提供的两个经纬度计算距离(米) 误差10米 多了10米
/// </summary>
/// <param name="lng1">经度1</param>
/// <param name="lat1">纬度1</param>
/// <param name="lng2">经度2</param>
/// <param name="lat2">纬度2</param>
/// <returns></returns>
public static double getDistance(double lng1, double lat1, double lng2, double lat2)
{
    double radLat1 = lat1 * RAD;
    double radLat2 = lat2 * RAD;
    double a = radLat1 - radLat2;
    double b = (lng1 - lng2) * RAD;
    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;
}


/**
 * 判断一个点是否在圆形区域内
 */
public static boolean isInCircle(double lng1, double lat1, double lng2, double lat2, String radius) {
    double distance = getDistance(lat1, lng1, lat2, lng2);
    double r = Double.parseDouble(radius);
    if (distance > r) {
        return false;
    } else {
        return true;
    }
}

public static void main(String[] args) {
   System.out.println(JSONArray.toJSONString(getCircleAround(116.407863, 39.914087,480)));
  System.out.println(getDistance(34.20301805413954, 108.94710838794708, 34.20374122451657, 108.95211338996887));

}

}`