Hibernate Spatial - Xキロメートル半径内のクエリ
-
21-12-2019 - |
質問
Hibernate Spatialには新しく、特定の半径内のオブジェクトの単純なクエリを実行しようとしています。Googleマップやその他の情報源からのデータを使用して、緯度と経度に対応するプロパティを使用して、データベースにいくつかのエントリを作成しました。このプロパティは、私のエンティティクラスのように定義されています:
@Column
@Type(type = "org.hibernate.spatial.GeometryType")
private Point coordinates = null;
.
私は、特定のポイントから x キロメートルの半径内にある座標を持つすべてのエンティティオブジェクトの検索方法を見つけようとしています。たとえば、ポイントの50キロメートルの半径に入るオブジェクト(12.34567、-76.54321)を見つけたいと思います。ただし、Hibernate Spatialでこれを行う方法を説明する任意の例やチュートリアルが見つかりません。
誰もがこのようなクエリを構築する方法に関する情報を私に与えてもらえますか?
解決
このリソース を "Spatial)特別な方言と 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
とマッピングする)という回避策があります。距離を計算するには、ユークリッド距離式
所属していません StackOverflow