Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Objectify进行地理空间半径搜索_Java_Google App Engine_Geospatial_Objectify - Fatal编程技术网

Java 使用Objectify进行地理空间半径搜索

Java 使用Objectify进行地理空间半径搜索,java,google-app-engine,geospatial,objectify,Java,Google App Engine,Geospatial,Objectify,我正在使用开发一个应用程序。我需要根据给定的纬度和经度在特定半径内执行搜索。我能够使用Objectify在数据存储中生成地理单元,但无法返回特定半径内的结果 我在下面分享我的代码 实体类 @Entity public class NewsFeed implements Serializable { private static final long serialVersionUID = 1L; @Id @Index private Long feedID; @Index private Stri

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

我在下面分享我的代码

实体类

@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 ...
}
@实体
公共类NewsFeed实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@索引
私人长feedID;
@索引
私有字符串主题;
@索引
私有字符串标题;
私有字符串描述;
@索引
私人日期;
私有字符串图像或视频;
私有字符串imageUrl;
私有字符串blobKey;
@纬度
私人双纬度;
@经度
私人双经度;
@土工格室
私有列表单元;
//盖特和塞特。。。
}
自定义GeocellQueryEngine类

公共类ObjectifyGeocellQueryEngine实现GeocellQueryEngine{
私有字符串GeoCells属性;
私人客体化;
公共静态最终字符串DEFAULT\u GEOCELLS\u PROPERTY=“cells”;
公共对象GeoCellQueryEngine(对象化ofy){
这(ofy,默认的地理单元属性);
}
公共对象GeoCellQueryEngine(Y的对象化,字符串geocellsProperty){
这个。of y=of y;
this.geocell属性=geocell属性;
}
@凌驾
公共列表查询(GeocellQuery baseQuery、列表geocells、类entityClass){
StringTokenizer st;
int-tokenNo=0;
Query=ofy.Query(entityClass);
if(baseQuery!=null){
st=新的StringTokenizer(baseQuery.getBaseQuery(),“,”);
而(st.hasMoreTokens()){
filter(st.nextToken(),baseQuery.getParameters().get(tokenNo++));
}
}
返回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);
p点=新点(24.8993714,79.5839124);
//生成地理单元列表
列表单元=GeocellManager.generateGeoCell(p);
List params=new ArrayList();
参数添加(“电影”);
GeocellQuery baseQuery=新的GeocellQuery(“主题==主题”,“字符串主题”,参数);
ObjectifyGeocellQueryEngine ObjectifyGeocellQueryEngine=新的ObjectifyGeocellQueryEngine(ofy(),“单元格”);
List List=objectifyGeocellQueryEngine.query(baseQuery,cells,NewsFeed.class);
List list2=GeocellManager.proximitySearch(p,10,10000,NewsFeed.class,baseQuery,objectifyGeocellQueryEngine,GeocellManager.MAX\u GEOCELL\u RESOLUTION);
System.out.println(list+“:”+list2);

现在的问题是我没有从这里得到任何结果。请大家帮我解决这个问题,因为我没有得到任何例外,只是得到了一个空列表。

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

我不相信自最新更新以来将近两年的东西。从未玩过Java。。所以不要听我说:)这是一个很好的问题,但你可能会在python中得到更多的帮助(我为自己说话ie)你能更新一下你是如何做到的吗。。。这将是您方面的巨大帮助。我也面临同样的问题,但您的“答案”没有提供解决方案。@mdarwin我提出了一个变通解决方案,我创建了一个JDO注释类,该类具有纬度和经度,并使用JDO作为地理空间查询对JDO进行了持久化,所以我得到了结果。你也可以看看由Objectify开发者开发的应用程序Motomapia,它还使用边界框查询来获取给定半径内的坐标。
    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);