Hibernate Spatial-запрос в радиусе X километров?
Я новичок в Hibernate Spatial и пытаюсь выполнить простой запрос объектов в пределах заданного радиуса. Я создал несколько записей в своей базе данных со свойствами, соответствующими широте и долготе, используя данные из Google Maps и других источников. Это свойство определяется следующим образом в моем классе сущностей:
@Column
@Type(type = "org.hibernate.spatial.GeometryType")
private Point coordinates = null;
теперь я пытаюсь выяснить, как выполнить поиск всех объектов сущности, которые имеют координаты, которые попадают в радиус x километров от заданной точки. Например, я хотел бы найти объекты, которые попадают в радиусе 50 километров от точки (12.34567, -76.54321). Однако я не могу найти примеров или учебников, которые объясняли бы, как это сделать в Hibernate Spatial.
может ли кто-нибудь дать мне какую-либо информацию о том, как можно построить такой запрос?
1 ответов
посмотреть на этом ресурсе для учебника с "пространственными запросами", который специальный диалект и библиотека JTS (С Открытым Исходным Кодом).
в основном вы делаете следующее (копирование / вставка со ссылочной страницы):
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();
}
кроме вас всегда есть обходной путь, в котором можно добавить некоторые дополнительные поля (сопоставленные сinsertable=false, updatable=false
) для сопоставления с теми же столбцами, используемыми org.hibernate.spatial.GeometryType
и затем используйте их в своем запросе. Для вычисления расстояния, проверьте евклидово расстояние формула.