根据自身所在经纬度,查询周围一定范围内的地理位置(经纬度)

(注:知识浩瀚,本人能力有限,定有不足,望各位多多指点,不足之处请指出,俺好随时改进,小的无以为报,在此鞠躬致谢…)

根据自身经纬度,查询周围一定范围内的地理位置(经纬度),这在很多需要定位的项目中经常遇到。下面是我在项目中遇到后,各种上网搜索后,然后自己整理的:

    /**
     * 获取附近dis千米内的站点
     * @param lon       [经度]
     * @param lat       [纬度]
     * @param dis       [半径范围(单位:千米)]
     * @return          [符合条件站点的list集合]
     */
    public List<Map<String, Object>> getNeighStation(double lon,double lat, double dis){  
        //先计算查询点的经纬度范围  
        double r = 6371;//地球半径千米  
        double dlng =  2*Math.asin(Math.sin(dis/(2*r))/Math.cos(lat*Math.PI/180));  
        dlng = dlng*180/Math.PI;//角度转为弧度  
        double dlat = dis/r;  
        dlat = dlat*180/Math.PI;          
        double minlat =lat-dlat;  
        double maxlat = lat+dlat;  
        double minlng = lon -dlng;  
        double maxlng = lon + dlng;  

        String getStaSql = "select distinct(sta.station_id) as stationid, sta.station_name as stationname, sta.station_memo as stationmemo," +
                "  sta.longitude as lon, sta.latitude as lat" +
                " from bus_station_tb sta where sta.longitude between ? and ? and sta.latitude between ? and ?";  
        Object[] values = {minlng,maxlng,minlat,maxlat};  
        List<Map<String, Object>> stationList = daService.getAll(getStaSql, values);
        List<Map<String, Object>> staList = new ArrayList<Map<String,Object>>();
        for (int i = 0; i < stationList.size(); i++) {
            double lon2 = Double.valueOf(stationList.get(i).get("lon").toString());
            double lat2 = Double.valueOf(stationList.get(i).get("lat").toString());
            double len = GetDistance(lat,lon,lat2,lon2);
            if (len <= 300) {
                staList.add(stationList.get(i));
            }
        }
        return stationList;  
    } 


   /** 
    * 计算两个经纬度之间的距离 
    * @param lat1   [纬度1]
    * @param lng1   [经度1]
    * @param lat2   [纬度2]
    * @param lng2   [经度2]
    * @return       [两点之间的距离]
    */  
   public static double GetDistance(double lat1, double lng1, double lat2, double lng2)  
   {  
    double r = 6371.393;//地球半径千米  
    double radLat1 = lat1 * Math.PI / 180.0;  
    double radLat2 = lat2 * Math.PI / 180.0;  
    double a = radLat1 - radLat2;      
    double b = (lng1 * Math.PI / 180.0) - (lng2 * Math.PI / 180.0);  
    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 * r;  
    s = Math.round(s * 1000);  
    return s;  
   } 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值