根据坐标算距离,根据坐标和距离返回坐标范围等

以下为地图工具代码:

import java.text.DecimalFormat;

/**
 * 地图工具类
 * 
 * @author licd
 * 
 */
public class MapUtil {

    private final static double PI = 3.14159265358979323; // 圆周率
    private final static double R = 6371229; // 地球的半径
    private final static double DEFAULT_LONGT = 116.390471;// 默认经度
    private final static double DEFAULT_LAT = 39.861012;// 默认纬度
    private final static DecimalFormat DOUBLE_FORMAT = new DecimalFormat("#.000000");//经度默认格式
    public final static int NEARBY_DISTANCE = 1000;//附近的距离 
    public final static int STIPULATE_DISTANCE = 1000;//附近规定的距离

    /**
     * 获取坐标距离(米)
     * 
     * @param longt1
     *            起始经度
     * @param lat1
     *            起始纬度
     * @param longt2
     *            目地地经度
     * @param lat2
     *            目的地纬度
     * @return
     */
    public static int getDistance(double longt1, double lat1, double longt2, double lat2) {
        double x, y, distance;
        x = (longt2 - longt1) * PI * R * Math.cos(((lat1 + lat2) / 2) * PI / 180) / 180;
        y = (lat2 - lat1) * PI * R / 180;
        distance = Math.hypot(x, y);
        return (int) (distance + 0.5);
    }

    /**
     * 将String经度转换成Double
     * 
     * @param longitude
     * @return
     */
    public static double getLongitude(String longitude) {
        if (!Utility.isStrNotNull(longitude)) {
            return DEFAULT_LONGT;
        }
        if (longitude.length() > 10) {
            longitude = longitude.substring(0, 10);
        }
        return Utility.toDouble(longitude, DEFAULT_LONGT);
    }

    /**
     * 将String纬度转换成Double
     * 
     * @param latitude
     * @return
     */
    public static double getLatitude(String latitude) {
        if (!Utility.isStrNotNull(latitude)) {
            return DEFAULT_LAT;
        }
        if (latitude.length() > 10) {
            latitude = latitude.substring(0, 10);
        }
        return Utility.toDouble(latitude, DEFAULT_LAT);
    }

    /**
     * 根据距离返回,经纬度范围 返回顺序 minLat,minLng,maxLat,maxLng
     * 
     * @param lat
     * @param lon
     * @param raidus
     * @return
     */
    public static double[] getAround(double lat, double lon, int raidus) {

        try {
            Double latitude = lat;
            Double longitude = lon;

            Double degree = (24901 * 1609) / 360.0;
            double raidusMile = raidus;

            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;

            // 格式化
            minLat = Double.parseDouble(DOUBLE_FORMAT.format(minLat));
            minLng = Double.parseDouble(DOUBLE_FORMAT.format(minLng));
            maxLat = Double.parseDouble(DOUBLE_FORMAT.format(maxLat));
            maxLng = Double.parseDouble(DOUBLE_FORMAT.format(maxLng));

            return new double[] { minLat, minLng, maxLat, maxLng };
        } catch (NumberFormatException e) {
        }
        return null;
    }
    
    /**
     * 判断是否超出规定距离范围
     * 
     * @param longt1
     *            起始经度
     * @param lat1
     *            起始纬度
     * @param longt2
     *            目地地经度
     * @param lat2
     *            目的地纬度
     * @return
     */
    public static boolean isOutOfRange(double longt1, double lat1, double longt2, double lat2) {
        int distance = getDistance(longt1, lat1, longt2, lat2);
        if(distance > STIPULATE_DISTANCE){
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }
}


你可能感兴趣的:(longitude,latitude,distance)