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

访客7年前Jfinal2699

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

相关文章

MyEclipse 8.5 新建 基于Xfire的webservice

MyEclipse 8.5 新建 基于Xfire的webservice

 使用Xfire实现Web Services,作业应当包括相关的实现软件代码以及对应的WSDL。 MyEclipse 8.5,XFire 1.2.6,weblogic 11g/TomcatX...

idea 如何运行vue项目

idea 如何运行vue项目

这里以RuoYi-Vue项目为例,开源地址1.环境准备JDK >= 1.8 (推荐1.8版本) Mysql >= 5.7.0 ...

java实现日期加1

直接附代码:      public static final Date getNextDay(){...

showModalDialog取得父窗口的方法

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

Java判断是数字还是字符串

方法一:利用正则表达式public class Testone {public static void main(String[] ...

get方式调用http接口   Header赋参数值

get方式调用http接口 Header赋参数值

   /**      195.     * 发送...

发表评论    

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