MongoTemplate数组查询

/**
     * 按时间范围、最大最小经纬度检索(矩形查询)
     * 
     * @param timeRange
     *            开始时间,结束时间中间逗号隔开,必填 yyyyMMddHH
     * @param lat
     *            纬度,可选
     * @param lon
     *            经度,可选
     * @param vars
     *            要素,如pre_3h、u、v、snow_3h、tem_max、tem_min、temp
     * @return
     * @throws ParseException
     */
    public List<RefineGridPoint243> getRefineGridPoint243InAreaByTimeRange(String timeRange,
            double maxLon, double maxLat, double minLon, double minLat, String vars)throws ParseException {
        String[] times = timeRange.split(",");
        DBObject dbObject = new BasicDBObject();
        if (times.length > 1) {
            dbObject.put("qbtime", new BasicDBObject("$gte", times[0]).append("$lte", times[1]));
        } else {
            dbObject.put("qbtime", new BasicDBObject("$gte", timeRange).append("$lte", timeRange));
        }
        if (vars != null) {
            String[] var = vars.split(",");
            dbObject.put("var", new BasicDBObject("$in", var));
        }
        int[] maxnum = GRB2ParseUtil.getIndex(maxLat, maxLon);
        int[] minnum = GRB2ParseUtil.getIndex(minLat, minLon);
        if (maxnum != null&&minnum!=null) {
            dbObject.put("lat", new BasicDBObject("$gte", minnum[0]).append("$lte", maxnum[0]));
        }
        Query query = new BasicQuery(dbObject, null);
        if (maxnum != null&&minnum!=null) {
            query.fields().slice("value", minnum[1], maxnum[1]-minnum[1]+1);
        }
        return mongoTemplate.find(query, RefineGridPoint243.class, "RefineGridPoint243");
    }
private static final double interval = 0.05;// 经纬度间隔
    public static final double minLat = 34.25;
    public static final double maxLat = 38.55;
    public static final double maxLon = 122.80;
    public static final double minLon = 114.65;

    public static int[] getIndex(double lat, double lon) {
        if (lat >= minLat && lat <= maxLat && lon >= minLon && lon <= maxLon) {
            double latnum = (lat - minLat) / interval;
            double lonnum = (lon - minLon) / interval;
            return new int[] { (int) Math.rint(latnum), (int) Math.rint(lonnum) };
        }
        return null;
    }

猜你喜欢

转载自blog.csdn.net/jiangshuanshuan/article/details/79293309
今日推荐