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

来源:互联网 发布:网络策划培训课程 编辑:程序博客网 时间:2024/05/16 14:29

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

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

    /**     * 获取附近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;     } 
阅读全文
1 0
原创粉丝点击