Вопрос

Я новичок в спящем пространстве, и пытаюсь выполнить простое запрос объектов в данном радиусе.Я создал ряд записей в моей базе данных со свойствами, соответствующими широты и долготы, используя данные из Google Maps и других источников.Это свойство определяется как это в моем классе сущности:

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

Теперь я пытаюсь выяснить, как сделать поиск всех объектов объектов, которые имеют координаты, которые попадают в радиус X километров из данной точки.Например, я хотел бы найти объекты, которые падают в радиусе 50 километров точки (12.34567, -76.54321).Тем не менее, я не могу найти какие-либо примеры или учебные пособия, которые объяснят, как это сделать в Spatial Spatial.

Может ли кто-нибудь дать мне любую информацию о том, как можно построить запрос?

Это было полезно?

Решение

см. Этот ресурс для учебника с "пространственным Запросы ", которые специальный диалект и jts library (открытый источник).

В основном вы делаете следующее (копирование / вставку с ссылки на ссылку):

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

Для генерации круга см., см. Этот ресурс (поиск Для «дугов, кругов и кривых»). Снова копию / паста оттуда:

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

Кроме того, у вас всегда есть обходной путь, в котором добавить некоторые дополнительные поля (сопоставленные сгенеракодицетагкод), чтобы отобразить то же столбцы, используемые генеракодицетагкодом, а затем использовать их в вашем запросе. Для вычисления расстояния, проверьте Евклидианская дистанция расстояния .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top