FindByLocationWithin的问题

时间:2015-10-16 13:02:30

标签: spring mongodb

我正在尝试查询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。我该如何解决这些问题?

1 个答案:

答案 0 :(得分:0)

我对springCouchbase遇到了同样的问题...但是查询不是问题...因为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。对不起,我的英语。