地理空间和Morphia附近找不到

时间:2015-08-03 09:54:41

标签: java mongodb geospatial morphia

我有以下数据库:

  

db.ItemVo.find()

     

{“_ id”:ObjectId(“55bf2b465ef98ff39dba049c”),“loc”:{“type”:   “点”,“坐标”:[ - 4.427237,36.733284]},“标题”:   “item1”,“summary”:“摘要item1”,“itemType”:“TXT”} {“_ id”:   ObjectId(“55bf2ddc5ef98ff39dba049d”),“loc”:{“type”:“Point”,   “coordinates”:[ - 3.427237,35.733284]},“title”:“item2”,   “summary”:“Summary item2”,“itemType”:“TXT”}

通过$ near:

查找
  

db.ItemVo.find({loc:{“$ near”:{“$ geometry”:{type:“Point”,   坐标:[ - 4.427,36.73]},“$ maxDistance”:20000}}})

     

{“_ id”:ObjectId(“55bf2b465ef98ff39dba049c”),“loc”:{“type”:   “点”,“坐标”:[ - 4.427237,36.733284]},“标题”:   “item1”,“summary”:“Summary item1”,“itemType”:“TXT”}

Morphia DAO:

public List<ItemVo> findByNear (){
    LOGGER.info("[ItemDAO - findByNear] - init");

    List<ItemVo> str = getDs().find(ItemVo.class).field("loc").near(-4.427, 36.73,  2000/111.12, true).asList();
    return str;
}

Morphia返回集合的所有元素,而不是$ near附近。 Morphia应该只返回元素“item1”而不是“item2”。问题在哪里?

我的对象:

@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
Public class ItemVo implements Serializable{

        private static final long serialVersionUID = 1258690003100456384L;

        @Id private String id;

        @Embedded
        private LocationVo loc;

        private String title;
        private String summary;

........

@Embedded
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class LocationVo implements Serializable{

    private static final long serialVersionUID = -5282690346503247312L;

    private String type; //POINT, etc
    private double[] coordinates;

谢谢你。

3 个答案:

答案 0 :(得分:1)

行。我跟踪了它,这很简单。出于逃避我的原因,mongo shell采用lat / long坐标,morphia采用long / lat。因此,虽然看起来就像你在morphia中忠实地重新创建查询一样,但实际上你的坐标是向后定义的。尝试交换您的值,您应该开始看到您期望的文档。

答案 1 :(得分:0)

@evanchooly不行。目前数据:

  

{“_ id”:ObjectId(“55bf2b465ef98ff39dba049c”),“loc”:{“type”:   “点”,“坐标”:[ - 4.427237,36.733284]},“标题”:   “item1”,“summary”:“摘要item1”,“itemType”:“TXT”} {“_ id”:   ObjectId(“55bf2ddc5ef98ff39dba049d”),“loc”:{“type”:“Point”,   “coordinates”:[ - 3.427237,35.733284]},“title”:“item2”,   “summary”:“Summary item2”,“itemType”:“TXT”} {“_ id”:   ObjectId(“55bf419d79711904641950e3”),“loc”:{“type”:“Point”,   “coordinates”:[ - 2.427237,36.733284]},“title”:“item3”,   “摘要”:“摘要item3”,“itemType”:“TXT”} {“_ id”:   ObjectId(“55bf74bd7971191d180d67ad”),“loc”:{“type”:“Point”,   “coordinates”:[ - 5.427237,35.733284]},“title”:“item4”,   “摘要”:“摘要item4”,“itemType”:“TXT”}

geo[0]=-4.4272;
geo[1]=36.733;

使用lat / long(如前所述)Morphia返回所有元素,尽管半径为2 / 111.12或20000 / 111.12。

如你所说,使用long / lat,Morphia返回空列表,半径为2 / 111.12到107 / 111.12。使用半径108 / 111.12返回item2和item3。半径从109 / 111.12到20000 / 111.12返回所有元素。

我不明白为什么。我想也许Morphia的查询不好,Morphia找不到“loc”,所以Morphia全部归还。我一直在搜索谷歌,查询应该没问题。

编辑:

如果我在mongo控制台中运行以下命令:

db.runCommand ( {geoNear: "ItemVo", near : [-4.427, 36.733 ] , maxDistance: 20000, spherical:true }) 

每个返回的元素都包含距离。例如:

  

{“dis”:0.00000596312302919342,“obj”:{“_ id”:   ObjectId(“55bf2b465ef98ff39dba049c”),......}}},

我不明白为什么距离值与呼叫不同:

db.ItemVo.find({loc:{"$near":{ "$geometry": {type: "Point", coordinates: [-4.427, 36.73]}, "$maxDistance": 20000}}})

答案 2 :(得分:0)

我最近解决了这个问题,并希望将解决方案提交给其他人也有同样的问题。我不知道为什么它现在有用,也许是因为我使用了更新版本的Morphia。 Mi代码:

public List<ItemVo> findItems (Double latitude, Double longitude, Double radius){
    LOGGER.info("[ItemDAO - findItems] - init");
    str = getDs().createQuery(ItemVo.class).field("loc").near(latitude, longitude,  radius/111.12, true).asList();
    return str;
}

在webservice中收到参数“radius”(整数,以千米为单位),我们在调用itemDAO.findItems之前对其进行转换:

//private static Double FORMAT_RADIUS = 0.01;

Double radius_format = radius * FORMAT_RADIUS;