java实现按范围搜索附近人(Jfinal框架)

访客8年前 (2017-08-01)Jfinal3404

Jfinal框架实现按范围搜索附近人,并按距离升序排序,实例代码:

公共类Localtion:

    /**
     * 生成以中心点为中心的四方形经纬度
     *
     * @param lat 经度
     * @param lon 纬度
     * @param raidus 半径(以千米为单位)
     * @return
     */
    public static double[] getAround(double lat, double lon, int raidus) {
 
        Double latitude = lat;
        Double longitude = lon;
 
        Double degree = (24901 * 1609) / 360.0;
        double raidusMile = raidus;
 
        Double dpmLat = 1 / degree;
        Double radiusLat = dpmLat * raidusMile*1000; //千米,去掉*1000就是米
        Double minLat = latitude - radiusLat;
        Double maxLat = latitude + radiusLat;
 
        Double mpdLng = degree * Math.cos(latitude * (Math.PI / 180));
        Double dpmLng = 1 / mpdLng;              
        Double radiusLng = dpmLng * raidusMile*1000;  //千米,去掉*1000就是米 

        Double minLng = longitude - radiusLng;   
        Double maxLng = longitude + radiusLng;   
        return new double[] { minLat, minLng, maxLat, maxLng };
    }

    /**
     * 计算中心经纬度与目标经纬度的距离(米)
     *
     * @param centerLon
     *            中心精度
     * @param centerLan
     *            中心纬度
     * @param targetLon
     *            需要计算的精度
     * @param targetLan
     *            需要计算的纬度
     * @return 米
     */
    public static double distance(double centerLon, double centerLat, double targetLon, double targetLat) {
 
        double jl_jd = 102834.74258026089786013677476285;// 每经度单位米;
        double jl_wd = 111712.69150641055729984301412873;// 每纬度单位米;
        double b = Math.abs((centerLat - targetLat) * jl_jd);
        double a = Math.abs((centerLon - targetLon) * jl_wd);
        return Math.sqrt((a * a + b * b));
    }

Controller类方法:

        public void doGetQuserNearList() {
            String range=getPara("range");//搜索范围  这里以千米为单位
            if (!BaseConverter.isFull(range)) {
                range ="1";
            }
            String lng=getPara("lng");
            String lat=getPara("lat");
            Page<Record> page =null;
            List<Object> param = new ArrayList<Object>();
            StringBuffer where = new StringBuffer();
            double[] lalon=Location.getAround(Double.valueOf(lat), Double.valueOf(lng), Integer.valueOf(range));
                if (BaseConverter.isFull(lng)) {
                    where.append(" and a.LONGITUDE >= ? and a.LONGITUDE <= ?");
                    param.add(lalon[1]);
                    param.add(lalon[3]);
                    System.out.println(">="+lalon[1]);
                    System.out.println("<="+lalon[3]);
                }
                if (BaseConverter.isFull(lat)) {
                    where.append(" and a.latitude >= ? and a.latitude <= ?");
                    param.add(lalon[0]);
                    param.add(lalon[2]);
                    System.out.println(">="+lalon[1]);
                    System.out.println("<="+lalon[2]);
                }
                //按距离升序排序
              String orderby =" order by distance asc   ";
            page = Db.use("oracle").paginate(pageIndex, pageSize,"select b.dyxm,c.U_ID,c.LATITUDE,c.LONGITUDE,c.DATE_TIME,c.DYZH," +
                    " trunc(ACOS(SIN(('"+lat+"' * 3.1415) / 180 ) * SIN((c.latitude * 3.1415) / 180 )+COS(('"+lat+"' * 3.1415) / 180 )*COS((c.latitude * 3.1415) / 180 )*COS(('"+lng+"' * 3.1415) / 180 - (c.LONGITUDE * 3.1415) / 180 ) ) * 6380,3) distance",
                    "  from T_TEM_GPRS c,G_BASICINFO b " + 
                    " where  c.dyzh = b.dyzh and c.DATE_TIME=( select max(DATE_TIME) from T_TEM_GPRS a where " +
                    "   a.DYZH=c.DYZH and to_date(DATE_TIME,'yyyy-mm-dd,hh24:mi:ss') >= SYSDATE-1/24" + //一个小时之内
                    where.toString()+ ")  "  + orderby, param.toArray() );
            renderJson(page);
         }

本文原创,转载必追究版权。

分享给朋友:

相关文章

每次开机checking file system on d

 解决方案:点击左下角(开始)- (运行)输入(CMD)回车 - 进入CMD界面- 输入(d:)回车 - 输入(chkdsk /f)中间有空格。回车,出现提示按Y键,完成后,重启一次会检...

js限制input只能输入数字、英文、汉字

 1.只能输入数字和英文的:  <input onkeyup="value=value.replace(/[\W]/g,'') "...

freemarker 判断日期变量为空处理 及InvalidReferenceException异常处理

at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:98);InvalidR...

MyEclipse 报错:'Building workspace' has encountered a problem解决方法

MyEclipse 报错:'Building workspace' has encountered a problem解决方法

          每次MyEclipse运行 工作空间报错如下:'Building workspac...

jquery 操作html元素(及CSS)

jquery 操作html元素(及CSS)

 $("li").addClass("aui-user-view-cell aui-img") ;  //给元素添加样式$('#a1...

目标管理法——目标分解法

让自己的人生更幸福更有意义关键是:要将梦想转化为具体的目标,然后合理的分解,达到量化,指标化!现将学习到的两种非常有效的目标分解法分享给所有梦想、有激情的朋友:祝愿大家都能梦想成真! 一、俄...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。