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

以下为地图工具代码:

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;
    }
}


转载于:https://my.oschina.net/lcdmusic/blog/343505

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值