我正在尝试查询mongo存储库以返回指定地理圈内的数据。我正在使用以下代码:
Page<Img> findByLocationWithin(Circle circle, Pageable pageable);
然后在我的控制器中我正在使用:
Distance distance = new Distance(7.5, Metrics.MILES);
Circle circle = new Circle(location, distance);
Page<Img> results = imgRepository.findByLocationWithin(circle, pageable);
然而,它肯定不会使用7.5英里的半径,就好像我创建了距离数据所在位置几百米的圆圈,它什么都不返回。我已经检查了mongo中的日志,并说它正在执行以下代码:
"location" : {
"$within" : {
"$center" : [
[
30.198,
-1.695
],
0.0018924144710663706
]
}
}
这意味着它没有使用$geoWithin
或$centerSphere
。我该如何解决这些问题?
答案 0 :(得分:0)
我对spring
和Couchbase
遇到了同样的问题...但是查询不是问题...因为Spring
将距离转换为几何值。
就我而言,我还返回了null
,但是我的问题得以解决,在模型类中,指定坐标[x,y]的属性必须为Library Point org.springframework.data.geo.Point;
package com.webServices.rutas.model;
import org.springframework.data.couchbase.core.mapping.id.GeneratedValue;
import org.springframework.data.couchbase.core.mapping.id.GenerationStrategy;
import org.springframework.data.geo.Point;
import com.couchbase.client.java.repository.annotation.Field;
import com.couchbase.client.java.repository.annotation.Id;
public class Parada {
@Id @GeneratedValue(strategy = GenerationStrategy.UNIQUE)
private String id;
@Field
private String type;
@Field
private String nombre;
@Field
private String urlFoto;
@Field
private Point coordenada;
public Parada(String nombre, String urlFoto, Point coordenada) {
super();
this.type = "parada";
this.nombre = nombre;
this.urlFoto = urlFoto;
this.coordenada = coordenada;
}
public Parada() {
super();
this.type = "parada";
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getUrlFoto() {
return urlFoto;
}
public void setUrlFoto(String urlFoto) {
this.urlFoto = urlFoto;
}
public Point getCoordenada() {
return coordenada;
}
public void setCoordenada(Point coordenada) {
this.coordenada = coordenada;
}
@Override
public String toString() {
return "Parada [id=" + id + ", type=" + type + ", nombre=" + nombre + ", urlFoto=" + urlFoto + ", coordenada="
+ coordenada + "]";
}
}
在服务中
public Iterable<Parada> getParadasCercanasRadio(Punto punto){
Point cuadro = new Point(-2.2,-80.9);
Circle circle = new Circle(cuadro,new Distance(300000, Metrics.KILOMETERS));
return paradaRepository.findByCoordenadaWithin(circle);
}
在存储库中:
@Dimensional(designDocument = "paradas", spatialViewName = "paradas")
Iterable<Parada> findByCoordenadaWithin(Circle p);
P.D。对不起,我的英语。