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

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

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 中项目修改SVN的地址

MyEclipse 中项目修改SVN的地址

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

程序员为什么不炫富

程序员为什么不炫富

 提到互联网,尤其是互联网工程师们,人们往往会想到两个词:“高薪”和“高压”。在知乎上“为什么很少见工资高的程序员炫富?”的问题下,一个得票很高的答案是:“乐意炫富的人,不是因为有钱,而是因为付出的少...

mysql 建存储过程 实例

drop PROCEDURE if EXISTS sp_lasqCREATE PROCEDURE sp_lasq()    COMMENT '超过5天自动立案&#...

发表评论

访客

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