附近找不到地理空间和Morphia
Geospatial and Morphia not find by near
我有以下数据库:
db.ItemVo.find()
{ "_id" : ObjectId("55bf2b465ef98ff39dba049c"), "loc" : { "type" :
"Point", "coordinates" : [ -4.427237, 36.733284 ] }, "title" :
"item1", "summary" : "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",
coordinates: [-4.427, 36.73]}, "$maxDistance": 20000}}})
{ "_id" : ObjectId("55bf2b465ef98ff39dba049c"), "loc" : { "type" :
"Point", "coordinates" : [ -4.427237, 36.733284 ] }, "title" :
"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 return集合中的所有元素,$near 未找到。 Morphia 应该 return 只有元素 "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;
谢谢。
好的。我已经找到了它,它很简单。出于我不理解的原因,mongo shell 在 lat/long 中获取坐标,而吗啡在 long/lat 中获取坐标。因此,虽然它 看起来 就像您忠实地在吗啡中重新创建查询,但实际上您的坐标是倒着定义的。尝试交换您的价值观,您应该会开始看到您期望的文档。
@evanchooly 不工作。当前数据:
{ "_id" : ObjectId("55bf2b465ef98ff39dba049c"), "loc" : { "type" :
"Point", "coordinates" : [ -4.427237, 36.733284 ] }, "title" :
"item1", "summary" : "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",
"summary" : "Summary item3", "itemType" : "TXT"} { "_id" :
ObjectId("55bf74bd7971191d180d67ad"), "loc" : { "type" : "Point",
"coordinates" : [ -5.427237, 35.733284 ] }, "title" : "item4",
"summary" : "Summary item4", "itemType" : "TXT"}
geo[0]=-4.4272;
geo[1]=36.733;
与lat/long(和以前一样)Morphia returns所有元素,尽管半径为2/111.12 或20000/111.12。
如您所说 long/lat,Morphia returns 空列表,半径从 2/111.12 到 107/111.12。半径为 108/111.12 returns item2 和 item3。半径从 109/111.12 到 20000/111.12 returns 所有元素。
我不明白为什么。我想可能是Morphia的查询不好,Morphia没有找到"loc",所以Morphia returns全部。我一直在搜索 google,查询应该没问题。
编辑:
如果我 运行 在 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}}})
我最近解决了它,想把解决方案提供给其他有同样问题的人。我不知道为什么它现在可以工作了,也许是因为我使用了更新版本的 Morphia。小米码:
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;
我有以下数据库:
db.ItemVo.find()
{ "_id" : ObjectId("55bf2b465ef98ff39dba049c"), "loc" : { "type" : "Point", "coordinates" : [ -4.427237, 36.733284 ] }, "title" : "item1", "summary" : "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", coordinates: [-4.427, 36.73]}, "$maxDistance": 20000}}})
{ "_id" : ObjectId("55bf2b465ef98ff39dba049c"), "loc" : { "type" : "Point", "coordinates" : [ -4.427237, 36.733284 ] }, "title" : "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 return集合中的所有元素,$near 未找到。 Morphia 应该 return 只有元素 "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;
谢谢。
好的。我已经找到了它,它很简单。出于我不理解的原因,mongo shell 在 lat/long 中获取坐标,而吗啡在 long/lat 中获取坐标。因此,虽然它 看起来 就像您忠实地在吗啡中重新创建查询,但实际上您的坐标是倒着定义的。尝试交换您的价值观,您应该会开始看到您期望的文档。
@evanchooly 不工作。当前数据:
{ "_id" : ObjectId("55bf2b465ef98ff39dba049c"), "loc" : { "type" : "Point", "coordinates" : [ -4.427237, 36.733284 ] }, "title" : "item1", "summary" : "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", "summary" : "Summary item3", "itemType" : "TXT"} { "_id" : ObjectId("55bf74bd7971191d180d67ad"), "loc" : { "type" : "Point", "coordinates" : [ -5.427237, 35.733284 ] }, "title" : "item4", "summary" : "Summary item4", "itemType" : "TXT"}
geo[0]=-4.4272;
geo[1]=36.733;
与lat/long(和以前一样)Morphia returns所有元素,尽管半径为2/111.12 或20000/111.12。
如您所说 long/lat,Morphia returns 空列表,半径从 2/111.12 到 107/111.12。半径为 108/111.12 returns item2 和 item3。半径从 109/111.12 到 20000/111.12 returns 所有元素。
我不明白为什么。我想可能是Morphia的查询不好,Morphia没有找到"loc",所以Morphia returns全部。我一直在搜索 google,查询应该没问题。
编辑:
如果我 运行 在 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}}})
我最近解决了它,想把解决方案提供给其他有同样问题的人。我不知道为什么它现在可以工作了,也许是因为我使用了更新版本的 Morphia。小米码:
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;