Pergunta

Eu sou novo para o modo de Hibernação Espacial, e estou tentando executar uma simples consulta de objetos dentro de um determinado raio.Eu criei um número de entradas no meu banco de dados com propriedades que correspondem a uma latitude e longitude, utilizando dados do Google Maps e outras fontes.Esta propriedade está definida como este em minha Entidade de classe:

@Column
@Type(type = "org.hibernate.spatial.GeometryType")
private Point coordinates = null;

Agora estou tentando descobrir como fazer uma pesquisa de todos os objetos de entidade que tem coordenadas que estejam dentro de um raio de x km a partir de um determinado ponto.Por exemplo, eu gostaria de encontrar objetos que caem dentro de um 50 quilômetros de raio do ponto (12.34567, -76.54321).No entanto, eu não consigo encontrar nenhum exemplo ou tutoriais que explicarão como fazer isso no Hibernate Espacial.

Alguém pode me dar alguma informação sobre como uma consulta como esta pode ser construído?

Foi útil?

Solução

Ver este recurso para um tutorial com "Consultas Espaciais", que um especial dialeto e o STC biblioteca (Open Source).

Basicamente você fizer o seguinte (copiar/colar a partir da referenciada página):

import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
import util.JPAUtil;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.Date;
import java.util.List;

.......

private List find(String wktFilter) {
    Geometry filter = wktToGeometry(wktFilter);
    EntityManager em = JPAUtil.createEntityManager();
    em.getTransaction().begin();
    Query query = em.createQuery("select e from Event e where within(e.location, :filter) = true", Event.class);
    query.setParameter("filter", filter);
    return query.getResultList();
}

private Geometry wktToGeometry(String wktPoint) {
    WKTReader fromText = new WKTReader();
    Geometry geom = null;
    try {
        geom = fromText.read(wktPoint);
    } catch (ParseException e) {
        throw new RuntimeException("Not a WKT string:" + wktPoint);
    }
    return geom;
}

Para a geração de um círculo, ver este recurso (procure por "Arcos, Círculos e Curvas").Novamente um copiar/colar a partir daí:

//this method replaces the above wktToGeometry() method
private static Geometry createCircle(double x, double y, final double RADIUS) {
  GeometricShapeFactory shapeFactory = new GeometricShapeFactory();
  shapeFactory.setNumPoints(32);
  shapeFactory.setCentre(new Coordinate(x, y));//there are your coordinates
  shapeFactory.setSize(RADIUS * 2);//this is how you set the radius
  return shapeFactory.createCircle();
}

Além disso, você sempre tem a solução, para adicionar alguns campos adicionais ( mapeada cominsertable=false, updatable=false) para mapear para a mesma colunas utilizadas pelo org.hibernate.spatial.GeometryType e, em seguida, usá-los em sua consulta.Para calcular a distância, verifique o a fórmula da distância euclidiana.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top