我们可以对缓存中的项目运行哪些不同类型的地理空间查询?首先,我需要在缓存中找到最接近给定Point的项目。
答案 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
玩得开心!