السبات المكاني-الاستعلام داخل دائرة نصف قطرها س كيلومتر?

StackOverflow https://stackoverflow.com//questions/20026177

سؤال

أنا جديد على السبات المكاني ، وأحاول إجراء استعلام بسيط من الكائنات داخل دائرة نصف قطرها معين.لقد قمت بإنشاء عدد من الإدخالات في قاعدة البيانات الخاصة بي مع خصائص المقابلة لخطوط الطول والعرض ، وذلك باستخدام بيانات من خرائط جوجل ومصادر أخرى.يتم تعريف هذه الخاصية مثل هذا في فئة الكيان الخاص بي:

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

أحاول الآن معرفة كيفية إجراء بحث عن جميع كائنات الكيان التي لها إحداثيات تقع داخل دائرة نصف قطرها x كيلومترات من نقطة معينة.على سبيل المثال ، أود العثور على كائنات تقع ضمن دائرة نصف قطرها 50 كيلومترا من النقطة (12.34567 ، -76.54321).ومع ذلك ، لا يمكنني العثور على أي أمثلة أو برامج تعليمية تشرح كيفية القيام بذلك في السبات المكاني.

يمكن لأي شخص أن تعطيني أي معلومات حول كيفية الاستعلام مثل هذا يمكن بناؤها?

هل كانت مفيدة؟

المحلول

انظر هذا المورد للحصول على البرنامج التعليمي مع "الاستعلامات المكانية" ، والتي لهجة خاصة و مكتبة جي تي إس (المصدر المفتوح).

في الأساس تقوم بما يلي (نسخ / لصق من الصفحة المشار إليها):

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 ومن ثم استخدامها في الاستعلام الخاص بك.لحساب المسافة ، تحقق من صيغة المسافة الإقليدية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top