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

访客9年前 (2017-08-01)Jfinal4720

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

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

分享给朋友:

相关文章

freeMarker 截取字符串(操作字符串函数 )

<#if c.proSummary!?length gt 25>  <!-- 如果长度 >25 截取25个字-->    ...

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

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

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

开机密码忘记怎么办

1、重新启动计算机,在启动画面出现后马上按下F8键(不同类型型号电脑启动键不一样,参考附加),选择“带命令行的安全模式”。2、运行过程结束时,系统列出了系统超级用户“administrator”和本地...

MyEclipse 中项目修改SVN的地址

MyEclipse 中项目修改SVN的地址

在工作环境调整时,有的时候SVN服务器的地址需要修改,而正在开发中的项目在Eclipse中有些代码没有提交,此时怎么修改SVN的地址呢?以下有一个简单的办法:一、在MyEclipse中选择Window...

office 2010安装、激活、激活工具下载

office 2010安装、激活、激活工具下载

 首先下载好工具包(包括office 2010安装程序、激活工具及Microsoft .NET Framework 4.0),点击工具包下载进行下载;安装好office 2010。如果是wi...

樊山越玲 一周年

樊山越玲 一周年

2015-12-25樊先森:周末有约吗?玲玲:有约,不过也得先以你为主啊。樊先森:昂,这样说我还挺开心的。2015-3-26玲玲:亲爱的,苹果是你买的吗?已经收到了,谢谢老公玲玲:有点小惊喜樊先森:那...

发表评论

访客

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