Question

Je suis nouveau à l'Hibernation Spatiale, et suis en train d'effectuer une requête simple d'objets à l'intérieur d'un rayon donné.J'ai créé un certain nombre d'entrées dans ma base de données avec des propriétés correspondant à une latitude et de longitude, en utilisant les données de Google Maps et d'autres sources.Cette propriété est définie comme ceci dans ma classe d'Entité:

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

Je vais maintenant essayer de comprendre comment faire une recherche de tous les objets de l'entité qui ont les coordonnées situées dans un rayon de x kilomètres à partir d'un point donné.Par exemple, j'aimerais trouver des objets qui se situent dans un rayon de 50 kilomètres du point (12.34567, -76.54321).Cependant, je ne peux pas trouver des exemples ou des tutoriels pour expliquer comment faire en Hibernation Spatiale.

Quelqu'un peut-il me donner des renseignements sur la façon dont une requête de ce genre peut être construit?

Était-ce utile?

La solution

Voir cette ressource pour un tutoriel avec des "Requêtes Spatiales", qui est un dialecte spécial et de l' JTS (Open Source).

Fondamentalement, vous procédez de la manière suivante (copier/coller de la page référencé):

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;
}

Pour générer un cercle, voir cette ressource (de la recherche pour "des Arcs, des Cercles et des Courbes").De nouveau un copier/coller à partir de là:

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

En outre, vous avez toujours la solution de contournement, pour y ajouter quelques champs supplémentaires ( mappé avecinsertable=false, updatable=false) à la carte pour les mêmes colonnes utilisées par les org.hibernate.spatial.GeometryType et ensuite les utiliser dans votre requête.Pour le calcul de la distance, vérifier la la formule de la distance de.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top