使用地理索引,如何找到缓存中最近的项目。

时间:2014-10-20 23:19:51

标签: caching gridgain

我们可以对缓存中的项目运行哪些不同类型的地理空间查询?首先,我需要在缓存中找到最接近给定Point的项目。

1 个答案:

答案 0 :(得分:1)

哟!

GridGain(以及H2数据库)支持operator&&在SQL中,这意味着"边界框的交集"。这个运算符相当原始但它可以使用地理空间索引来快速工作, 这样就可以对一小部分条目进行任何复杂的后续过滤。

作为参考,您可以使用以下unit test

在该单元测试中,您将看到以下实体:

private static class EnemyCamp implements Serializable {
    /** */
    @GridCacheQuerySqlField(index = true)
    private Geometry coords;

    /** */
    @GridCacheQuerySqlField
    private String name;
}

由字段" coords"索引。 com.vividsolutions.jts.geom.Geometry类型。我们可以将一些这样的实体放到缓存中并查询条目列表,这些条目的坐标(这里的坐标是一个点,因此它的边界框是同一个点)与给定多边形的边界框交叉。 / p>

GridCache<Integer, EnemyCamp> cache = ...;

WKTReader r = new WKTReader();

cache.put(0, new EnemyCamp(r.read("POINT(25 75)"), "A"));
cache.put(1, new EnemyCamp(r.read("POINT(70 70)"), "B"));
cache.put(2, new EnemyCamp(r.read("POINT(70 30)"), "C"));
cache.put(3, new EnemyCamp(r.read("POINT(75 25)"), "D"));

GridCacheQuery<Map.Entry<Integer, EnemyCamp>> qry = cache.queries().createSqlQuery(EnemyCamp.class,
    "coords && ?");

Collection<Map.Entry<Integer, EnemyCamp>> res = qry.execute(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 70))")).get();

在我们获得此查询返回的结果后,我们可以在java代码中进一步过滤它,例如使用方法Geometry.isWithinDistance

玩得开心!