【问题标题】:Querying Geopt with Objectify使用 Objectify 查询 Geopt
【发布时间】:2015-08-10 13:33:24
【问题描述】:

我很难用 Objectify 查询 GeoPt 字段。

我确保有一个关于 GeoPt 字段的 @Index 注释。

但是,下面的语句似乎不起作用

ofy().load()
     .type(GeoStat.class)
     .filter("geoPt.latitude >=", neLat)
     .limit(10);

是否可以在 Objectify 中查询 GeoPt 字段?

【问题讨论】:

  • 您在保存实体时是否设置了@Index...?稍后添加它不会为已经存在的实体创建索引。
  • @Index 在插入任何记录之前就已到位。

标签: java google-app-engine objectify geopoints


【解决方案1】:

数据存储不支持以这种方式查询GeoPt。如果您想查询纬度,请将其单独索引(可能写入 @OnSave 方法中的私有字段)。但是,如果您尝试执行地理空间查询(即,包含在一个矩形中),请注意您不能执行两个不等式过滤器(边界内的纬度,边界内的经度)。

好消息是,最近 google 添加了直接向数据存储执行地理空间查询的功能:

https://cloud.google.com/appengine/docs/java/datastore/geosearch

GeoPt center = new GeoPt(latitude, longitude);
double radius = valueInMeters;
Filter f = new StContainsFilter("geoPt", new Circle(center, radius));
ofy().load().type(GeoStat.class).filter(f);

请注意,数据存储的地理空间搜索目前是 Alpha 版本,已停止接受邀请。因此,虽然您可以让地理空间搜索在本地工作,但它仍然不能在生产中使用。见:Google App Engine › GeoSpatial Alpha Invite

【讨论】:

  • 这看起来应该可以工作,但 Android Studio “无法解析 StContainsFilter”
  • 我不知道您使用的是哪个版本的 App Engine 插件,但我使用的是 1.9.18 版本,并且 Android Studio 没有解析 StContaisFilter。我将其更新为 dependencies { classpath 'com.google.appengine:gradle-appengine-plugin:1.9.30' } 并且有效。转到您的后端 gradle 并检查您的版本。
  • 我在 .filter() 方法上遇到错误:ofy().load().type(GeoStat.class).filter(f) - filter() 需要一个字符串,你的意思是filterKey(对象值)?
  • 这是您正在寻找的重载:public Query<T> filter(Filter filter);
  • 使用数据存储的地理搜索是否死掉了?我再也无法在文档中找到它了。您在答案中发布的链接不再包含它。只是想知道这一年是否有任何更新。
猜你喜欢
  • 2012-08-09
  • 2012-09-28
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2012-04-30
  • 1970-01-01
  • 2017-04-01
相关资源
最近更新 更多