Pregunta

Soy nuevo en Hibernate Spatial y estoy intentando realizar una consulta simple de objetos dentro de un radio determinado.He creado una serie de entradas en mi base de datos con propiedades correspondientes a una latitud y longitud, utilizando datos de Google Maps y otras fuentes.Esta propiedad se define así en mi clase de Entidad:

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

Ahora estoy tratando de descubrir cómo hacer una búsqueda de todos los objetos de entidad que tienen coordenadas que se encuentran dentro de un radio de X kilómetros de un punto determinado.Por ejemplo, me gustaría encontrar objetos que se encuentren dentro de un radio de 50 kilómetros del punto (12.34567, -76.54321).Sin embargo, no puedo encontrar ningún ejemplo o tutorial que explique cómo hacer esto en Hibernate Spatial.

¿Alguien puede darme alguna información sobre cómo se puede construir una consulta como esta?

¿Fue útil?

Solución

Ver este recurso para un tutorial con "Consultas espaciales", que un dialecto especial y el biblioteca JTS (Fuente abierta).

Básicamente haces lo siguiente (copiar/pegar desde la página de referencia):

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 generar un círculo, consulte este recurso (busque "Arcos, círculos y curvas").Nuevamente copiar y pegar desde allí:

//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();
}

Además, siempre tienes la solución alternativa para agregar algunos campos adicionales (asignados coninsertable=false, updatable=false) para asignar a las mismas columnas utilizadas por el org.hibernate.spatial.GeometryType y luego utilícelos en su consulta.Para calcular la distancia, verifique el fórmula de distancia euclidiana.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top