【问题标题】:GeoSpatial Radius Search Using Objectify使用 Objectify 进行地理空间半径搜索
【发布时间】:2013-02-23 22:17:41
【问题描述】:

我正在使用GeoModel 开发应用程序。我需要根据给定的纬度和经度在特定半径内执行搜索。我能够使用 Objectify 在数据存储中生成 GeoCell,但无法取回特定半径内的结果。

我在下面分享我的代码。

实体类

@Entity
public class NewsFeed implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Index
private Long feedID;
@Index
private String topic;
@Index
private String title;
private String description;
@Index
private Date createDate;
private String imageOrVideo;
private String imageUrl;
private String blobKey;
@Latitude
private Double latitude;
@Longitude
private Double longitude;
@Geocells
private List<String> cells;

    // getter and setters ...
}

自定义 GeocellQueryEngine 类 From This Source

public class ObjectifyGeocellQueryEngine implements GeocellQueryEngine {
private String geocellsProperty;
private Objectify ofy;
public static final String DEFAULT_GEOCELLS_PROPERTY = "cells";

public ObjectifyGeocellQueryEngine(Objectify ofy) {
    this(ofy, DEFAULT_GEOCELLS_PROPERTY);
}

public ObjectifyGeocellQueryEngine(Objectify ofy, String geocellsProperty) {
    this.ofy = ofy;
    this.geocellsProperty = geocellsProperty;
}

@Override
public <T> List<T> query(GeocellQuery baseQuery, List<String> geocells, Class<T> entityClass) {
    StringTokenizer st;
    int tokenNo = 0;
    Query<T> query = ofy.query(entityClass);
    if (baseQuery != null) {
        st = new StringTokenizer(baseQuery.getBaseQuery(), ",");
        while (st.hasMoreTokens()) {
            query.filter(st.nextToken(), baseQuery.getParameters().get(tokenNo++));
        }
    }
    return query.filter(geocellsProperty + " IN", geocells).list();
}
}

在此处获取数据

    Point p = new Point(24.8993714, 79.5839124);
    // Generates the list of GeoCells
    List<String> cells = GeocellManager.generateGeoCell(p);
    List<Object> params = new ArrayList<Object>();
    params.add("Movies");
    GeocellQuery baseQuery = new GeocellQuery("topic == topic", "String topic",params);
    ObjectifyGeocellQueryEngine objectifyGeocellQueryEngine = new ObjectifyGeocellQueryEngine(ofy(), "cells");
    List<NewsFeed> list = objectifyGeocellQueryEngine.query(baseQuery, cells, NewsFeed.class);
    List<NewsFeed> list2 = GeocellManager.proximitySearch(p, 10, 10000,NewsFeed.class, baseQuery, objectifyGeocellQueryEngine, GeocellManager.MAX_GEOCELL_RESOLUTION);
    System.out.println(list+" : "+list2);

现在的问题是我没有从这里得到任何结果。你们能帮我解决这个问题吗,因为我没有得到任何异常,只是得到了空列表。

【问题讨论】:

  • 我不会相信距离最近更新近两年的东西。从来没有玩过Java..所以不要听我的:)
  • 这是一个很好的问题,但您可能会在 python 中获得更多帮助(我代表自己)

标签: java google-app-engine geospatial objectify


【解决方案1】:

我已经针对这种情况做了一个解决方法,我添加了一个并行 JDO 类来存储和检索地理空间结果。

【讨论】:

  • 你能不能更新一下你是怎么做的……这对你有很大的帮助。
  • 我也面临同样的问题,但您的“答案”没有提供任何解决方案。
  • @mdarwin 我已经提出了一个解决方案,我制作了一个具有纬度、经度的 JDO 注释类,并使用 JDO 将它们持久化,因为地理空间查询与 JDO 配合得很好,所以我得到了结果。
  • 您还可以查看由 Objectify Developers 开发的应用程序 Motomapia,它还使用边界框查询来获取给定半径内的坐标。
猜你喜欢
  • 2015-07-07
  • 2019-10-25
  • 1970-01-01
  • 2017-08-04
  • 2018-06-29
  • 2018-07-28
  • 2016-06-29
  • 2011-06-06
  • 2014-07-10
相关资源
最近更新 更多