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

访客7年前 (2017-08-01)Jfinal3094

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

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

相关文章

showModalDialog取得父窗口的方法

 通常使用window.open的方式开启新窗口的话要取得父窗口的控件,可以用window.opener来取得父窗口然而如果使用showModalDialog的话...却无效如果有需要的话,...

如何彻底卸载删除oracle数据库

 windows下如何彻底删除Oracle 软件环境: 1、Windows 2000+ORACLE 8.1.7 ,oracle 10g2、ORACLE安装路径为:C:\ORACLE实现方...

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

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

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

org.apache.subversion.javahl.ClientException: The working copy needs to be upgraded svn: Working cop

org.apache.subversion.javahl.ClientException: The working copy needs to be upgraded svn: Working cop

SVN更新出现问题:org.apache.subversion.javahl.ClientException: The working copy needs to be upgraded svn: W...

iscroll+ ajax+ Jfinal 实现手机下拉加载更多

  <script src="${base}/resource/front/js/iscroll.js"></script>一、页面<div...

js/jquery 实现点击图片更换头像(图片)实例

    总之一句话, 可以先将 file类型 的input 隐藏 起来,通过 图片(头像)的onclick事件 来触发 file 的onclick事件。1.引入外部js:...

发表评论

访客

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